Changeset: 407004767d48 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/407004767d48
Modified Files:
gdk/gdk_imprints.c
Branch: Jul2021
Log Message:
When bat changes during imprints build, discard imprints.
Note that imprints are created on the parent bat of a view, and this
parent can change in another thread.
This fix is a solution for that problem, but it may not be the best
solution.
diffs (92 lines):
diff --git a/gdk/gdk_imprints.c b/gdk/gdk_imprints.c
--- a/gdk/gdk_imprints.c
+++ b/gdk/gdk_imprints.c
@@ -151,8 +151,8 @@
const TYPE *restrict bins = (TYPE *) inbins; \
const BUN page = IMPS_PAGE / sizeof(TYPE); \
prvmask = 0; \
- for (i = 0; i < b->batCount; ) { \
- const BUN lim = MIN(i + page, b->batCount); \
+ for (i = 0; i < bi->count; ) { \
+ const BUN lim = MIN(i + page, bi->count); \
/* new mask */ \
mask = 0; \
/* build mask for all BUNs in one PAGE */ \
@@ -355,7 +355,7 @@ BATcheckimprints(BAT *b)
imprints->imprints.parentid =
b->batCacheid;
ATOMIC_INIT(&imprints->imprints.refs, 1);
b->timprints = imprints;
- TRC_DEBUG(ACCELERATOR,
"BATcheckimprints(" ALGOBATFMT "): reusing persisted imprints\n",
ALGOBATPAR(b));
+ TRC_DEBUG(ACCELERATOR,
ALGOBATFMT " reusing persisted imprints\n", ALGOBATPAR(b));
MT_lock_unset(&b->batIdxLock);
bat_iterator_end(&bi);
return true;
@@ -373,7 +373,7 @@ BATcheckimprints(BAT *b)
bat_iterator_end(&bi);
ret = b->timprints != NULL;
if( ret)
- TRC_DEBUG(ACCELERATOR, "BATcheckimprints(" ALGOBATFMT "):
already has imprints\n", ALGOBATPAR(b));
+ TRC_DEBUG(ACCELERATOR, ALGOBATFMT " already has imprints\n",
ALGOBATPAR(b));
return ret;
}
@@ -428,8 +428,7 @@ BATimpsync(void *arg)
failed = ""; /* not failed */
}
}
- TRC_DEBUG(ACCELERATOR, "BATimpsync(" ALGOBATFMT "): "
- "imprints persisted "
+ TRC_DEBUG(ACCELERATOR, ALGOBATFMT " imprints persisted "
"(" LLFMT " usec)%s\n", ALGOBATPAR(b),
GDKusec() - t0, failed);
}
@@ -479,13 +478,13 @@ BATimprints(BAT *b)
MT_thread_setalgorithm("create imprints");
if (s2)
- TRC_DEBUG(ACCELERATOR, "BATimprints(b=" ALGOBATFMT
- "): creating imprints on parent "
+ TRC_DEBUG(ACCELERATOR, ALGOBATFMT
+ " creating imprints on parent "
ALGOBATFMT "\n",
ALGOBATPAR(s2), ALGOBATPAR(b));
else
- TRC_DEBUG(ACCELERATOR, "BATimprints(b=" ALGOBATFMT
- "): creating imprints\n",
+ TRC_DEBUG(ACCELERATOR, ALGOBATFMT
+ " creating imprints\n",
ALGOBATPAR(b));
s2 = NULL;
@@ -629,8 +628,21 @@ BATimprints(BAT *b)
((size_t *) imprints->imprints.base)[2] = (size_t)
imprints->dictcnt;
((size_t *) imprints->imprints.base)[3] = (size_t) bi.count;
imprints->imprints.parentid = b->batCacheid;
+ MT_lock_set(&b->theaplock);
+ if (b->batCount != bi.count) {
+ /* bat changed under our feet, can't use imprints */
+ MT_lock_unset(&b->theaplock);
+ MT_lock_unset(&b->batIdxLock);
+ bat_iterator_end(&bi);
+ HEAPfree(&imprints->imprints, true);
+ GDKfree(imprints);
+ GDKerror("Imprints creation aborted due to concurrent
change to bat\n");
+ TRC_DEBUG(ACCELERATOR, "failed imprints construction:
bat %s changed, " LLFMT " usec\n", BATgetId(b), GDKusec() - t0);
+ return GDK_FAIL;
+ }
ATOMIC_INIT(&imprints->imprints.refs, 1);
b->timprints = imprints;
+ MT_lock_unset(&b->theaplock);
if (BBP_status(b->batCacheid) & BBPEXISTING &&
!b->theap->dirty &&
!GDKinmemory(bi.h->farmid) &&
@@ -645,7 +657,8 @@ BATimprints(BAT *b)
}
}
- TRC_DEBUG(ACCELERATOR, "BATimprints(%s): imprints construction " LLFMT
" usec\n", BATgetId(b), GDKusec() - t0);
+ TRC_DEBUG(ACCELERATOR, "%s: imprints construction " LLFMT " usec\n",
+ BATgetId(b), GDKusec() - t0);
MT_lock_unset(&b->batIdxLock);
bat_iterator_end(&bi);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list