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

Reply via email to