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