Changeset: 60c436e54d46 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/60c436e54d46
Modified Files:
        gdk/gdk_bat.c
        gdk/gdk_bbp.c
        gdk/gdk_select.c
        sql/backends/monet5/sql.c
Branch: default
Log Message:

Merged with Jul2021


diffs (truncated from 646 to 300 lines):

diff --git a/gdk/gdk_bat.c b/gdk/gdk_bat.c
--- a/gdk/gdk_bat.c
+++ b/gdk/gdk_bat.c
@@ -1090,12 +1090,13 @@ BUNappendmulti(BAT *b, const void *value
                                b->tsorted = true;
                                b->trevsorted = true;
                                b->tkey = true;
-                               b->tseqbase = ((oid *) values)[0];
+                               b->tseqbase = count == 1 ? ((oid *) values)[0] 
: oid_nil;
                                b->tnil = false;
                                b->tnonil = true;
                        } else {
                                if (!is_oid_nil(b->tseqbase) &&
-                                   b->tseqbase + b->batCount + 1 != ((oid *) 
values)[0])
+                                   (count > 1 ||
+                                    b->tseqbase + b->batCount != ((oid *) 
values)[0]))
                                        b->tseqbase = oid_nil;
                                if (b->tsorted && ((oid *) 
b->theap->base)[b->batCount - 1] > ((oid *) values)[0]) {
                                        b->tsorted = false;
@@ -2295,11 +2296,11 @@ BATmode(BAT *b, bool transient)
                }
                MT_lock_set(&GDKswapLock(bid));
                if (!transient) {
-                       if (!(BBP_status(bid) & BBPDELETED))
+                       if (BBP_status(bid) & BBPDELETED) {
+                               BBP_status_on(bid, BBPEXISTING);
+                               BBP_status_off(bid, BBPDELETED);
+                       } else
                                BBP_status_on(bid, BBPNEW);
-                       else
-                               BBP_status_on(bid, BBPEXISTING);
-                       BBP_status_off(bid, BBPDELETED);
                } else if (!b->batTransient) {
                        if (!(BBP_status(bid) & BBPNEW))
                                BBP_status_on(bid, BBPDELETED);
diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c
--- a/gdk/gdk_bbp.c
+++ b/gdk/gdk_bbp.c
@@ -2258,12 +2258,13 @@ BBPcacheit(BAT *bn, bool lock)
        if (lock)
                MT_lock_set(&GDKswapLock(i));
        mode = (BBP_status(i) | BBPLOADED) & ~(BBPLOADING | BBPDELETING | 
BBPSWAPPED);
-       BBP_status_set(i, mode);
        BBP_desc(i) = bn;
 
        /* cache it! */
        BBP_cache(i) = bn;
 
+       BBP_status_set(i, mode);
+
        if (lock)
                MT_lock_unset(&GDKswapLock(i));
        return GDK_SUCCEED;
@@ -2289,10 +2290,10 @@ BBPuncacheit(bat i, bool unloaddesc)
                        if (BBP_cache(i)) {
                                TRC_DEBUG(BAT_, "uncache %d (%s)\n", (int) i, 
BBP_logical(i));
 
-                               BBP_cache(i) = NULL;
-
                                /* clearing bits can be done without the lock */
                                BBP_status_off(i, BBPLOADED);
+
+                               BBP_cache(i) = NULL;
                        }
                        if (unloaddesc) {
                                BBP_desc(i) = NULL;
@@ -2527,7 +2528,7 @@ incref(bat i, bool logical, bool lock)
                                break;
                        /* the BATs is "unstable", try again */
                        MT_lock_unset(&GDKswapLock(i));
-                       MT_sleep_ms(KITTENNAP);
+                       BBPspin(i, __func__, BBPUNSTABLE|BBPLOADING);
                }
        }
        /* we have the lock */
@@ -2843,7 +2844,7 @@ getBBPdescriptor(bat i, bool lock)
                while (BBP_status(i) & BBPWAITING) {    /* wait for bat to be 
loaded by other thread */
                        if (lock)
                                MT_lock_unset(&GDKswapLock(i));
-                       MT_sleep_ms(KITTENNAP);
+                       BBPspin(i, __func__, BBPWAITING);
                        if (lock)
                                MT_lock_set(&GDKswapLock(i));
                }
@@ -2907,7 +2908,7 @@ BBPsave(BAT *b)
                /* wait until save in other thread completes */
                if (lock)
                        MT_lock_unset(&GDKswapLock(bid));
