Changeset: 43f7cac1158d for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/43f7cac1158d
Modified Files:
        gdk/gdk_aggr.c
        gdk/gdk_align.c
        gdk/gdk_bat.c
        gdk/gdk_batop.c
        gdk/gdk_bbp.c
        gdk/gdk_heap.c
        gdk/gdk_private.h
        gdk/gdk_storage.c
        sql/storage/bat/bat_storage.c
Branch: Jul2021
Log Message:

Improved locking.
Also, remove DESCclean which, possibly erroneously, cleared some dirty
bits.


diffs (truncated from 391 to 300 lines):

diff --git a/gdk/gdk_aggr.c b/gdk/gdk_aggr.c
--- a/gdk/gdk_aggr.c
+++ b/gdk/gdk_aggr.c
@@ -3679,11 +3679,15 @@ BATmin_skipnil(BAT *b, void *aggr, bit s
                                              bi.vh ? bi.vh->base : NULL,
                                              bi.width, 0, bi.count,
                                              ATOMnilptr(b->ttype), 1, 1);
+                               if (r == 0) {
+                                       MT_lock_set(&b->theaplock);
+                                       if (b->batCount == bi.count) {
+                                               b->tnonil = true;
+                                               b->batDirtydesc = true;
+                                       }
+                                       MT_lock_unset(&b->theaplock);
+                               }
                                bat_iterator_end(&bi);
-                               if (r == 0) {
-                                       b->tnonil = true;
-                                       b->batDirtydesc = true;
-                               }
                        } else {
                                r = 0;
                        }
diff --git a/gdk/gdk_align.c b/gdk/gdk_align.c
--- a/gdk/gdk_align.c
+++ b/gdk/gdk_align.c
@@ -367,10 +367,10 @@ VIEWdestroy(BAT *b)
        HASHdestroy(b);
        IMPSdestroy(b);
        OIDXdestroy(b);
-       PROPdestroy(b);
        VIEWunlink(b);
 
        MT_lock_set(&b->theaplock);
+       PROPdestroy_nolock(b);
        if (b->theap) {
                HEAPdecref(b->theap, false);
                b->theap = NULL;
diff --git a/gdk/gdk_bat.c b/gdk/gdk_bat.c
--- a/gdk/gdk_bat.c
+++ b/gdk/gdk_bat.c
@@ -705,7 +705,7 @@ BATdestroy(BAT *b)
                ATOMIC_DESTROY(&b->tvheap->refs);
                GDKfree(b->tvheap);
        }
-       PROPdestroy(b);
+       PROPdestroy_nolock(b);
        MT_lock_destroy(&b->theaplock);
        MT_lock_destroy(&b->batIdxLock);
        MT_rwlock_destroy(&b->thashlock);
@@ -1019,7 +1019,6 @@ BUNappendmulti(BAT *b, const void *value
        }
 
        ALIGNapp(b, force, GDK_FAIL);
-       b->batDirtydesc = true;
 
        if (b->ttype == TYPE_void && BATtdense(b)) {
                const oid *ovals = values;
@@ -1038,7 +1037,9 @@ BUNappendmulti(BAT *b, const void *value
                        return GDK_SUCCEED;
                } else {
                        /* we need to materialize b; allocate enough capacity */
+                       MT_lock_set(&b->theaplock);
                        b->batCapacity = BATcount(b) + count;
+                       MT_lock_unset(&b->theaplock);
                        if (BATmaterialize(b) != GDK_SUCCEED)
                                return GDK_FAIL;
                }
@@ -1062,6 +1063,7 @@ BUNappendmulti(BAT *b, const void *value
        }
 
        MT_lock_set(&b->theaplock);
+       b->batDirtydesc = true;
        if (count > BATcount(b) / GDK_UNIQUE_ESTIMATE_KEEP_FRACTION)
                BATrmprop_nolock(b, GDK_UNIQUE_ESTIMATE);
        b->theap->dirty = true;
@@ -1321,6 +1323,7 @@ BUNdelete(BAT *b, oid o)
        BATiter bi = bat_iterator_nolock(b);
        const void *val;
        const ValRecord *prop;
+       bool locked = false;
 
        assert(!is_oid_nil(b->hseqbase) || BATcount(b) == 0);
        if (o < b->hseqbase || o >= b->hseqbase + BATcount(b)) {
@@ -1333,7 +1336,6 @@ BUNdelete(BAT *b, oid o)
                GDKerror("cannot delete committed value\n");
                return GDK_FAIL;
        }
-       b->batDirtydesc = true;
        val = BUNtail(bi, p);
        if (ATOMlinear(b->ttype) &&
            ATOMcmp(b->ttype, ATOMnilptr(b->ttype), val) != 0) {
@@ -1381,18 +1383,21 @@ BUNdelete(BAT *b, oid o)
                        HASHinsert(b, p, val);
                }
                /* no longer sorted */
+               MT_lock_set(&b->theaplock);
+               locked = true;
                b->tsorted = b->trevsorted = false;
                b->theap->dirty = true;
        }
