Changeset: 1d034c70950b for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/1d034c70950b
Modified Files:
clients/Tests/exports.stable.out
gdk/gdk_bat.c
gdk/gdk_bbp.c
gdk/gdk_bbp.h
gdk/gdk_private.h
gdk/gdk_tm.c
Branch: Jul2021
Log Message:
Make sure status checking/handling in TM epilogue is locked.
diffs (159 lines):
diff --git a/clients/Tests/exports.stable.out b/clients/Tests/exports.stable.out
--- a/clients/Tests/exports.stable.out
+++ b/clients/Tests/exports.stable.out
@@ -207,7 +207,6 @@ gdk_return BATupdate(BAT *b, BAT *p, BAT
gdk_return BATupdatepos(BAT *b, const oid *positions, BAT *n, bool autoincr,
bool force) __attribute__((__warn_unused_result__));
BBPrec *BBP[N_BBPINIT];
gdk_return BBPaddfarm(const char *dirname, uint32_t rolemask, bool logerror);
-void BBPclear(bat bid);
void BBPcold(bat i);
BAT *BBPdescriptor(bat b);
int BBPfix(bat b);
diff --git a/gdk/gdk_bat.c b/gdk/gdk_bat.c
--- a/gdk/gdk_bat.c
+++ b/gdk/gdk_bat.c
@@ -148,7 +148,7 @@ BATcreatedesc(oid hseq, int tt, bool hea
bn->batDirtydesc = true;
return bn;
bailout:
- BBPclear(bn->batCacheid);
+ BBPclear(bn->batCacheid, true);
if (bn->theap)
HEAPdecref(bn->theap, true);
if (bn->tvheap)
@@ -293,7 +293,7 @@ COLnew_intern(oid hseq, int tt, BUN cap,
TRC_DEBUG(ALGO, "-> " ALGOBATFMT "\n", ALGOBATPAR(bn));
return bn;
bailout:
- BBPclear(bn->batCacheid);
+ BBPclear(bn->batCacheid, true);
if (bn->theap)
HEAPdecref(bn->theap, true);
if (bn->tvheap)
diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c
--- a/gdk/gdk_bbp.c
+++ b/gdk/gdk_bbp.c
@@ -2034,12 +2034,12 @@ bbpclear(bat i, int idx, bool lock)
TRC_DEBUG(BAT_, "clear %d (%s)\n", (int) i, BBP_logical(i));
BBPuncacheit(i, true);
TRC_DEBUG(BAT_, "set to unloading %d\n", i);
+ if (lock)
+ MT_lock_set(&GDKcacheLock(idx));
+
BBP_status_set(i, BBPUNLOADING);
BBP_refs(i) = 0;
BBP_lrefs(i) = 0;
- if (lock)
- MT_lock_set(&GDKcacheLock(idx));
-
if (!BBPtmpcheck(BBP_logical(i))) {
MT_lock_set(&BBPnameLock);
BBP_delete(i);
@@ -2056,11 +2056,11 @@ bbpclear(bat i, int idx, bool lock)
}
void
-BBPclear(bat i)
+BBPclear(bat i, bool lock)
{
MT_Id pid = MT_getpid();
- bool lock = locked_by == 0 || locked_by != pid;
-
+
+ lock &= locked_by == 0 || locked_by != pid;
if (BBPcheck(i)) {
bbpclear(i, threadmask(pid), lock);
}
@@ -2686,7 +2686,7 @@ BBPdestroy(BAT *b)
}
BATdelete(b); /* handles persistent case also (file deletes)
*/
}
- BBPclear(b->batCacheid); /* if destroyed; de-register from BBP */
+ BBPclear(b->batCacheid, true); /* if destroyed; de-register from BBP */
/* parent released when completely done with child */
if (tp)
@@ -3628,7 +3628,7 @@ getdesc(bat bid)
if (bid < (bat) ATOMIC_GET(&BBPsize) && BBP_logical(bid))
b = BBP_desc(bid);
if (b == NULL)
- BBPclear(bid);
+ BBPclear(bid, true);
return b;
}
diff --git a/gdk/gdk_bbp.h b/gdk/gdk_bbp.h
--- a/gdk/gdk_bbp.h
+++ b/gdk/gdk_bbp.h
@@ -64,7 +64,6 @@ gdk_export lng getBBPtransid(void);
gdk_export gdk_return BBPaddfarm(const char *dirname, uint32_t rolemask, bool
logerror);
/* update interface */
-gdk_export void BBPclear(bat bid);
gdk_export int BBPreclaim(BAT *b);
gdk_export gdk_return BBPsave(BAT *b);
gdk_export int BBPrename(bat bid, const char *nme);
diff --git a/gdk/gdk_private.h b/gdk/gdk_private.h
--- a/gdk/gdk_private.h
+++ b/gdk/gdk_private.h
@@ -92,6 +92,8 @@ ValPtr BATsetprop_nolock(BAT *b, enum pr
gdk_return BBPcacheit(BAT *bn, bool lock)
__attribute__((__warn_unused_result__))
__attribute__((__visibility__("hidden")));
+void BBPclear(bat bid, bool lock)
+ __attribute__((__visibility__("hidden")));
void BBPdump(void) /* never called: for debugging only */
__attribute__((__cold__));
void BBPexit(void)
diff --git a/gdk/gdk_tm.c b/gdk/gdk_tm.c
--- a/gdk/gdk_tm.c
+++ b/gdk/gdk_tm.c
@@ -78,7 +78,7 @@ prelude(int cnt, bat *restrict subcommit
* destroyed.
*/
static void
-epilogue(int cnt, bat *subcommit)
+epilogue(int cnt, bat *subcommit, bool locked)
{
int i = 0;
@@ -105,6 +105,8 @@ epilogue(int cnt, bat *subcommit)
TRC_WARNING(GDK, "BATcheckmodes
failed\n");
}
}
+ if (!locked)
+ MT_lock_set(&GDKswapLock(bid));
if ((BBP_status(bid) & BBPDELETED) && BBP_refs(bid) <= 0 &&
BBP_lrefs(bid) <= 0) {
BAT *b = BBPquickdesc(bid);
@@ -113,9 +115,11 @@ epilogue(int cnt, bat *subcommit)
if (b) {
BATdelete(b);
}
- BBPclear(bid); /* clear with locking */
+ BBPclear(bid, false);
}
BBP_status_off(bid, BBPDELETED | BBPSWAPPED | BBPNEW);
+ if (!locked)
+ MT_lock_unset(&GDKswapLock(bid));
}
GDKclrerr();
}
@@ -134,7 +138,7 @@ TMcommit(void)
BBPlock();
if (prelude(getBBPsize(), NULL, NULL) == GDK_SUCCEED &&
BBPsync(getBBPsize(), NULL, NULL, getBBPlogno(), getBBPtransid())
== GDK_SUCCEED) {
- epilogue(getBBPsize(), NULL);
+ epilogue(getBBPsize(), NULL, true);
ret = GDK_SUCCEED;
}
BBPunlock();
@@ -202,7 +206,7 @@ TMsubcommit_list(bat *restrict subcommit
/* lock just prevents other global (sub-)commits */
MT_lock_set(&GDKtmLock);
if (BBPsync(cnt, subcommit, sizes, logno, transid) ==
GDK_SUCCEED) { /* write BBP.dir (++) */
- epilogue(cnt, subcommit);
+ epilogue(cnt, subcommit, false);
ret = GDK_SUCCEED;
}
MT_lock_unset(&GDKtmLock);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list