Changeset: 8d209da9fb26 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/8d209da9fb26
Modified Files:
gdk/gdk_bat.c
gdk/gdk_batop.c
gdk/gdk_hash.c
gdk/gdk_private.h
Branch: Sep2022
Log Message:
Be more aggressive about maintaining the tunique_est value.
diffs (truncated from 324 to 300 lines):
diff --git a/gdk/gdk_bat.c b/gdk/gdk_bat.c
--- a/gdk/gdk_bat.c
+++ b/gdk/gdk_bat.c
@@ -1005,6 +1005,7 @@ gdk_return
BUNappendmulti(BAT *b, const void *values, BUN count, bool force)
{
BUN p;
+ BUN nunique = 0;
BATcheck(b, GDK_FAIL);
@@ -1024,6 +1025,8 @@ BUNappendmulti(BAT *b, const void *value
MT_lock_set(&b->theaplock);
ALIGNapp(b, force, GDK_FAIL);
MT_lock_unset(&b->theaplock);
+ /* load hash so that we can maintain it */
+ (void) BATcheckhash(b);
if (b->ttype == TYPE_void && BATtdense(b)) {
const oid *ovals = values;
@@ -1227,6 +1230,7 @@ BUNappendmulti(BAT *b, const void *value
HASHappend_locked(b, p, t);
p++;
}
+ nunique = b->thash ? b->thash->nunique : 0;
}
MT_rwlock_wrunlock(&b->thashlock);
} else if (ATOMstorage(b->ttype) == TYPE_msk) {
@@ -1272,6 +1276,7 @@ BUNappendmulti(BAT *b, const void *value
}
p++;
}
+ nunique = b->thash ? b->thash->nunique : 0;
MT_rwlock_wrunlock(&b->thashlock);
}
MT_lock_set(&b->theaplock);
@@ -1291,10 +1296,13 @@ BUNappendmulti(BAT *b, const void *value
}
p++;
}
+ nunique = b->thash ? b->thash->nunique : 0;
MT_rwlock_wrunlock(&b->thashlock);
}
MT_lock_set(&b->theaplock);
BATsetcount(b, p);
+ if (nunique != 0)
+ b->tunique_est = (double) nunique;
MT_lock_unset(&b->theaplock);
IMPSdestroy(b); /* no support for inserts in imprints yet */
@@ -1317,6 +1325,7 @@ BUNdelete(BAT *b, oid o)
BATiter bi = bat_iterator_nolock(b);
const void *val;
bool locked = false;
+ BUN nunique;
assert(!is_oid_nil(b->hseqbase) || BATcount(b) == 0);
if (o < b->hseqbase || o >= b->hseqbase + BATcount(b)) {
@@ -1330,6 +1339,9 @@ BUNdelete(BAT *b, oid o)
return GDK_FAIL;
}
TRC_DEBUG(ALGO, ALGOBATFMT " deleting oid " OIDFMT "\n", ALGOBATPAR(b),
o);
+ /* load hash so that we can maintain it */
+ (void) BATcheckhash(b);
+
val = BUNtail(bi, p);
/* writing the values should be locked, reading could be done
* unlocked (since we're the only thread that should be changing
@@ -1342,7 +1354,7 @@ BUNdelete(BAT *b, oid o)
MT_lock_unset(&b->theaplock);
if (ATOMunfix(b->ttype, val) != GDK_SUCCEED)
return GDK_FAIL;
- HASHdelete(&bi, p, val);
+ nunique = HASHdelete(&bi, p, val);
ATOMdel(b->ttype, b->tvheap, (var_t *) BUNtloc(bi, p));
if (p != BATcount(b) - 1 &&
(b->ttype != TYPE_void || BATtdense(b))) {
@@ -1359,9 +1371,9 @@ BUNdelete(BAT *b, oid o)
mskClr(b, BATcount(b) - 1);
} else {
val = Tloc(b, BATcount(b) - 1);
- HASHdelete(&bi, BATcount(b) - 1, val);
+ nunique = HASHdelete(&bi, BATcount(b) - 1, val);
memcpy(Tloc(b, p), val, b->twidth);
- HASHinsert(&bi, p, val);
+ nunique = HASHinsert(&bi, p, val);
MT_lock_set(&b->theaplock);
locked = true;
if (b->tminpos == BATcount(b) - 1)
@@ -1384,7 +1396,9 @@ BUNdelete(BAT *b, oid o)
if (b->tnorevsorted >= p)
b->tnorevsorted = 0;
b->batCount--;
- if (BATcount(b) < gdk_unique_estimate_keep_fraction)
+ if (nunique != 0)
+ b->tunique_est = (double) nunique;
+ else if (BATcount(b) < gdk_unique_estimate_keep_fraction)
b->tunique_est = 0;
if (b->batCount <= 1) {
/* some trivial properties */
@@ -1441,6 +1455,8 @@ BUNinplacemulti(BAT *b, const oid *posit
b->tunique_est = 0;
}
MT_lock_unset(&b->theaplock);
+ /* load hash so that we can maintain it */
+ (void) BATcheckhash(b);
MT_rwlock_wrlock(&b->thashlock);
for (BUN i = 0; i < count; i++) {
BUN p = autoincr ? positions[0] - b->hseqbase + i :
positions[i] - b->hseqbase;
@@ -1687,8 +1703,11 @@ BUNinplacemulti(BAT *b, const oid *posit
b->tnonil = t && ATOMcmp(b->ttype, t,
ATOMnilptr(b->ttype)) != 0;
MT_lock_unset(&b->theaplock);
}
+ BUN nunique = b->thash ? b->thash->nunique : 0;
MT_rwlock_wrunlock(&b->thashlock);
MT_lock_set(&b->theaplock);
+ if (nunique != 0)
+ b->tunique_est = (double) nunique;
b->tminpos = bi.minpos;
b->tmaxpos = bi.maxpos;
b->theap->dirty = true;
diff --git a/gdk/gdk_batop.c b/gdk/gdk_batop.c
--- a/gdk/gdk_batop.c
+++ b/gdk/gdk_batop.c
@@ -316,7 +316,13 @@ insert_string_bat(BAT *b, BATiter *ni, s
for (r = oldcnt, cnt = BATcount(b); b->thash && r < cnt; r++) {
HASHappend_locked(b, r, b->tvheap->base + VarHeapVal(Tloc(b,
0), r, b->twidth));
}
+ BUN nunique = b->thash ? b->thash->nunique : 0;
MT_rwlock_wrunlock(&b->thashlock);
+ if (nunique != 0) {
+ MT_lock_set(&b->theaplock);
+ b->tunique_est = (double) nunique;
+ MT_lock_unset(&b->theaplock);
+ }
return GDK_SUCCEED;
}
@@ -390,7 +396,13 @@ append_varsized_bat(BAT *b, BATiter *ni,
i++) {
HASHappend_locked(b, i, b->tvheap->base + *(var_t *)
Tloc(b, i));
}
+ BUN nunique = b->thash ? b->thash->nunique : 0;
MT_rwlock_wrunlock(&b->thashlock);
+ if (nunique != 0) {
+ MT_lock_set(&b->theaplock);
+ b->tunique_est = (double) nunique;
+ MT_lock_unset(&b->theaplock);
+ }
return GDK_SUCCEED;
}
/* b and n do not share their vheap, so we need to copy data */
@@ -469,9 +481,12 @@ append_varsized_bat(BAT *b, BATiter *ni,
r++;
}
}
+ BUN nunique = b->thash ? b->thash->nunique : 0;
MT_rwlock_wrunlock(&b->thashlock);
MT_lock_set(&b->theaplock);
BATsetcount(b, r);
+ if (nunique != 0)
+ b->tunique_est = (double) nunique;
MT_lock_unset(&b->theaplock);
return GDK_SUCCEED;
}
@@ -777,10 +792,10 @@ BATappend2(BAT *b, BAT *n, BAT *s, bool
}
}
+ /* property setting */
+ MT_lock_set(&b->theaplock);
r = BATcount(b);
- /* property setting */
- MT_lock_set(&b->theaplock);
if (BATcount(b) == 0) {
b->tsorted = ni.sorted;
b->trevsorted = ni.revsorted;
@@ -892,9 +907,13 @@ BATappend2(BAT *b, BAT *n, BAT *s, bool
}
TIMEOUT_CHECK(timeoffset,
GOTO_LABEL_TIMEOUT_HANDLER(bailout));
}
+ BUN nunique;
+ nunique = b->thash ? b->thash->nunique : 0;
MT_rwlock_wrunlock(&b->thashlock);
MT_lock_set(&b->theaplock);
BATsetcount(b, b->batCount + ci.ncand);
+ if (nunique != 0)
+ b->tunique_est = (double) nunique;
MT_lock_unset(&b->theaplock);
}
@@ -1093,6 +1112,7 @@ BATappend_or_update(BAT *b, BAT *p, cons
{
lng t0 = GDKusec();
oid pos = oid_nil;
+ BUN nunique = 0;
if (b == NULL || b->ttype == TYPE_void || n == NULL) {
return GDK_SUCCEED;
@@ -1336,6 +1356,8 @@ BATappend_or_update(BAT *b, BAT *p, cons
}
if (locked) {
+ if (b->thash)
+ nunique = b->thash->nunique;
MT_rwlock_wrunlock(&b->thashlock);
locked = false;
}
@@ -1490,6 +1512,8 @@ BATappend_or_update(BAT *b, BAT *p, cons
if (b->thash != NULL) {
for (BUN i = pos, j = pos + ni.count; i < j; i++)
HASHinsert_locked(&bi, i, Tloc(b, i));
+ if (b->thash)
+ nunique = b->thash->nunique;
}
MT_rwlock_wrunlock(&b->thashlock);
locked = false;
@@ -1633,12 +1657,16 @@ BATappend_or_update(BAT *b, BAT *p, cons
HASHinsert_locked(&bi, updid, new);
}
if (locked) {
+ if (b->thash)
+ nunique = b->thash->nunique;
MT_rwlock_wrunlock(&b->thashlock);
locked = false;
}
}
bat_iterator_end(&ni);
MT_lock_set(&b->theaplock);
+ if (nunique != 0)
+ b->tunique_est = (double) nunique;
b->tminpos = bi.minpos;
b->tmaxpos = bi.maxpos;
b->theap->dirty = true;
diff --git a/gdk/gdk_hash.c b/gdk/gdk_hash.c
--- a/gdk/gdk_hash.c
+++ b/gdk/gdk_hash.c
@@ -972,6 +972,8 @@ BAThash_impl(BAT *restrict b, struct can
if (h->nunique == BATcount(b) && !b->tkey) {
b->tkey = true;
}
+ if (ci->ncand == BATcount(b))
+ b->tunique_est = (double) h->nunique;
MT_lock_unset(&b->theaplock);
TRC_DEBUG_IF(ACCELERATOR) {
TRC_DEBUG_ENDIF(ACCELERATOR,
@@ -1127,12 +1129,15 @@ HASHappend_locked(BAT *b, BUN i, const v
h->heaplink.dirty = true;
}
-void
+BUN
HASHappend(BAT *b, BUN i, const void *v)
{
+ BUN nunique;
MT_rwlock_wrlock(&b->thashlock);
HASHappend_locked(b, i, v);
+ nunique = b->thash ? b->thash->nunique : 0;
MT_rwlock_wrunlock(&b->thashlock);
+ return nunique;
}
/* insert value v at position p into the hash table of b */
@@ -1211,12 +1216,15 @@ HASHinsert_locked(BATiter *bi, BUN p, co
}
}
-void
+BUN
HASHinsert(BATiter *bi, BUN p, const void *v)
{
+ BUN nunique;
MT_rwlock_wrlock(&bi->b->thashlock);
HASHinsert_locked(bi, p, v);
+ nunique = bi->b->thash ? bi->b->thash->nunique : 0;
MT_rwlock_wrunlock(&bi->b->thashlock);
+ return nunique;
}
/* delete value v at position p from the hash table of b */
@@ -1304,12 +1312,15 @@ HASHdelete_locked(BATiter *bi, BUN p, co
h->nunique--;
}
-void
+BUN
HASHdelete(BATiter *bi, BUN p, const void *v)
{
+ BUN nunique;
MT_rwlock_wrlock(&bi->b->thashlock);
HASHdelete_locked(bi, p, v);
+ nunique = bi->b->thash ? bi->b->thash->nunique : 0;
MT_rwlock_wrunlock(&bi->b->thashlock);
+ return nunique;
}
BUN
diff --git a/gdk/gdk_private.h b/gdk/gdk_private.h
--- a/gdk/gdk_private.h
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]