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