Changeset: e3f905d2832b for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/e3f905d2832b
Branch: default
Log Message:

Merge with Dec2023 branch.


diffs (221 lines):

diff --git a/gdk/gdk_bat.c b/gdk/gdk_bat.c
--- a/gdk/gdk_bat.c
+++ b/gdk/gdk_bat.c
@@ -2545,10 +2545,10 @@ BATmode(BAT *b, bool transient)
        }
 
        BATiter bi = bat_iterator(b);
+       bool mustrelease = false;
+       bat bid = b->batCacheid;
 
        if (transient != bi.transient) {
-               bat bid = b->batCacheid;
-
                if (!transient) {
                        if (ATOMisdescendant(b->ttype, TYPE_ptr) ||
                            BATatoms[b->ttype].atomUnfix ||
@@ -2566,7 +2566,13 @@ BATmode(BAT *b, bool transient)
                if (!transient) {
                        BBPretain(bid);
                } else if (!bi.transient) {
-                       BBPrelease(bid);
+                       /* we need to delay the release because if there
+                        * is no fix and the bat is loaded, BBPrelease
+                        * can call BBPfree which calls BATfree which
+                        * may hang while waiting for the heap reference
+                        * that we have because of the BAT iterator to
+                        * come down, in other words, deadlock */
+                       mustrelease = true;
                }
                MT_lock_set(&GDKswapLock(bid));
                if (!transient) {
@@ -2597,6 +2603,9 @@ BATmode(BAT *b, bool transient)
                MT_lock_unset(&GDKswapLock(bid));
        }
        bat_iterator_end(&bi);
+       /* release after bat_iterator_end because of refs to heaps */
+       if (mustrelease)
+               BBPrelease(bid);
        return GDK_SUCCEED;
 }
 
diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c
--- a/gdk/gdk_bbp.c
+++ b/gdk/gdk_bbp.c
@@ -4541,8 +4541,8 @@ BBPdiskscan(const char *parent, size_t b
        DIR *dirp = opendir(parent);
        struct dirent *dent;
        char fullname[FILENAME_MAX];
-       str dst = fullname;
-       size_t dstlen = sizeof(fullname);
+       str dst;
+       size_t dstlen;
        const char *src = parent;
 
        if (dirp == NULL) {
@@ -4551,14 +4551,10 @@ BBPdiskscan(const char *parent, size_t b
                return true;    /* nothing to do */
        }
 
-       while (*src) {
-               *dst++ = *src++;
-               dstlen--;
-       }
-       if (dst > fullname && dst[-1] != DIR_SEP) {
+       dst = stpcpy(fullname, src);
+       if (dst > fullname && dst[-1] != DIR_SEP)
                *dst++ = DIR_SEP;
-               dstlen--;
-       }
+       dstlen = sizeof(fullname) - (dst - fullname);
 
        while ((dent = readdir(dirp)) != NULL) {
                const char *p;
@@ -4569,7 +4565,7 @@ BBPdiskscan(const char *parent, size_t b
                        continue;       /* ignore .dot files and directories (. 
..) */
 
 #ifdef GDKLIBRARY_JSON
-               if (strcmp(dent->d_name, "jsonupgradeneed") == 0) {
+               if (strcmp(dent->d_name, "jsonupgradeneeded") == 0) {
                        continue; /* ignore json upgrade signal file  */
                }
 #endif
diff --git a/gdk/gdk_logger.c b/gdk/gdk_logger.c
--- a/gdk/gdk_logger.c
+++ b/gdk/gdk_logger.c
@@ -1533,35 +1533,12 @@ subcommit_list_add(int next, bat *n, BUN
 
 static int
 cleanup_and_swap(logger *lg, int *r, const log_bid *bids, lng *lids, lng *cnts,
-                BAT *catalog_bid, BAT *catalog_id, BAT *dcatalog, BUN cleanup,
-                uint32_t *updated, BUN maxupdated)
+                BAT *catalog_bid, BAT *catalog_id, BAT *dcatalog, BUN cleanup)
 {
        BAT *nbids, *noids, *ncnts, *nlids, *ndels;
        BUN p, q;
        int err = 0, rcnt = 0;
 
-       oid *poss = Tloc(dcatalog, 0);
-       BATloop(dcatalog, p, q) {
-               oid pos = poss[p];
-
-               if (updated && pos < maxupdated && (updated[pos / 32] & (1U << 
(pos % 32))) == 0) {
-                       continue;
-               }
-               if (lids[pos] == lng_nil || lids[pos] > lg->saved_tid)
-                       continue;
-
-               if (lids[pos] >= 0) {
-                       lids[pos] = -1; /* mark as transient */
-                       r[rcnt++] = bids[pos];
-
-                       BAT *lb;
-
-                       if ((lb = BATdescriptor(bids[pos])) == NULL || 
BATmode(lb, true /*transient */ ) != GDK_SUCCEED) {
-                               GDKwarning("Failed to set bat(%d) transient\n", 
bids[pos]);
-                       }
-                       logbat_destroy(lb);
-               }
-       }
        BUN ocnt = BATcount(catalog_bid);
        nbids = logbat_new(TYPE_int, ocnt - cleanup, PERSISTENT);
        noids = logbat_new(TYPE_int, ocnt - cleanup, PERSISTENT);
@@ -1578,6 +1555,26 @@ cleanup_and_swap(logger *lg, int *r, con
                return 0;
        }
 
+       oid *poss = Tloc(dcatalog, 0);
+       BATloop(dcatalog, p, q) {
+               oid pos = poss[p];
+
+               if (lids[pos] == lng_nil || lids[pos] > lg->saved_tid)
+                       continue;
+
+               if (lids[pos] >= 0) {
+                       BAT *lb;
+                       bat bid = bids[pos];
+
+                       if ((lb = BBP_desc(bid)) == NULL || BATmode(lb, true 
/*transient */ ) != GDK_SUCCEED) {
+                               GDKwarning("Failed to set bat(%d) transient\n", 
bid);
+                       } else {
+                               lids[pos] = -1; /* mark as transient */
+                               r[rcnt++] = bid;
+                       }
+               }
+       }
+
        int *oids = (int *) Tloc(catalog_id, 0);
        q = BATcount(catalog_bid);
        for (p = 0; p < q && !err; p++) {
@@ -1589,7 +1586,7 @@ cleanup_and_swap(logger *lg, int *r, con
 
                /* only project out the deleted with lid == -1
                 * update dcatalog */
-               if ((updated == NULL || p >= maxupdated || (updated[p / 32] & 
(1U << (p % 32))) != 0) && lid == -1)
+               if (lid == -1)
                        continue;       /* remove */
 
                if (BUNappend(nbids, &col, false) != GDK_SUCCEED ||
@@ -1701,11 +1698,6 @@ bm_subcommit(logger *lg, logged_range *p
        if (lg->catalog_lid)
                lids = (lng *) Tloc(lg->catalog_lid, 0);
        BATloop(catalog_bid, p, q) {
-               if (updated && p < maxupdated && (updated[p / 32] & (1U << (p % 
32))) == 0) {
-                       continue;
-               }
-               bat col = bids[p];
-
                if (lids && lids[p] != lng_nil && lids[p] <= lg->saved_tid) {
                        cleanup++;
                        if (lids[p] == -1)
@@ -1724,6 +1716,11 @@ bm_subcommit(logger *lg, logged_range *p
                                return GDK_FAIL;
                        }
                }
+               if (updated && p < maxupdated && (updated[p / 32] & (1U << (p % 
32))) == 0) {
+                       continue;
+               }
+               bat col = bids[p];
+
                TRC_DEBUG(WAL, "new %s (%d)\n", BBP_logical(col), col);
                assert(col);
                sizes[i] = cnts ? (BUN) cnts[p] : 0;
@@ -1740,8 +1737,7 @@ bm_subcommit(logger *lg, logged_range *p
        if (cleanup) {
                if ((rcnt = cleanup_and_swap(lg, r, bids, lids, cnts,
                                             catalog_bid, catalog_id, dcatalog,
-                                            cleanup, updated,
-                                            maxupdated)) < 0) {
+                                            cleanup)) < 0) {
                        GDKfree(n);
                        GDKfree(r);
                        GDKfree(sizes);
@@ -3265,15 +3261,13 @@ bm_commit(logger *lg, logged_range *pend
                BAT *lb;
 
                assert(bid);
-               if ((lb = BATdescriptor(bid)) == NULL || BATmode(lb, false) != 
GDK_SUCCEED) {
+               if ((lb = BBP_desc(bid)) == NULL || BATmode(lb, false) != 
GDK_SUCCEED) {
                        GDKwarning("Failed to set bat (%d%s) persistent\n", 
bid, !lb ? " gone" : "");
-                       logbat_destroy(lb);
                        log_unlock(lg);
                        return GDK_FAIL;
                }
 
                assert(lb->batRestricted != BAT_WRITE);
-               logbat_destroy(lb);
 
                TRC_DEBUG(WAL, "create %d (%d)\n", bid, BBP_lrefs(bid));
        }
diff --git a/monetdb5/modules/atoms/json.c b/monetdb5/modules/atoms/json.c
--- a/monetdb5/modules/atoms/json.c
+++ b/monetdb5/modules/atoms/json.c
@@ -599,7 +599,7 @@ jsonRead(str a, size_t *dstlen, stream *
        str out = NULL;
        str msg;
 
-       if (BATatoms[TYPE_str].atomRead(a, dstlen, s, cnt) == NULL)
+       if ((a = BATatoms[TYPE_str].atomRead(a, dstlen, s, cnt)) == NULL)
                return NULL;
 
        if ((msg = JSONstr2json(&out, (const char **) &a)) != MAL_SUCCEED) {
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to