Changeset: 569ff7955154 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/569ff7955154 Modified Files: gdk/gdk_bat.c gdk/gdk_bbp.c gdk/gdk_private.h gdk/gdk_tm.c gdk/gdk_utils.c Branch: Jan2022 Log Message:
Merge with Jul2021 branch. diffs (267 lines): diff --git a/gdk/gdk_bat.c b/gdk/gdk_bat.c --- a/gdk/gdk_bat.c +++ b/gdk/gdk_bat.c @@ -2200,7 +2200,7 @@ backup_new(Heap *hp, bool lock) if (batpath != NULL && bakpath != NULL) { /* file actions here interact with the global commits */ if (lock) - MT_lock_set(&GDKtmLock); + BBPtmlock(); batret = MT_stat(batpath, &st); bakret = MT_stat(bakpath, &st); @@ -2221,7 +2221,7 @@ backup_new(Heap *hp, bool lock) ret = 0; } if (lock) - MT_lock_unset(&GDKtmLock); + BBPtmunlock(); } GDKfree(batpath); GDKfree(bakpath); diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c --- a/gdk/gdk_bbp.c +++ b/gdk/gdk_bbp.c @@ -282,18 +282,6 @@ static int BBPunloadCnt = 0; static MT_Lock GDKunloadLock = MT_LOCK_INITIALIZER(GDKunloadLock); void -BBPtmlock(void) -{ - MT_lock_set(&GDKtmLock); -} - -void -BBPtmunlock(void) -{ - MT_lock_unset(&GDKtmLock); -} - -void BBPlock(void) { int i; @@ -306,7 +294,7 @@ BBPlock(void) MT_lock_set(&GDKunloadLock); } - MT_lock_set(&GDKtmLock); + BBPtmlock(); for (i = 0; i <= BBP_THREADMASK; i++) MT_lock_set(&GDKcacheLock(i)); for (i = 0; i <= BBP_BATMASK; i++) @@ -326,7 +314,7 @@ BBPunlock(void) for (i = BBP_THREADMASK; i >= 0; i--) MT_lock_unset(&GDKcacheLock(i)); locked_by = 0; - MT_lock_unset(&GDKtmLock); + BBPtmunlock(); } static gdk_return @@ -1459,7 +1447,7 @@ BBPtrim(bool aggressive) flag |= BBPHOT; for (bat bid = 1, nbat = (bat) ATOMIC_GET(&BBPsize); bid < nbat; bid++) { /* don't do this during a (sub)commit */ - MT_lock_set(&GDKtmLock); + BBPtmlock(); MT_lock_set(&GDKswapLock(bid)); BAT *b = NULL; bool swap = false; @@ -1485,7 +1473,7 @@ BBPtrim(bool aggressive) GDKerror("unload failed for bat %d", bid); n++; } - MT_lock_unset(&GDKtmLock); + BBPtmunlock(); } TRC_DEBUG(BAT_, "unloaded %d bats%s\n", n, aggressive ? " (also hot)" : ""); } @@ -1558,11 +1546,11 @@ BBPinit(bool first) if (!GDKinmemory(0)) { str bbpdirstr, backupbbpdirstr; - MT_lock_set(&GDKtmLock); + BBPtmlock(); if (!(bbpdirstr = GDKfilepath(0, BATDIR, "BBP", "dir"))) { TRC_CRITICAL(GDK, "GDKmalloc failed\n"); - MT_lock_unset(&GDKtmLock); + BBPtmunlock(); GDKdebug = dbg; return GDK_FAIL; } @@ -1570,7 +1558,7 @@ BBPinit(bool first) if (!(backupbbpdirstr = GDKfilepath(0, BAKDIR, "BBP", "dir"))) { GDKfree(bbpdirstr); TRC_CRITICAL(GDK, "GDKmalloc failed\n"); - MT_lock_unset(&GDKtmLock); + BBPtmunlock(); GDKdebug = dbg; return GDK_FAIL; } @@ -1579,7 +1567,7 @@ BBPinit(bool first) GDKfree(bbpdirstr); GDKfree(backupbbpdirstr); TRC_CRITICAL(GDK, "cannot remove directory %s\n", TEMPDIR); - MT_lock_unset(&GDKtmLock); + BBPtmunlock(); GDKdebug = dbg; return GDK_FAIL; } @@ -1588,7 +1576,7 @@ BBPinit(bool first) GDKfree(bbpdirstr); GDKfree(backupbbpdirstr); TRC_CRITICAL(GDK, "cannot remove directory %s\n", DELDIR); - MT_lock_unset(&GDKtmLock); + BBPtmunlock(); GDKdebug = dbg; return GDK_FAIL; } @@ -1598,7 +1586,7 @@ BBPinit(bool first) GDKfree(bbpdirstr); GDKfree(backupbbpdirstr); TRC_CRITICAL(GDK, "cannot properly recover_subdir process %s.", SUBDIR); - MT_lock_unset(&GDKtmLock); + BBPtmunlock(); GDKdebug = dbg; return GDK_FAIL; } @@ -1609,14 +1597,14 @@ BBPinit(bool first) if (recover_dir(0, MT_stat(bbpdirstr, &st) == 0) != GDK_SUCCEED) { GDKfree(bbpdirstr); GDKfree(backupbbpdirstr); - MT_lock_unset(&GDKtmLock); + BBPtmunlock(); goto bailout; } if ((fp = GDKfilelocate(0, "BBP", "r", "dir")) == NULL) { GDKfree(bbpdirstr); GDKfree(backupbbpdirstr); TRC_CRITICAL(GDK, "cannot open recovered BBP.dir."); - MT_lock_unset(&GDKtmLock); + BBPtmunlock(); GDKdebug = dbg; return GDK_FAIL; } @@ -1630,7 +1618,7 @@ BBPinit(bool first) if (BBPdir_init() != GDK_SUCCEED) { GDKfree(bbpdirstr); GDKfree(backupbbpdirstr); - MT_lock_unset(&GDKtmLock); + BBPtmunlock(); goto bailout; } } else if (GDKmove(0, BATDIR, "BBP", "bak", BATDIR, "BBP", "dir", true) == GDK_SUCCEED) @@ -1640,14 +1628,14 @@ BBPinit(bool first) GDKsyserror("cannot open BBP.dir"); GDKfree(bbpdirstr); GDKfree(backupbbpdirstr); - MT_lock_unset(&GDKtmLock); + BBPtmunlock(); goto bailout; } } assert(fp != NULL); GDKfree(bbpdirstr); GDKfree(backupbbpdirstr); - MT_lock_unset(&GDKtmLock); + BBPtmunlock(); } /* scan the BBP.dir to obtain current size */ @@ -1704,9 +1692,9 @@ BBPinit(bool first) /* will call BBPrecover if needed */ if (!GDKinmemory(0)) { - MT_lock_set(&GDKtmLock); + BBPtmlock(); gdk_return rc = BBPprepare(false); - MT_lock_unset(&GDKtmLock); + BBPtmunlock(); if (rc != GDK_SUCCEED) { #ifdef GDKLIBRARY_HASHASH GDKfree(hashbats); @@ -4772,3 +4760,40 @@ BBPcallbacks(void) } MT_lock_unset(&GDKCallbackListLock); } + +/* GDKtmLock protects all accesses and changes to BAKDIR and SUBDIR. + * MUST use BBPtmlock()/BBPtmunlock() to set/unset the lock. + * + * This is at the end of the file on purpose: we don't want people to + * accidentally use GDKtmLock directly. */ +static MT_Lock GDKtmLock = MT_LOCK_INITIALIZER(GDKtmLock); +static char *lockfile; +static int lockfd; + +void +BBPtmlock(void) +{ + MT_lock_set(&GDKtmLock); + if (GDKinmemory(0)) + return; + /* also use an external lock file to synchronize with external + * programs */ + if (lockfile == NULL) { + lockfile = GDKfilepath(0, NULL, ".tm_lock", NULL); + if (lockfile == NULL) + return; + } + lockfd = MT_lockf(lockfile, F_LOCK); +} + +void +BBPtmunlock(void) +{ + if (lockfile && lockfd >= 0) { + assert(!GDKinmemory(0)); + MT_lockf(lockfile, F_ULOCK); + close(lockfd); + lockfd = -1; + } + MT_lock_unset(&GDKtmLock); +} diff --git a/gdk/gdk_private.h b/gdk/gdk_private.h --- a/gdk/gdk_private.h +++ b/gdk/gdk_private.h @@ -472,7 +472,6 @@ extern size_t GDK_mmap_minsize_persisten extern size_t GDK_mmap_minsize_transient; /* size after which we use memory mapped files for transient heaps */ extern size_t GDK_mmap_pagesize; /* mmap granularity */ extern MT_Lock GDKthreadLock; -extern MT_Lock GDKtmLock; #define BATcheck(tst, err) \ do { \ diff --git a/gdk/gdk_tm.c b/gdk/gdk_tm.c --- a/gdk/gdk_tm.c +++ b/gdk/gdk_tm.c @@ -202,12 +202,12 @@ TMsubcommit_list(bat *restrict subcommit } } /* lock just prevents other global (sub-)commits */ - MT_lock_set(&GDKtmLock); + BBPtmlock(); if (BBPsync(cnt, subcommit, sizes, logno, transid) == GDK_SUCCEED) { /* write BBP.dir (++) */ epilogue(cnt, subcommit, false); ret = GDK_SUCCEED; } - MT_lock_unset(&GDKtmLock); + BBPtmunlock(); return ret; } diff --git a/gdk/gdk_utils.c b/gdk/gdk_utils.c --- a/gdk/gdk_utils.c +++ b/gdk/gdk_utils.c @@ -1334,9 +1334,6 @@ GDKexit(int status) batlock_t GDKbatLock[BBP_BATMASK + 1]; MT_Lock GDKthreadLock = MT_LOCK_INITIALIZER(GDKthreadLock); -/* GDKtmLock protects all accesses and changes to BAKDIR and SUBDIR */ -MT_Lock GDKtmLock = MT_LOCK_INITIALIZER(GDKtmLock); - /* * @+ Concurrency control * Concurrency control requires actions at several levels of the _______________________________________________ checkin-list mailing list -- checkin-list@monetdb.org To unsubscribe send an email to checkin-list-le...@monetdb.org