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]

Reply via email to