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]