Changeset: 9bfdf4d1ea96 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/9bfdf4d1ea96
Modified Files:
        sql/storage/bat/bat_storage.c
Branch: smart-merge-jan22
Log Message:

Merge with Jan2022.


diffs (truncated from 693 to 300 lines):

diff --git a/.hgtags b/.hgtags
--- a/.hgtags
+++ b/.hgtags
@@ -769,3 +769,4 @@ 1252291e5c0ddc91ccb16d612d04e34e6a7d3bc3
 1252291e5c0ddc91ccb16d612d04e34e6a7d3bc3 Jun2020_SP2_release
 59de1ee118d4eccc072c0cf3938f90635a7db311 Jan2022_15
 59de1ee118d4eccc072c0cf3938f90635a7db311 Jan2022_SP3_release
+38ba6e40ba9148c762fe4a4b40f4937f86e516b6 Jul2021_25
diff --git a/gdk/ChangeLog.Jan2022 b/gdk/ChangeLog.Jan2022
--- a/gdk/ChangeLog.Jan2022
+++ b/gdk/ChangeLog.Jan2022
@@ -1,6 +1,11 @@
 # ChangeLog file for GDK
 # This file is updated with Maddlog
 
+* Tue Aug  2 2022 Sjoerd Mullender <sjo...@acm.org>
+- When destroying a bat, make sure there are no files left over in
+  the BACKUP directory since they can cause problems when the bat id
+  gets reused.
+
 * Thu Jul 28 2022 Sjoerd Mullender <sjo...@acm.org>
 - Fixed an off-by-one error in the logger which caused older log files
   to stick around longer in the write-ahead log than necessary.
diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c
--- a/gdk/gdk_bbp.c
+++ b/gdk/gdk_bbp.c
@@ -2510,7 +2510,7 @@ BBPinsert(BAT *bn)
        MT_lock_unset(&GDKswapLock(i));
 
 #ifdef HAVE_HGE
-       if (bn->ttype == TYPE_hge)
+       if (bn->ttype == TYPE_hge && !havehge)
                havehge = true;
 #endif
 
diff --git a/gdk/gdk_join.c b/gdk/gdk_join.c
--- a/gdk/gdk_join.c
+++ b/gdk/gdk_join.c
@@ -3162,7 +3162,6 @@ count_unique(BAT *b, BAT *s, BUN *cnt1, 
                seen = NULL;
        } else {
                BUN prb;
-               BUN p;
                BUN mask;
                Hash hs = {0};
 
@@ -3176,7 +3175,7 @@ count_unique(BAT *b, BAT *s, BUN *cnt1, 
                    (hs.heapbckt.farmid = BBPselectfarm(TRANSIENT, b->ttype, 
hashheap)) < 0 ||
                    snprintf(hs.heaplink.filename, 
sizeof(hs.heaplink.filename), "%s.thshjnl%x", nme, (unsigned) THRgettid()) >= 
(int) sizeof(hs.heaplink.filename) ||
                    snprintf(hs.heapbckt.filename, 
sizeof(hs.heapbckt.filename), "%s.thshjnb%x", nme, (unsigned) THRgettid()) >= 
(int) sizeof(hs.heapbckt.filename) ||
-                   HASHnew(&hs, b->ttype, BUNlast(b), mask, BUN_NONE, false) 
!= GDK_SUCCEED) {
+                   HASHnew(&hs, b->ttype, ci.ncand, mask, BUN_NONE, false) != 
GDK_SUCCEED) {
                        GDKerror("cannot allocate hash table\n");
                        HEAPfree(&hs.heaplink, true);
                        HEAPfree(&hs.heapbckt, true);
@@ -3192,15 +3191,15 @@ count_unique(BAT *b, BAT *s, BUN *cnt1, 
                        for (hb = HASHget(&hs, prb);
                             hb != BUN_NONE;
                             hb = HASHgetlink(&hs, hb)) {
-                               if (cmp(v, BUNtail(bi, hb)) == 0)
+                               BUN p = canditer_idx(&ci, hb) - b->hseqbase;
+                               if (cmp(v, BUNtail(bi, p)) == 0)
                                        break;
                        }
                        if (hb == BUN_NONE) {
-                               p = o - b->hseqbase;
                                cnt++;
                                /* enter into hash table */
-                               HASHputlink(&hs, p, HASHget(&hs, prb));
-                               HASHput(&hs, prb, p);
+                               HASHputlink(&hs, i, HASHget(&hs, prb));
+                               HASHput(&hs, prb, i);
                        }
                }
                *cnt2 = cnt;
diff --git a/gdk/gdk_logger.c b/gdk/gdk_logger.c
--- a/gdk/gdk_logger.c
+++ b/gdk/gdk_logger.c
@@ -209,8 +209,9 @@ internal_find_bat(logger *lg, log_id id,
                        }
                }
                MT_rwlock_rdunlock(&cni.b->thashlock);
+               return 0;       /* not found */
        }
-       return 0;
+       return -1;              /* error creating hash */
 }
 
 static void