-               BBPspin(bid, "BBPsave", BBPSAVING);
+               BBPspin(bid, __func__, BBPSAVING);
        } else {
                /* save it */
                unsigned flags = BBPSAVING;
@@ -3060,7 +3061,7 @@ dirty_bat(bat *i, bool subcommit)
 {
        if (BBPvalid(*i)) {
                BAT *b;
-               BBPspin(*i, "dirty_bat", BBPSAVING);
+               BBPspin(*i, __func__, BBPSAVING);
                b = BBP_cache(*i);
                if (b != NULL) {
                        if ((BBP_status(*i) & BBPNEW) &&
diff --git a/gdk/gdk_firstn.c b/gdk/gdk_firstn.c
--- a/gdk/gdk_firstn.c
+++ b/gdk/gdk_firstn.c
@@ -1127,7 +1127,7 @@ BATfirstn_grouped_with_groups(BAT **topn
 
        MT_thread_setalgorithm(__func__);
        if (distinct) {
-               BAT *bn1, *bn2, *bn3, *bn4, *bn5, *bn6, *bn7, *bn8;
+               BAT *bn1, *bn2, *bn3, *bn4, *bn5, *bn6, *bn7;
                if (BATgroup(&bn1, &bn2, NULL, b, s, g, NULL, NULL) != 
GDK_SUCCEED)
                        return GDK_FAIL;
                bn3 = BATproject(bn2, b);
@@ -1155,13 +1155,12 @@ BATfirstn_grouped_with_groups(BAT **topn
                        BBPunfix(bn1->batCacheid);
                        return GDK_FAIL;
                }
-               rc = BATleftjoin(&bn8, &bn7, bn1, bn6, NULL, NULL, false, 
BUN_NONE);
+               rc = BATleftjoin(&bn7, NULL, bn1, bn6, NULL, NULL, false, 
BUN_NONE);
                BBPunfix(bn6->batCacheid);
                if (rc != GDK_SUCCEED)
                        return GDK_FAIL;
+               bn = BATproject(bn7, s);
                BBPunfix(bn7->batCacheid);
-               bn = BATproject(bn8, s);
-               BBPunfix(bn8->batCacheid);
                if (bn == NULL)
                        return GDK_FAIL;
        } else {
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,25 @@ 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);
+                       BBPunfix(s1->batCacheid);
+                       BBPunfix(s2->batCacheid);
+                       BBPunfix(s3->batCacheid);
+                       BBPunfix(s4->batCacheid);
+                       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 +661,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);
 
diff --git a/gdk/gdk_select.c b/gdk/gdk_select.c
--- a/gdk/gdk_select.c
+++ b/gdk/gdk_select.c
@@ -1940,7 +1940,7 @@ BATselect(BAT *b, BAT *s, const void *tl
                /* use imprints if
                 *   i) bat is persistent, or parent is persistent
                 *  ii) it is not an equi-select, and
-                * iii) is not var-sized.
+                * iii) imprints are supported.
                 */
                tmp = NULL;
                Imprints *imprints = NULL;
diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c
--- a/sql/backends/monet5/sql.c
+++ b/sql/backends/monet5/sql.c
@@ -2052,7 +2052,7 @@ DELTAbat(bat *result, const bat *col, co
                throw(MAL, "sql.delta", SQLSTATE(HY002) RUNTIME_OBJECT_MISSING);
        if ((res = COLcopy(c, c->ttype, true, TRANSIENT)) == NULL) {
                BBPunfix(c->batCacheid);
-               throw(MAL, "sql.delta", SQLSTATE(45002) "Cannot create copy of 
delta structure");
+               throw(MAL, "sql.delta", GDK_EXCEPTION);
        }
        BBPunfix(c->batCacheid);
 
@@ -2071,7 +2071,7 @@ DELTAbat(bat *result, const bat *col, co
                BBPunfix(u_id->batCacheid);
                BBPunfix(u_val->batCacheid);
                BBPunfix(res->batCacheid);
-               throw(MAL, "sql.delta", SQLSTATE(45002) "Cannot access delta 
structure");
+               throw(MAL, "sql.delta", GDK_EXCEPTION);
        }
        BBPunfix(u_id->batCacheid);
        BBPunfix(u_val->batCacheid);
@@ -2109,7 +2109,7 @@ DELTAsub(bat *result, const bat *col, co
                if (!cminu) {
                        BBPunfix(c->batCacheid);
                        BBPunfix(u_id->batCacheid);
-                       throw(MAL, "sql.delta", SQLSTATE(HY013) MAL_MALLOC_FAIL 
" intermediate");
+                       throw(MAL, "sql.delta", GDK_EXCEPTION);
                }
                res = BATproject(cminu, c);
                BBPunfix(c->batCacheid);
@@ -2117,7 +2117,7 @@ DELTAsub(bat *result, const bat *col, co
                cminu = NULL;
                if (!res) {
                        BBPunfix(u_id->batCacheid);
-                       throw(MAL, "sql.delta", SQLSTATE(HY013) MAL_MALLOC_FAIL 
" intermediate" );
+                       throw(MAL, "sql.delta", GDK_EXCEPTION);
                }
                c = res;
 
@@ -2132,7 +2132,7 @@ DELTAsub(bat *result, const bat *col, co
                        BBPunfix(u_id->batCacheid);
                        if (!u) {
                                BBPunfix(c->batCacheid);
-                               throw(MAL, "sql.delta", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
+                               throw(MAL, "sql.delta", GDK_EXCEPTION);
                        }
 
                        /* check selected updated values against candidates */
@@ -2148,12 +2148,20 @@ DELTAsub(bat *result, const bat *col, co
                        if (cminu == NULL) {
                                BBPunfix(c->batCacheid);
                                BBPunfix(u->batCacheid);
-                               throw(MAL, "sql.delta", SQLSTATE(HY013) 
MAL_MALLOC_FAIL);
+                               throw(MAL, "sql.delta", GDK_EXCEPTION);
                        }
+                       BAT *nres;
+                       if ((nres = COLcopy(res, res->ttype, true, TRANSIENT)) 
== NULL) {
+                               BBPunfix(res->batCacheid);
+                               BBPunfix(u->batCacheid);
+                               BBPunfix(cminu->batCacheid);
+                               throw(MAL, "sql.delta", GDK_EXCEPTION);
+                       }
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to