+       if (!locked)
+               MT_lock_set(&b->theaplock);
+       b->batDirtydesc = true;
        if (b->tnosorted >= p)
                b->tnosorted = 0;
        if (b->tnorevsorted >= p)
                b->tnorevsorted = 0;
-       MT_lock_set(&b->theaplock);
        b->batCount--;
        if (BATcount(b) < GDK_UNIQUE_ESTIMATE_KEEP_FRACTION)
                BATrmprop_nolock(b, GDK_UNIQUE_ESTIMATE);
-       MT_lock_unset(&b->theaplock);
        if (b->batCount <= 1) {
                /* some trivial properties */
                b->tkey = true;
@@ -1403,6 +1408,7 @@ BUNdelete(BAT *b, oid o)
                        b->tnonil = true;
                }
        }
+       MT_lock_unset(&b->theaplock);
        IMPSdestroy(b);
        OIDXdestroy(b);
        return GDK_SUCCEED;
@@ -1428,6 +1434,7 @@ BUNinplacemulti(BAT *b, const oid *posit
        int tt;
        BUN prv, nxt;
        const void *val;
+       bool locked = false;
 
        /* zap alignment info */
        if (!force && (b->batRestricted != BAT_WRITE || b->batSharecnt > 0)) {
@@ -1471,12 +1478,19 @@ BUNinplacemulti(BAT *b, const oid *posit
                                 * isn't, we're not sure anymore about
                                 * the nil property, so we must clear
                                 * it */
+                               if (!locked) {
+                                       MT_lock_set(&b->theaplock);
+                                       locked = true;
+                               }
                                b->tnil = false;
                        }
                        if (b->ttype != TYPE_void && ATOMlinear(b->ttype)) {
                                const ValRecord *prop;
 
-                               MT_lock_set(&b->theaplock);
+                               if (!locked) {
+                                       MT_lock_set(&b->theaplock);
+                                       locked = true;
+                               }
                                if ((prop = BATgetprop_nolock(b, 
GDK_MAX_VALUE)) != NULL) {
                                        if (ATOMcmp(b->ttype, t, 
ATOMnilptr(b->ttype)) != 0 &&
                                            ATOMcmp(b->ttype, VALptr(prop), t) 
< 0) {
@@ -1523,9 +1537,16 @@ BUNinplacemulti(BAT *b, const oid *posit
                                }
                                if (count > BATcount(b) / 
GDK_UNIQUE_ESTIMATE_KEEP_FRACTION)
                                        BATrmprop_nolock(b, 
GDK_UNIQUE_ESTIMATE);
+                       } else if (b->tprops) {
+                               if (!locked) {
+                                       MT_lock_set(&b->theaplock);
+                                       locked = true;
+                               }
+                               PROPdestroy_nolock(b);
+                       }
+                       if (locked) {
                                MT_lock_unset(&b->theaplock);
-                       } else {
-                               PROPdestroy(b);
+                               locked = false;
                        }
                        HASHdelete_locked(b, p, val);   /* first delete old 
value from hash */
                } else {
@@ -1638,6 +1659,7 @@ BUNinplacemulti(BAT *b, const oid *posit
                prv = p > 0 ? p - 1 : BUN_NONE;
                nxt = p < last ? p + 1 : BUN_NONE;
 
+               MT_lock_set(&b->theaplock);
                if (BATtordered(b)) {
                        if (prv != BUN_NONE &&
                            ATOMcmp(tt, t, BUNtail(bi, prv)) < 0) {
@@ -1679,9 +1701,11 @@ BUNinplacemulti(BAT *b, const oid *posit
                        b->tnokey[0] = b->tnokey[1] = 0;
                if (b->tnonil && ATOMstorage(b->ttype) != TYPE_msk)
                        b->tnonil = t && ATOMcmp(b->ttype, t, 
ATOMnilptr(b->ttype)) != 0;
+               MT_lock_unset(&b->theaplock);
        }
        MT_rwlock_wrunlock(&b->thashlock);
        MT_lock_set(&b->theaplock);
+       b->batDirtydesc = true;
        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
@@ -2818,7 +2818,7 @@ BATconstant(oid hseq, int tailtype, cons
  */
 
 void
-PROPdestroy(BAT *b)
+PROPdestroy_nolock(BAT *b)
 {
        PROPrec *p = b->tprops;
        PROPrec *n;
@@ -2834,6 +2834,14 @@ PROPdestroy(BAT *b)
        }
 }
 
+void
+PROPdestroy(BAT *b)
+{
+       MT_lock_set(&b->theaplock);
+       PROPdestroy_nolock(b);
+       MT_lock_unset(&b->theaplock);
+}
+
 ValPtr
 BATgetprop_nolock(BAT *b, enum prop_t idx)
 {
diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c
--- a/gdk/gdk_bbp.c
+++ b/gdk/gdk_bbp.c
@@ -1489,7 +1489,7 @@ BBPexit(void)
                                                }
                                                VIEWdestroy(b);
                                        } else {
-                                               PROPdestroy(b);
+                                               PROPdestroy_nolock(b);
                                                BATfree(b);
                                        }
                                }
@@ -2757,6 +2757,7 @@ decref(bat i, bool logical, bool release
                         * (sub)commit happened in parallel to an
                         * update; we must undo the turning off of the
                         * dirty bits */
+                       assert(b->batDirtydesc);
                        b->batDirtydesc = true;
                        if (b->theap)
                                b->theap->dirty = true;
@@ -3036,7 +3037,7 @@ BBPdestroy(BAT *b)
        HASHdestroy(b);
        IMPSdestroy(b);
        OIDXdestroy(b);
-       PROPdestroy(b);
+       PROPdestroy_nolock(b);
        if (tp == 0) {
                /* bats that get destroyed must unfix their atoms */
                gdk_return (*tunfix) (const void *) = 
BATatoms[b->ttype].atomUnfix;
@@ -3341,6 +3342,7 @@ do_backup(const char *srcdir, const char
        char extnew[16];
        bool istail = strncmp(ext, "tail", 4) == 0;
 
+       h->dirty |= dirty;
        if (h->wasempty) {
                return GDK_SUCCEED;
        }
@@ -3672,6 +3674,7 @@ BBPsync(int cnt, bat *restrict subcommit
                                }
                                MT_lock_set(&BBP_desc(i)->theaplock);
                                bi = bat_iterator_nolock(BBP_desc(i));
+                               bi.b->batDirtydesc = size != BUN_NONE && size 
!= bi.count;
                                HEAPincref(bi.h);
                                if (bi.vh)
                                        HEAPincref(bi.vh);
@@ -3723,8 +3726,16 @@ BBPsync(int cnt, bat *restrict subcommit
                                break;
                        /* we once again have a saved heap */
                }
-               if (idx < cnt)
+               if (idx < cnt) {
                        ret = GDK_FAIL;
+                       while (idx > 0) {
+                               bat i = subcommit ? subcommit[idx] : idx;
+                               MT_lock_set(&BBP_desc(i)->theaplock);
+                               BBP_desc(i)->batDirtydesc = true;
+                               MT_lock_unset(&BBP_desc(i)->theaplock);
+                               idx--;
+                       }
+               }
        }
 
        TRC_DEBUG(PERF, "write time %d\n", (t0 = GDKms()) - t1);
diff --git a/gdk/gdk_heap.c b/gdk/gdk_heap.c
--- a/gdk/gdk_heap.c
+++ b/gdk/gdk_heap.c
@@ -835,6 +835,7 @@ HEAPload_intern(Heap *h, const char *nme
        if (h->base == NULL)
                return GDK_FAIL; /* file could  not be read satisfactorily */
 
+       h->dirty = false;       /* we just read it, so it's clean */
        return GDK_SUCCEED;
 }
 
diff --git a/gdk/gdk_private.h b/gdk/gdk_private.h
--- a/gdk/gdk_private.h
+++ b/gdk/gdk_private.h
@@ -244,6 +244,8 @@ void persistOIDX(BAT *b)
        __attribute__((__visibility__("hidden")));
 void PROPdestroy(BAT *b)
        __attribute__((__visibility__("hidden")));
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to