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