Changeset: 01e81e1fe0f7 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/01e81e1fe0f7
Branch: Jul2021
Log Message:

merged


diffs (235 lines):

diff --git a/gdk/gdk_bat.c b/gdk/gdk_bat.c
--- a/gdk/gdk_bat.c
+++ b/gdk/gdk_bat.c
@@ -1326,6 +1326,7 @@ BUNinplacemulti(BAT *b, const oid *posit
                         BATgetId(b));
                return GDK_FAIL;
        }
+       MT_rwlock_wrlock(&b->thashlock);
        for (BUN i = 0; i < count; i++) {
                BUN p = autoincr ? positions[0] - b->hseqbase + i : 
positions[i] - b->hseqbase;
                const void *t = b->ttype && b->tvarsized ?
@@ -1393,7 +1394,6 @@ BUNinplacemulti(BAT *b, const oid *posit
                OIDXdestroy(b);
                IMPSdestroy(b);
 
-               MT_rwlock_wrlock(&b->thashlock);
                HASHdelete_locked(b, p, val);   /* first delete old value from 
hash */
                if (b->tvarsized && b->ttype) {
                        var_t _d;
@@ -1484,7 +1484,6 @@ BUNinplacemulti(BAT *b, const oid *posit
                }
 
                HASHinsert_locked(b, p, t);     /* insert new value into hash */
-               MT_rwlock_wrunlock(&b->thashlock);
 
                tt = b->ttype;
                prv = p > 0 ? p - 1 : BUN_NONE;
@@ -1532,6 +1531,7 @@ BUNinplacemulti(BAT *b, const oid *posit
                if (b->tnonil && ATOMstorage(b->ttype) != TYPE_msk)
                        b->tnonil = t && ATOMcmp(b->ttype, t, 
ATOMnilptr(b->ttype)) != 0;
        }
+       MT_rwlock_wrunlock(&b->thashlock);
        b->theap->dirty = true;
        if (b->tvheap)
                b->tvheap->dirty = true;
diff --git a/gdk/gdk_batop.c b/gdk/gdk_batop.c
--- a/gdk/gdk_batop.c
+++ b/gdk/gdk_batop.c
@@ -507,6 +507,7 @@ append_varsized_bat(BAT *b, BAT *n, stru
                BUN p = canditer_next(ci) - hseq;
                const void *t = BUNtvar(ni, p);
                if (tfastins_nocheckVAR(b, r, t) != GDK_SUCCEED) {
+                       MT_rwlock_wrunlock(&b->thashlock);
                        bat_iterator_end(&ni);
                        return GDK_FAIL;
                }
@@ -1183,6 +1184,7 @@ BATappend_or_update(BAT *b, BAT *p, cons
        const void *nil = ATOMnilptr(b->ttype);
        oid hseqend = b->hseqbase + BATcount(b);
        bool anynil = false;
+       bool locked = false;
 
        b->theap->dirty = true;
        if (b->tvarsized) {
@@ -1198,20 +1200,22 @@ BATappend_or_update(BAT *b, BAT *p, cons
                        if (updid < b->hseqbase ||
                            (!mayappend && updid >= hseqend)) {
                                GDKerror("id out of range\n");
-                               bat_iterator_end(&ni);
-                               return GDK_FAIL;
+                               goto bailout;
                        }
                        updid -= b->hseqbase;
                        if (!force && updid < b->batInserted) {
                                GDKerror("updating committed value\n");
-                               bat_iterator_end(&ni);
-                               return GDK_FAIL;
+                               goto bailout;
                        }
 
                        const void *new = BUNtvar(ni, i);
 
                        if (updid >= BATcount(b)) {
                                assert(mayappend);
+                               if (locked) {
+                                       MT_rwlock_wrunlock(&b->thashlock);
+                                       locked = false;
+                               }
                                if (BATcount(b) < updid &&
                                    BUNappendmulti(b, NULL, (BUN) (updid - 
BATcount(b)), force) != GDK_SUCCEED) {
                                        bat_iterator_end(&ni);
@@ -1285,7 +1289,10 @@ BATappend_or_update(BAT *b, BAT *p, cons
                                        minprop = NULL;
                                }
                        }
-                       MT_rwlock_wrlock(&b->thashlock);
+                       if (!locked) {
+                               MT_rwlock_wrlock(&b->thashlock);
+                               locked = true;
+                       }
                        HASHdelete_locked(b, updid, old);
 
                        var_t d;
@@ -1306,23 +1313,13 @@ BATappend_or_update(BAT *b, BAT *p, cons
 #endif
                        }
                        if (ATOMreplaceVAR(b, &d, new) != GDK_SUCCEED) {
-                               Hash *h = b->thash;
-                               b->thash = NULL;
-                               MT_rwlock_wrunlock(&b->thashlock);
-                               doHASHdestroy(b, h);
-                               bat_iterator_end(&ni);
-                               return GDK_FAIL;
+                               goto bailout;
                        }
                        if (b->twidth < SIZEOF_VAR_T &&
                            (b->twidth <= 2 ? d - GDK_VAROFFSET : d) >= 
((size_t) 1 << (8 << b->tshift))) {
                                /* doesn't fit in current heap, upgrade it */
                                if (GDKupgradevarheap(b, d, 0, MAX(updid, 
b->batCount)) != GDK_SUCCEED) {
-                                       Hash *h = b->thash;
-                                       b->thash = NULL;
-                                       MT_rwlock_wrunlock(&b->thashlock);
-                                       doHASHdestroy(b, h);
-                                       bat_iterator_end(&ni);
-                                       return GDK_FAIL;
+                                       goto bailout;
                                }
                        }
                        /* in case ATOMreplaceVAR and/or
@@ -1346,8 +1343,11 @@ BATappend_or_update(BAT *b, BAT *p, cons
 #endif
                        }
                        HASHinsert_locked(b, updid, new);
+
+               }
+               if (locked) {
                        MT_rwlock_wrunlock(&b->thashlock);
-
+                       locked = false;
                }
        } else if (ATOMstorage(b->ttype) == TYPE_msk) {
                HASHdestroy(b); /* hash doesn't make sense for msk */
@@ -1427,6 +1427,7 @@ BATappend_or_update(BAT *b, BAT *p, cons
                 * in the first iteration, after which there is no hash
                 * and the loop ends */
                MT_rwlock_wrlock(&b->thashlock);
+               locked = true;
                for (BUN i = pos, j = pos + ni.count; i < j && b->thash; i++)
                        HASHdelete_locked(b, i, Tloc(b, i));
                if (n->ttype == TYPE_void) {
@@ -1514,6 +1515,7 @@ BATappend_or_update(BAT *b, BAT *p, cons
                                HASHinsert_locked(b, i, Tloc(b, i));
                }
                MT_rwlock_wrunlock(&b->thashlock);
+               locked = false;
                if (ni.count == BATcount(b)) {
                        /* if we replaced all values of b by values
                         * from n, we can also copy the min/max
@@ -1552,26 +1554,28 @@ BATappend_or_update(BAT *b, BAT *p, cons
                        if (updid < b->hseqbase ||
                            (!mayappend && updid >= hseqend)) {
                                GDKerror("id out of range\n");
-                               bat_iterator_end(&ni);
-                               return GDK_FAIL;
+                               goto bailout;
                        }
                        updid -= b->hseqbase;
                        if (!force && updid < b->batInserted) {
                                GDKerror("updating committed value\n");
-                               bat_iterator_end(&ni);
-                               return GDK_FAIL;
+                               goto bailout;
                        }
 
                        const void *new = BUNtail(ni, i);
 
                        if (updid >= BATcount(b)) {
                                assert(mayappend);
+                               if (locked) {
+                                       MT_rwlock_wrunlock(&b->thashlock);
+                                       locked = false;
+                               }
                                if (BATcount(b) < updid &&
                                    BUNappendmulti(b, NULL, (BUN) (updid - 
BATcount(b)), force) != GDK_SUCCEED) {
-                                       bat_iterator_end(&ni);
-                                       return GDK_FAIL;
+                                       goto bailout;
                                }
                                if (BUNappend(b, new, force) != GDK_SUCCEED) {
+                                       MT_rwlock_wrunlock(&b->thashlock);
                                        bat_iterator_end(&ni);
                                        return GDK_FAIL;
                                }
@@ -1640,7 +1644,10 @@ BATappend_or_update(BAT *b, BAT *p, cons
                                }
                        }
 
-                       MT_rwlock_wrlock(&b->thashlock);
+                       if (!locked) {
+                               MT_rwlock_wrlock(&b->thashlock);
+                               locked = true;
+                       }
                        HASHdelete_locked(b, updid, old);
                        switch (b->twidth) {
                        case 1:
@@ -1667,7 +1674,10 @@ BATappend_or_update(BAT *b, BAT *p, cons
                                break;
                        }
                        HASHinsert_locked(b, updid, new);
+               }
+               if (locked) {
                        MT_rwlock_wrunlock(&b->thashlock);
+                       locked = false;
                }
        }
        bat_iterator_end(&ni);
@@ -1676,6 +1686,16 @@ BATappend_or_update(BAT *b, BAT *p, cons
                  ALGOBATPAR(b), ALGOOPTBATPAR(p), ALGOBATPAR(n),
                  GDKusec() - t0);
        return GDK_SUCCEED;
+
+  bailout:
+       bat_iterator_end(&ni);
+       if (locked) {
+               Hash *h = b->thash;
+               b->thash = NULL;
+               MT_rwlock_wrunlock(&b->thashlock);
+               doHASHdestroy(b, h);
+       }
+       return GDK_FAIL;
 }
 
 /* replace values from b at locations specified in p with values in n */
diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c
--- a/gdk/gdk_bbp.c
+++ b/gdk/gdk_bbp.c
@@ -1043,7 +1043,7 @@ BBPmanager(void *dummy)
                            (b = BBP_cache(bid)) != NULL &&
                            b->batSharecnt == 0 &&
                            !BATdirty(b) &&
-                           !(BBP_status(bid) & (BBPHOT | BBPUNLOADING)) &&
+                           !(BBP_status(bid) & (BBPHOT | BBPUNLOADING | 
BBPSYNCING)) &&
                            (BBP_status(bid) & BBPPERSISTENT)) {
                                BBP_status_on(bid, BBPUNLOADING);
                                swap = true;
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to