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

Reply via email to