Changeset: 58c413e884db for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/58c413e884db
Modified Files:
        clients/Tests/exports.stable.out
        gdk/gdk_join.c
        gdk/gdk_select.c
        monetdb5/mal/mal_interpreter.c
        monetdb5/mal/mal_resource.c
        sql/backends/monet5/sql.c
        sql/backends/monet5/sql_upgrades.c
Branch: default
Log Message:

Merged with Jul2021


diffs (truncated from 4833 to 300 lines):

diff --git a/clients/Tests/exports.stable.out b/clients/Tests/exports.stable.out
--- a/clients/Tests/exports.stable.out
+++ b/clients/Tests/exports.stable.out
@@ -206,6 +206,7 @@ BAT *BATunmask(BAT *b);
 BBPrec *BBP[N_BBPINIT];
 gdk_return BBPaddfarm(const char *dirname, uint32_t rolemask, bool logerror);
 void BBPclear(bat bid);
+void BBPcold(bat i);
 BAT *BBPdescriptor(bat b);
 int BBPfix(bat b);
 bat BBPindex(const char *nme);
@@ -542,6 +543,7 @@ gdk_return log_delta(logger *lg, BAT *ui
 gdk_return log_sequence(logger *lg, int seq, lng id);
 gdk_return log_tend(logger *lg);
 gdk_return log_tstart(logger *lg, ulng commit_ts, bool flush);
+gdk_return logger_activate(logger *lg);
 lng logger_changes(logger *lg);
 logger *logger_create(int debug, const char *fn, const char *logdir, int 
version, preversionfix_fptr prefuncp, postversionfix_fptr postfuncp, void 
*funcdata);
 void logger_destroy(logger *lg);
diff --git a/common/utils/matomic.h b/common/utils/matomic.h
--- a/common/utils/matomic.h
+++ b/common/utils/matomic.h
@@ -402,7 +402,7 @@ ATOMIC_OR(ATOMIC_TYPE *var, ATOMIC_BASE_
        ATOMIC_BASE_TYPE old;
        pthread_mutex_lock(&var->lck);
        old = var->val;
-       var->val += val;
+       var->val |= val;
        pthread_mutex_unlock(&var->lck);
        return old;
 }
@@ -414,7 +414,7 @@ ATOMIC_AND(ATOMIC_TYPE *var, ATOMIC_BASE
        ATOMIC_BASE_TYPE old;
        pthread_mutex_lock(&var->lck);
        old = var->val;
-       var->val += val;
+       var->val &= val;
        pthread_mutex_unlock(&var->lck);
        return old;
 }
diff --git a/gdk/gdk_bat.c b/gdk/gdk_bat.c
--- a/gdk/gdk_bat.c
+++ b/gdk/gdk_bat.c
@@ -201,31 +201,31 @@ gettailname(const BAT *b)
 void
 settailname(Heap *restrict tail, const char *restrict physnme, int tt, int 
width)
 {
-       strconcat_len(tail->filename, sizeof(tail->filename), physnme,
-                     ".tail", NULL);
        if (tt == TYPE_str) {
                switch (width) {
                case 1:
                        strconcat_len(tail->filename,
                                      sizeof(tail->filename), physnme,
                                      ".tail1", NULL);
-                       break;
+                       return;
                case 2:
                        strconcat_len(tail->filename,
                                      sizeof(tail->filename), physnme,
                                      ".tail2", NULL);
-                       break;
+                       return;
 #if SIZEOF_VAR_T == 8
                case 4:
                        strconcat_len(tail->filename,
                                      sizeof(tail->filename), physnme,
                                      ".tail4", NULL);
-                       break;
+                       return;
 #endif
                default:
                        break;
                }
        }
+       strconcat_len(tail->filename, sizeof(tail->filename), physnme,
+                     ".tail", NULL);
 }
 
 /*
@@ -240,7 +240,7 @@ settailname(Heap *restrict tail, const c
  * filenames.
  */
 BAT *
-COLnew(oid hseq, int tt, BUN cap, role_t role)
+COLnew_intern(oid hseq, int tt, BUN cap, role_t role, uint16_t width)
 {
        BAT *bn;
 
@@ -272,15 +272,18 @@ COLnew(oid hseq, int tt, BUN cap, role_t
 
        if (ATOMstorage(tt) == TYPE_msk)
                cap /= 8;       /* 8 values per byte */
-       else if (tt == TYPE_str)
+       else if (tt == TYPE_str) {
+               if (width != 0)
+                       bn->twidth = width;
                settailname(bn->theap, BBP_physical(bn->batCacheid), tt, 
bn->twidth);
+       }
 
        /* alloc the main heaps */
        if (tt && HEAPalloc(bn->theap, cap, bn->twidth, ATOMsize(bn->ttype)) != 
GDK_SUCCEED) {
                goto bailout;
        }
 
-       if (bn->tvheap && ATOMheap(tt, bn->tvheap, cap) != GDK_SUCCEED) {
+       if (bn->tvheap && width == 0 && ATOMheap(tt, bn->tvheap, cap) != 
GDK_SUCCEED) {
                goto bailout;
        }
        DELTAinit(bn);
@@ -303,6 +306,12 @@ COLnew(oid hseq, int tt, BUN cap, role_t
 }
 
 BAT *
+COLnew(oid hseq, int tt, BUN cap, role_t role)
+{
+       return COLnew_intern(hseq, tt, cap, role, 0);
+}
+
+BAT *
 BATdense(oid hseq, oid tseq, BUN cnt)
 {
        BAT *bn;
@@ -1755,7 +1764,7 @@ BATsetcount(BAT *b, BUN cnt)
 
        b->batCount = cnt;
        b->batDirtydesc = true;
-       b->theap->dirty |= b->ttype != TYPE_void;
+       b->theap->dirty |= b->ttype != TYPE_void && b->theap->parentid == 
b->batCacheid;
        if (b->theap->parentid == b->batCacheid)
                b->theap->free = tailsize(b, cnt);
        if (b->ttype == TYPE_void)
diff --git a/gdk/gdk_batop.c b/gdk/gdk_batop.c
--- a/gdk/gdk_batop.c
+++ b/gdk/gdk_batop.c
@@ -340,7 +340,7 @@ insert_string_bat(BAT *b, BAT *n, struct
                        p = canditer_next(ci) - hseq;
                        tp = BUNtvar(ni, p);
                        if (bunfastappVAR(b, tp) != GDK_SUCCEED)
-                               goto bunins_failed;
+                               return GDK_FAIL;
                        r++;
                }
        } else {
@@ -393,7 +393,7 @@ insert_string_bat(BAT *b, BAT *n, struct
                                b->batCount++;
                        } else {
                                if (bunfastappVAR(b, tp) != GDK_SUCCEED)
-                                       goto bunins_failed;
+                                       return GDK_FAIL;
                        }
                        r++;
                }
@@ -405,10 +405,6 @@ insert_string_bat(BAT *b, BAT *n, struct
                HASHappend(b, r, Tbase(b) + VarHeapVal(Tloc(b, 0), r, 
b->twidth));
        }
        return GDK_SUCCEED;
-      bunins_failed:
-       b->tvarsized = true;
-       b->ttype = TYPE_str;
-       return GDK_FAIL;
 }
 
 static gdk_return
diff --git a/gdk/gdk_bbp.c b/gdk/gdk_bbp.c
--- a/gdk/gdk_bbp.c
+++ b/gdk/gdk_bbp.c
@@ -1558,6 +1558,7 @@ BBPdump(void)
                if (BBP_refs(i) == 0 && BBP_lrefs(i) == 0)
                        continue;
                BAT *b = BBP_desc(i);
+               unsigned status = BBP_status(i);
                fprintf(stderr,
                        "# %d: " ALGOOPTBATFMT " "
                        "refs=%d lrefs=%d "
@@ -1566,7 +1567,7 @@ BBPdump(void)
                        ALGOOPTBATPAR(b),
                        BBP_refs(i),
                        BBP_lrefs(i),
-                       BBP_status(i),
+                       status,
                        BBP_cache(i) ? "" : " not cached");
                if (b->batSharecnt > 0)
                        fprintf(stderr, " shares=%d", b->batSharecnt);
@@ -1581,7 +1582,7 @@ BBPdump(void)
                                        HEAPmemsize(b->theap),
                                        HEAPvmsize(b->theap),
                                        b->theap->farmid,
-                                       b->theap->dirty ? "(Dirty)" : "");
+                                       status & BBPSWAPPED ? "(Swapped)" : 
b->theap->dirty ? "(Dirty)" : "");
                                if (BBP_logical(i) && BBP_logical(i)[0] == '.') 
{
                                        cmem += HEAPmemsize(b->theap);
                                        cvm += HEAPvmsize(b->theap);
@@ -1836,7 +1837,7 @@ BBPinsert(BAT *bn)
        bn->batCacheid = i;
        bn->creator_tid = MT_getpid();
 
-       BBP_status_set(i, BBPDELETING);
+       BBP_status_set(i, BBPDELETING|BBPHOT);
        BBP_cache(i) = NULL;
        BBP_desc(i) = NULL;
        BBP_refs(i) = 1;        /* new bats have 1 pin */
@@ -1896,7 +1897,7 @@ BBPcacheit(BAT *bn, bool lock)
 
        if (lock)
                MT_lock_set(&GDKswapLock(i));
-       mode = (BBP_status(i) | BBPLOADED) & ~(BBPLOADING | BBPDELETING);
+       mode = (BBP_status(i) | BBPLOADED) & ~(BBPLOADING | BBPDELETING | 
BBPSWAPPED);
        BBP_status_set(i, mode);
        BBP_desc(i) = bn;
 
@@ -2111,6 +2112,18 @@ BBPspin(bat i, const char *s, unsigned e
        }
 }
 
+void
+BBPcold(bat i)
+{
+       if (!is_bat_nil(i)) {
+               BAT *b = BBP_cache(i);
+               if (b == NULL)
+                       b = BBP_desc(i);
+               if (b == NULL || b->batRole == PERSISTENT)
+                       BBP_status_off(i, BBPHOT);
+       }
+}
+
 /* This function can fail if the input parameter (i) is incorrect
  * (unlikely), of if the bat is a view, this is a physical (not
  * logical) incref (i.e. called through BBPfix(), and it is the first
@@ -2136,7 +2149,7 @@ incref(bat i, bool logical, bool lock)
         * reference, getting the parent BAT descriptor is
         * superfluous, but not too expensive, so we do it anyway. */
        if (!logical && (b = BBP_desc(i)) != NULL) {
-               if (b->theap->parentid != i) {
+               if (b->theap && b->theap->parentid != i) {
                        pb = BATdescriptor(b->theap->parentid);
                        if (pb == NULL)
                                return 0;
@@ -2178,19 +2191,21 @@ incref(bat i, bool logical, bool lock)
                tp = tvp = 0;
                refs = ++BBP_lrefs(i);
        } else {
-               tp = b->theap->parentid == i ? 0 : b->theap->parentid;
+               tp = b->theap == NULL || b->theap->parentid == i ? 0 : 
b->theap->parentid;
                assert(tp >= 0);
                tvp = b->tvheap == 0 || b->tvheap->parentid == i ? 0 : 
b->tvheap->parentid;
                refs = ++BBP_refs(i);
+               unsigned flag = BBPHOT;
                if (refs == 1 && (tp || tvp)) {
                        /* If this is a view, we must load the parent
                         * BATs, but we must do that outside of the
                         * lock.  Set the BBPLOADING flag so that
                         * other threads will wait until we're
                         * done. */
-                       BBP_status_on(i, BBPLOADING);
+                       flag |= BBPLOADING;
                        load = true;
                }
+               BBP_status_on(i, flag);
        }
        if (lock)
                MT_lock_unset(&GDKswapLock(i));
@@ -2304,23 +2319,21 @@ decref(bat i, bool logical, bool release
                        if (b && refs == 0) {
                                tp = VIEWtparent(b);
                                tvp = VIEWvtparent(b);
+                               if (tp || tvp)
+                                       BBP_status_on(i, BBPHOT);
                        }
                }
        }
 
-       /* Make sure we do not unload bats which have more rows than marked 
persistent */
-       if (b && BBP_lrefs(i) > 0 && DELTAdirty(b)) {
-               b->batDirtydesc = true;
-               b->theap->dirty = true;
-               if (b->tvheap)
-                       b->tvheap->dirty = true;
-       }
-
        /* we destroy transients asap and unload persistent bats only
         * if they have been made cold or are not dirty */
        if (BBP_refs(i) > 0 ||
            (BBP_lrefs(i) > 0 &&
-            (b == NULL || BATdirty(b) || !(BBP_status(i) & BBPPERSISTENT) || 
GDKinmemory(b->theap->farmid)))) {
+            (b == NULL ||
+             (BATdirty(b) && (BBP_status(i) & BBPHOT)) ||
+             (BBP_status(i) & BBPSYNCING) || /* no swap during (sub)commit */
+             (BBP_status(i) & (BBPPERSISTENT | BBPHOT)) == BBPHOT ||
+             GDKinmemory(b->theap->farmid)))) {
                /* bat cannot be swapped out */
        } else if (b ? b->batSharecnt == 0 : (BBP_status(i) & BBPTMP)) {
                /* bat will be unloaded now. set the UNLOADING bit
@@ -2329,7 +2342,6 @@ decref(bat i, bool logical, bool release
                assert((BBP_status(i) & BBPUNLOADING) == 0);
                TRC_DEBUG(BAT_, "%s set to unloading BAT %d\n", func, i);
                BBP_status_on(i, BBPUNLOADING);
-               assert(!b || BBP_lrefs(i) == 0 || !DELTAdirty(b));
                swap = true;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to