@@ -274,6 +275,9 @@ la_bat_clear(logger *lg, logaction *la, 
        log_bid bid = internal_find_bat(lg, la->cid, tid);
        BAT *b;
 
+       if (bid < 0)
+               return GDK_FAIL;
+
        if (lg->debug & 1)
                fprintf(stderr, "#la_bat_clear %d\n", la->cid);
 
@@ -633,8 +637,9 @@ la_bat_update_count(logger *lg, log_id i
                        }
                }
                MT_rwlock_rdunlock(&cni.b->thashlock);
+               return GDK_SUCCEED;
        }
-       return GDK_SUCCEED;
+       return GDK_FAIL;
 }
 
 static gdk_return
@@ -643,6 +648,8 @@ la_bat_updates(logger *lg, logaction *la
        log_bid bid = internal_find_bat(lg, la->cid, tid);
        BAT *b = NULL;
 
+       if (bid < 0)
+               return GDK_FAIL;
        if (bid == 0)
                return GDK_SUCCEED; /* ignore bats no longer in the catalog */
 
@@ -746,6 +753,8 @@ la_bat_destroy(logger *lg, logaction *la
 {
        log_bid bid = internal_find_bat(lg, la->cid, tid);
 
+       if (bid < 0)
+               return GDK_FAIL;
        if (bid && logger_del_bat(lg, bid) != GDK_SUCCEED)
                return GDK_FAIL;
        return GDK_SUCCEED;
@@ -2589,6 +2598,10 @@ log_bat_transient(logger *lg, log_id id)
        log_bid bid = internal_find_bat(lg, id, -1);
        logformat l;
 
+       if (bid < 0) {
+               logger_unlock(lg);
+               return GDK_FAIL;
+       }
        l.flag = LOG_DESTROY;
        l.id = id;
 
@@ -2887,6 +2900,8 @@ logger_add_bat(logger *lg, BAT *b, log_i
               b == lg->seqs_val ||
               b == lg->dseqs);
        assert(b->batRole == PERSISTENT);
+       if (bid < 0)
+               return GDK_FAIL;
        if (bid) {
                if (bid != b->batCacheid) {
                        if (logger_del_bat(lg, bid) != GDK_SUCCEED)
diff --git a/gdk/gdk_logger_old.c b/gdk/gdk_logger_old.c
--- a/gdk/gdk_logger_old.c
+++ b/gdk/gdk_logger_old.c
@@ -313,6 +313,7 @@ old_logger_find_bat(old_logger *lg, cons
                                }
                        }
                        MT_rwlock_rdunlock(&cni.b->thashlock);
+                       return 0; /* not found */
                }
        } else {
                BATiter cni = bat_iterator_nolock(lg->catalog_oid);
@@ -331,9 +332,10 @@ old_logger_find_bat(old_logger *lg, cons
                                }
                        }
                        MT_rwlock_rdunlock(&cni.b->thashlock);
+                       return 0; /* not found */
                }
        }
-       return 0;
+       return -1;              /* BAThash failed */
 }
 
 static gdk_return
