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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list