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 -- [email protected]
To unsubscribe send an email to [email protected]