Changeset: 8fe85e143ade for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/8fe85e143ade
Modified Files:
        gdk/gdk_bbp.c
Branch: Jul2021
Log Message:

Fix race between BBPmanager and BBPsync.
The race was introduced in the previous changeset.


diffs (79 lines):

diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c
--- a/gdk/gdk_bbp.c
+++ b/gdk/gdk_bbp.c
@@ -2812,13 +2812,13 @@ decref(bat i, bool logical, bool release
 int
 BBPunfix(bat i)
 {
-       return decref(i, false, false, true, "BBPunfix");
+       return decref(i, false, false, true, __func__);
 }
 
 int
 BBPrelease(bat i)
 {
-       return decref(i, true, false, true, "BBPrelease");
+       return decref(i, true, false, true, __func__);
 }
 
 /*
@@ -2845,15 +2845,15 @@ BBPkeepref(bat i)
                }
 
                assert(BBP_refs(i));
-               decref(i, false, false, lock, "BBPkeepref");
+               decref(i, false, false, lock, __func__);
        }
 }
 
 static inline void
 GDKunshare(bat parent)
 {
-       (void) decref(parent, false, true, true, "GDKunshare");
-       (void) decref(parent, true, false, true, "GDKunshare");
+       (void) decref(parent, false, true, true, __func__);
+       (void) decref(parent, true, false, true, __func__);
 }
 
 void
@@ -2883,7 +2883,7 @@ BBPreclaim(BAT *b)
 
        assert(BBP_refs(i) == 1);
 
-       return decref(i, false, false, lock, "BBPreclaim") <0;
+       return decref(i, false, false, lock, __func__) <0;
 }
 
 /*
@@ -3125,7 +3125,7 @@ dirty_bat(bat *i, bool subcommit)
                if (b != NULL) {
                        if ((BBP_status(*i) & BBPNEW) &&
                            BATcheckmodes(b, false) != GDK_SUCCEED) /* check 
mmap modes */
-                               *i = 0; /* error */
+                               *i = -*i;       /* error */
                        if ((BBP_status(*i) & BBPPERSISTENT) &&
                            (subcommit || BATdirty(b)))
                                return b;       /* the bat is loaded, 
persistent and dirty */
@@ -3642,9 +3642,12 @@ BBPsync(int cnt, bat *restrict subcommit
                        BUN size = sizes ? sizes[idx] : BUN_NONE;
                        BATiter bi;
 
+                       /* add a fix so that BBPmanager doesn't interfere */
+                       BBPfix(i);
                        if (BBP_status(i) & BBPPERSISTENT) {
                                BAT *b = dirty_bat(&i, subcommit != NULL);
                                if (i <= 0) {
+                                       decref(-i, false, false, locked_by == 0 
|| locked_by != MT_getpid(), __func__);
                                        break;
                                }
                                bi = bat_iterator(BBP_desc(i));
@@ -3679,6 +3682,9 @@ BBPsync(int cnt, bat *restrict subcommit
                                n = BBPdir_step(i, size, n, buf, sizeof(buf), 
&obbpf, nbbpf, subcommit != NULL, &bi);
                        }
                        bat_iterator_end(&bi);
+                       /* can't use BBPunfix because of the "lock"
+                        * argument: locked_by may be set here */
+                       decref(i, false, false, locked_by == 0 || locked_by != 
MT_getpid(), __func__);
                        if (n == -2)
                                break;
                        /* we once again have a saved heap */
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to