Changeset: 02c1a00c83ec for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/02c1a00c83ec
Modified Files:
gdk/gdk_logger.c
gdk/gdk_select.c
monetdb5/mal/mal_client.c
monetdb5/mal/mal_runtime.c
monetdb5/optimizer/opt_mitosis.c
sql/backends/monet5/sql_execute.c
sql/backends/monet5/sql_scenario.c
sql/storage/bat/bat_storage.c
sql/storage/store.c
Branch: default
Log Message:
Merge with Sep2022 branch.
diffs (truncated from 408 to 300 lines):
diff --git a/gdk/gdk_logger.c b/gdk/gdk_logger.c
--- a/gdk/gdk_logger.c
+++ b/gdk/gdk_logger.c
@@ -1615,11 +1615,12 @@ cleanup_and_swap(logger *lg, int *r, con
return rcnt;
}
+/* this function is called with log_lock() held; it releases the lock
+ * before returning */
static gdk_return
bm_subcommit(logger *lg)
{
BUN p, q;
- log_lock(lg);
BAT *catalog_bid = lg->catalog_bid;
BAT *catalog_id = lg->catalog_id;
BAT *dcatalog = lg->dcatalog;
@@ -1936,6 +1937,8 @@ log_load(int debug, const char *fn, cons
BBPretain(lg->catalog_id->batCacheid);
BBPretain(lg->dcatalog->batCacheid);
+ log_lock(lg);
+ /* bm_subcommit releases the lock */
if (bm_subcommit(lg) != GDK_SUCCEED) {
/* cannot commit catalog, so remove log */
MT_remove(filename);
@@ -3081,7 +3084,7 @@ bm_commit(logger *lg)
fprintf(stderr, "#bm_commit: create %d (%d)\n",
bid, BBP_lrefs(bid));
}
- log_unlock(lg);
+ /* bm_subcommit releases the lock */
return bm_subcommit(lg);
}
diff --git a/gdk/gdk_select.c b/gdk/gdk_select.c
--- a/gdk/gdk_select.c
+++ b/gdk/gdk_select.c
@@ -1722,7 +1722,7 @@ BATselect(BAT *b, BAT *s, const void *tl
if ((oidxh = b->torderidx) != NULL)
HEAPincref(oidxh);
MT_lock_unset(&b->batIdxLock);
- if (oidxh == NULL && pb) {
+ if (oidxh == NULL && pb != NULL) {
(void) BATcheckorderidx(pb);
MT_lock_set(&pb->batIdxLock);
if ((oidxh = pb->torderidx) != NULL) {
@@ -1944,7 +1944,7 @@ BATselect(BAT *b, BAT *s, const void *tl
} else if (b->thash->nunique == bi.count)
estimate = 1;
}
- if (estimate == BUN_NONE && (bi.key || (pb != NULL && pb->tkey))) {
+ if (estimate == BUN_NONE && (bi.key || (pb != NULL && pbi.key))) {
/* exact result size in special cases */
if (equi) {
estimate = 1;
@@ -2051,9 +2051,7 @@ BATselect(BAT *b, BAT *s, const void *tl
if (!equi &&
/* DISABLES CODE */ (0) && imprintable(bi.type) &&
(!bi.transient ||
- (parent != 0 &&
- pb != NULL &&
- !pbi.transient)) &&
+ (pb != NULL && !pbi.transient)) &&
BATimprints(b) == GDK_SUCCEED) {
if (pb != NULL) {
MT_lock_set(&pb->batIdxLock);
diff --git a/monetdb5/mal/mal_client.c b/monetdb5/mal/mal_client.c
--- a/monetdb5/mal/mal_client.c
+++ b/monetdb5/mal/mal_client.c
@@ -557,9 +557,11 @@ MCactiveClients(void)
int active = 0;
Client cntxt = mal_clients;
+ MT_lock_set(&mal_contextLock);
for(cntxt = mal_clients; cntxt<mal_clients+MAL_MAXCLIENTS; cntxt++){
active += (cntxt->idle == 0 && cntxt->mode == RUNCLIENT);
}
+ MT_lock_unset(&mal_contextLock);
return active;
}
@@ -574,14 +576,19 @@ MCmemoryClaim(void)
Client cntxt = mal_clients;
- for(cntxt = mal_clients; cntxt<mal_clients+MAL_MAXCLIENTS; cntxt++)
+ MT_lock_set(&mal_contextLock);
+ for(cntxt = mal_clients; cntxt<mal_clients+MAL_MAXCLIENTS; cntxt++) {
if( cntxt->idle == 0 && cntxt->mode == RUNCLIENT){
if(cntxt->memorylimit){
claim += cntxt->memorylimit;
active ++;
- } else
+ } else {
+ MT_lock_unset(&mal_contextLock);
return GDK_mem_maxsize;
+ }
}
+ }
+ MT_lock_unset(&mal_contextLock);
if(active == 0 || claim * LL_CONSTANT(1048576) >= GDK_mem_maxsize)
return GDK_mem_maxsize;
return claim * LL_CONSTANT(1048576);
diff --git a/monetdb5/mal/mal_runtime.c b/monetdb5/mal/mal_runtime.c
--- a/monetdb5/mal/mal_runtime.c
+++ b/monetdb5/mal/mal_runtime.c
@@ -228,7 +228,6 @@ runtimeProfileInit(Client cntxt, MalBlkP
}
// add new invocation
- cntxt->idle = 0;
for (i = 0; i < qsize; i++) {
size_t j = qlast;
if (++qlast >= qsize)
@@ -259,6 +258,9 @@ runtimeProfileInit(Client cntxt, MalBlkP
}
}
MT_lock_unset(&mal_delayLock);
+ MT_lock_set(&mal_contextLock);
+ cntxt->idle = 0;
+ MT_lock_unset(&mal_contextLock);
}
/*
@@ -290,7 +292,10 @@ runtimeProfileFinish(Client cntxt, MalBl
QRYqueue[i].ticks = GDKusec() - QRYqueue[i].ticks;
updateUserStats(cntxt, mb, QRYqueue[i].ticks,
QRYqueue[i].start, QRYqueue[i].finished, QRYqueue[i].query);
// assume that the user is now idle
+ MT_lock_unset(&mal_delayLock);
+ MT_lock_set(&mal_contextLock);
cntxt->idle = time(0);
+ MT_lock_unset(&mal_contextLock);
found = true;
break;
}
@@ -313,9 +318,9 @@ runtimeProfileFinish(Client cntxt, MalBl
}
}
}
+ MT_lock_unset(&mal_delayLock);
}
- MT_lock_unset(&mal_delayLock);
}
/* Used by mal_reset to do the grand final clean up of this area before
MonetDB exits */
diff --git a/monetdb5/optimizer/opt_mitosis.c b/monetdb5/optimizer/opt_mitosis.c
--- a/monetdb5/optimizer/opt_mitosis.c
+++ b/monetdb5/optimizer/opt_mitosis.c
@@ -152,7 +152,9 @@ OPTmitosisImplementation(Client cntxt, M
* Take into account the number of client connections,
* because all user together are responsible for resource contentions
*/
+ MT_lock_set(&mal_contextLock);
cntxt->idle = 0; // this one is definitely not idle
+ MT_lock_unset(&mal_contextLock);
/* This code was used to experiment with block sizes, mis-using the
memorylimit variable
if (cntxt->memorylimit){
diff --git a/sql/backends/monet5/sql_execute.c
b/sql/backends/monet5/sql_execute.c
--- a/sql/backends/monet5/sql_execute.c
+++ b/sql/backends/monet5/sql_execute.c
@@ -336,22 +336,28 @@ SQLrun(Client c, mvc *m)
if( m->emod & mod_trace){
if((msg = SQLsetTrace(c,mb)) == MAL_SUCCEED) {
setVariableScope(mb);
+ MT_lock_set(&mal_contextLock);
c->idle = 0;
c->lastcmd = time(0);
+ MT_lock_unset(&mal_contextLock);
msg = runMAL(c, mb, 0, 0);
stopTrace(c);
}
} else {
setVariableScope(mb);
+ MT_lock_set(&mal_contextLock);
c->idle = 0;
c->lastcmd = time(0);
+ MT_lock_unset(&mal_contextLock);
msg = runMAL(c, mb, 0, 0);
}
resetMalBlk(mb);
}
/* after the query has been finished we enter the idle state */
+ MT_lock_set(&mal_contextLock);
c->idle = time(0);
c->lastcmd = 0;
+ MT_lock_unset(&mal_contextLock);
MT_thread_setworking(NULL);
return msg;
}
diff --git a/sql/backends/monet5/sql_scenario.c
b/sql/backends/monet5/sql_scenario.c
--- a/sql/backends/monet5/sql_scenario.c
+++ b/sql/backends/monet5/sql_scenario.c
@@ -860,8 +860,11 @@ SQLreader(Client c)
break;
commit_done = true;
}
- if (m->session->tr && m->session->tr->active)
+ if (m->session->tr && m->session->tr->active) {
+ MT_lock_set(&mal_contextLock);
c->idle = 0;
+ MT_lock_unset(&mal_contextLock);
+ }
if (go && in->pos >= in->len) {
ssize_t rd;
@@ -884,10 +887,12 @@ SQLreader(Client c)
if (msg)
break;
commit_done = true;
+ MT_lock_set(&mal_contextLock);
if (c->idle == 0 && (m->session->tr ==
NULL || !m->session->tr->active)) {
/* now the session is idle */
c->idle = time(0);
}
+ MT_lock_unset(&mal_contextLock);
}
if (go && ((!blocked && mnstr_write(c->fdout,
c->prompt, c->promptlength, 1) != 1) || mnstr_flush(c->fdout,
MNSTR_FLUSH_DATA))) {
diff --git a/sql/storage/bat/bat_storage.c b/sql/storage/bat/bat_storage.c
--- a/sql/storage/bat/bat_storage.c
+++ b/sql/storage/bat/bat_storage.c
@@ -305,10 +305,11 @@ segments2cs(sql_trans *tr, segments *seg
b->tkey = false;
b->tnokey[0] = 0;
b->tnokey[1] = 0;
+ b->theap->dirty = true;
+ BUN cnt = BATcount(b);
MT_lock_unset(&b->theaplock);
uint32_t *restrict dst;
- BUN cnt = BATcount(b);
MT_rwlock_wrlock(&b->thashlock);
for (; s ; s=s->next) {
if (s->start >= nr)
@@ -344,9 +345,6 @@ segments2cs(sql_trans *tr, segments *seg
}
assert(lnr==0);
}
- MT_lock_set(&b->theaplock);
- b->theap->dirty = true;
- MT_lock_unset(&b->theaplock);
size_t lnr = s->end-s->start;
size_t pos = s->start;
dst = (uint32_t *) Tloc(b, 0) + (pos/32);
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -2206,6 +2206,18 @@ store_exit(sqlstore *store)
MT_lock_unset(&store->flush);
MT_lock_unset(&store->lock);
sa_destroy(sa);
+ ATOMIC_DESTROY(&store->nr_active);
+ ATOMIC_DESTROY(&store->lastactive);
+ ATOMIC_DESTROY(&store->timestamp);
+ ATOMIC_DESTROY(&store->transaction);
+ ATOMIC_DESTROY(&store->function_counter);
+ MT_lock_destroy(&store->lock);
+ MT_lock_destroy(&store->commit);
+ MT_lock_destroy(&store->flush);
+ for(int i = 0; i<NR_TABLE_LOCKS; i++)
+ MT_lock_destroy(&store->table_locks[i]);
+ for(int i = 0; i<NR_COLUMN_LOCKS; i++)
+ MT_lock_destroy(&store->column_locks[i]);
_DELETE(store);
}
diff --git a/sql/test/merge-partitions/Tests/All
b/sql/test/merge-partitions/Tests/All
--- a/sql/test/merge-partitions/Tests/All
+++ b/sql/test/merge-partitions/Tests/All
@@ -32,3 +32,4 @@ mergepart30
mergepart31
mergepart32
mergepart33
+mergepart34
diff --git a/sql/test/merge-partitions/Tests/mergepart34.test
b/sql/test/merge-partitions/Tests/mergepart34.test
new file mode 100644
--- /dev/null
+++ b/sql/test/merge-partitions/Tests/mergepart34.test
@@ -0,0 +1,126 @@
+
+statement ok
+CREATE MERGE TABLE table1 (a int) PARTITION BY RANGE ON (a)
+
+statement ok
+CREATE MERGE TABLE table2 (a int);
+
+statement ok
+CREATE TABLE another1 (a int)
+
+statement ok
+CREATE TABLE another2 (a int)
+
+statement ok
+CREATE TABLE another3 (a int)
+
+statement ok
+ALTER TABLE table1 ADD TABLE another1 AS PARTITION FROM 10 TO 10
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]