@@ -342,6 +344,9 @@ la_bat_clear(old_logger *lg, logaction *
        log_bid bid = old_logger_find_bat(lg, la->name, la->tpe, la->cid);
        BAT *b;
 
+       if (bid < 0)
+               return GDK_FAIL;
+
        if (lg->lg->debug & 1)
                fprintf(stderr, "#la_bat_clear %s\n", NAME(la->name, la->tpe, 
la->cid));
 
@@ -409,6 +414,8 @@ static log_return
 log_read_updates(old_logger *lg, trans *tr, logformat *l, char *name, int tpe, 
oid id, int pax)
 {
        log_bid bid = old_logger_find_bat(lg, name, tpe, id);
+       if (bid < 0)
+               return LOG_ERR;
        BAT *b = BATdescriptor(bid);
        log_return res = LOG_OK;
        int ht = -1, tt = -1, tseq = 0;
@@ -625,6 +632,8 @@ la_bat_updates(old_logger *lg, logaction
        log_bid bid = old_logger_find_bat(lg, la->name, la->tpe, la->cid);
        BAT *b;
 
+       if (bid < 0)
+               return GDK_FAIL;
        if (bid == 0)
                return GDK_SUCCEED; /* ignore bats no longer in the catalog */
 
@@ -704,6 +713,8 @@ la_bat_destroy(old_logger *lg, logaction
 {
        log_bid bid = old_logger_find_bat(lg, la->name, la->tpe, la->cid);
 
+       if (bid < 0)
+               return GDK_FAIL;
        if (bid) {
                BUN p;
 
@@ -1494,6 +1505,8 @@ logger_load(const char *fn, char filenam
                goto error;
        }
        snapshots_bid = old_logger_find_bat(lg, "snapshots_bid", 0, 0);
+       if (snapshots_bid < 0)
+               goto error;
        if (snapshots_bid == 0) {
                lg->snapshots_bid = logbat_new(TYPE_int, 1, TRANSIENT);
                lg->snapshots_tid = logbat_new(TYPE_int, 1, TRANSIENT);
@@ -1508,6 +1521,8 @@ logger_load(const char *fn, char filenam
                bat snapshots_tid = old_logger_find_bat(lg, "snapshots_tid", 0, 
0);
                bat dsnapshots = old_logger_find_bat(lg, "dsnapshots", 0, 0);
 
+               if (snapshots_tid < 0 || dsnapshots < 0)
+                       goto error;
                GDKdebug &= ~CHECKMASK;
                lg->snapshots_bid = BATdescriptor(snapshots_bid);
                if (lg->snapshots_bid == NULL) {
@@ -1924,6 +1939,8 @@ logger_add_bat(old_logger *lg, BAT *b, c
               b == lg->seqs_val ||
               b == lg->dseqs);
        assert(b->batRole == PERSISTENT);
+       if (bid < 0)
+               return GDK_FAIL;
        if (bid) {
                if (bid != b->batCacheid) {
                        if (logger_del_bat(lg, bid) != GDK_SUCCEED)
diff --git a/gdk/gdk_storage.c b/gdk/gdk_storage.c
--- a/gdk/gdk_storage.c
+++ b/gdk/gdk_storage.c
@@ -974,7 +974,8 @@ BATdelete(BAT *b)
        STRMPdestroy(b);
        if (b->theap) {
                HEAPfree(b->theap, true);
-               if ((f = GDKfilepath(b->theap->farmid, BAKDIR, o, "tail1")) != 
NULL) {
+               if (!GDKinmemory(b->theap->farmid) &&
+                   (f = GDKfilepath(b->theap->farmid, BAKDIR, o, "tail1")) != 
NULL) {
                        MT_remove(f);
                        size_t i = strlen(f) - 1;
                        f[i] = '2';
@@ -990,7 +991,8 @@ BATdelete(BAT *b)
        }
        if (b->tvheap) {
                HEAPfree(b->tvheap, true);
-               if ((f = GDKfilepath(b->theap->farmid, BAKDIR, o, "theap")) != 
NULL) {
+               if (!GDKinmemory(b->tvheap->farmid) &&
+                   (f = GDKfilepath(b->theap->farmid, BAKDIR, o, "theap")) != 
NULL) {
                        MT_remove(f);
                        GDKfree(f);
                }
diff --git a/sql/storage/bat/bat_logger.c b/sql/storage/bat/bat_logger.c
--- a/sql/storage/bat/bat_logger.c
+++ b/sql/storage/bat/bat_logger.c
@@ -78,6 +78,14 @@ bl_preversion(sqlstore *store, int oldve
 
 #define D(schema, table)       "D_" schema "_" table
 
+static BAT *
+log_temp_descriptor(log_bid b)
+{
+       if (b <= 0)
+               return NULL;
+       return temp_descriptor(b);
+}
+
 #if defined CATALOG_JUN2020 || defined CATALOG_OCT2020
 static gdk_return
 tabins(logger *lg, old_logger *old_lg, bool first, int tt, int nid, ...)
@@ -91,7 +99,7 @@ tabins(logger *lg, old_logger *old_lg, b
        va_start(va, nid);
        while ((cid = va_arg(va, int)) != 0) {
                cval = va_arg(va, void *);
-               if ((b = temp_descriptor(logger_find_bat(lg, cid))) == NULL) {
+               if ((b = log_temp_descriptor(logger_find_bat(lg, cid))) == 
NULL) {
                        va_end(va);
                        return GDK_FAIL;
                }
@@ -1335,18 +1343,18 @@ upgrade(old_logger *lg)
        BAT *mapold = COLnew(0, TYPE_int, 256, TRANSIENT);
        BAT *mapnew = COLnew(0, TYPE_int, 256, TRANSIENT);
 
-       bats[0].nmbat = temp_descriptor(old_logger_find_bat(lg, 
"sys_schemas_name", 0, 0));
-       bats[0].idbat = temp_descriptor(old_logger_find_bat(lg, 
"sys_schemas_id", 0, 0));
+       bats[0].nmbat = log_temp_descriptor(old_logger_find_bat(lg, 
"sys_schemas_name", 0, 0));
+       bats[0].idbat = log_temp_descriptor(old_logger_find_bat(lg, 
"sys_schemas_id", 0, 0));
        bats[0].parbat = NULL;
-       bats[0].cands = temp_descriptor(old_logger_find_bat(lg, 
"D_sys_schemas", 0, 0));
-       bats[1].nmbat = temp_descriptor(old_logger_find_bat(lg, 
"sys__tables_name", 0, 0));
-       bats[1].idbat = temp_descriptor(old_logger_find_bat(lg, 
"sys__tables_id", 0, 0));
-       bats[1].parbat = temp_descriptor(old_logger_find_bat(lg, 
"sys__tables_schema_id", 0, 0));
-       bats[1].cands = temp_descriptor(old_logger_find_bat(lg, 
"D_sys__tables", 0, 0));
-       bats[2].nmbat = temp_descriptor(old_logger_find_bat(lg, 
"sys__columns_name", 0, 0));
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to