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

Reply via email to