Changeset: 09090099cba2 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB/rev/09090099cba2 Modified Files: gdk/gdk_bat.c gdk/gdk_bbp.c gdk/gdk_private.h gdk/gdk_tm.c gdk/gdk_utils.c Branch: Jul2021 Log Message:
Backport of changes to also use external lock file. See changeset 626fb8b0daa2. diffs (245 lines): diff --git a/gdk/gdk_bat.c b/gdk/gdk_bat.c --- a/gdk/gdk_bat.c +++ b/gdk/gdk_bat.c @@ -2222,7 +2222,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); @@ -2243,7 +2243,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 @@ -270,15 +270,37 @@ static volatile MT_Id locked_by = 0; static int BBPunloadCnt = 0; static MT_Lock GDKunloadLock = MT_LOCK_INITIALIZER(GDKunloadLock); +/* GDKtmLock protects all accesses and changes to BAKDIR and SUBDIR + * must use BBPtmlock()/BBPtmunlock() to set/unset the lock */ +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); } @@ -295,7 +317,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++) @@ -315,7 +337,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 @@ -1186,7 +1208,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; @@ -1212,7 +1234,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)" : ""); } @@ -1279,11 +1301,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; } @@ -1291,7 +1313,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; } @@ -1300,7 +1322,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; } @@ -1309,7 +1331,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; } @@ -1319,7 +1341,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; } @@ -1330,14 +1352,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; } @@ -1351,7 +1373,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) @@ -1361,14 +1383,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 */ @@ -1418,9 +1440,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) { TRC_CRITICAL(GDK, "cannot properly prepare process %s.", BAKDIR); GDKdebug = dbg; diff --git a/gdk/gdk_private.h b/gdk/gdk_private.h --- a/gdk/gdk_private.h +++ b/gdk/gdk_private.h @@ -452,7 +452,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 @@ -1324,9 +1324,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