Changeset: 8a06076b4de2 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/8a06076b4de2
Modified Files:
gdk/gdk_logger.c
monetdb5/modules/mal/mal_mapi.c
sql/backends/monet5/sql.c
sql/server/rel_optimize_proj.c
sql/server/rel_select.c
sql/storage/bat/bat_storage.c
sql/storage/store.c
Branch: default
Log Message:
Merge with Dec2023 branch.
diffs (165 lines):
diff --git a/gdk/gdk_logger.c b/gdk/gdk_logger.c
--- a/gdk/gdk_logger.c
+++ b/gdk/gdk_logger.c
@@ -3458,6 +3458,12 @@ log_tstart(logger *lg, bool flushnow, ul
{
rotation_lock(lg);
if (flushnow) {
+ if (file_id == NULL) {
+ /* special case: ask store_manager to rotate log file */
+ lg->file_age = 0;
+ rotation_unlock(lg);
+ return GDK_SUCCEED;
+ }
/* I am now the exclusive flusher */
if (ATOMIC_GET(&lg->nr_flushers)) {
/* I am waiting until all existing flushers are done */
@@ -3512,7 +3518,6 @@ log_printinfo(logger *lg)
rotation_lock(lg);
printf("current log file "ULLFMT", last handled log file "ULLFMT"\n",
lg->id, lg->saved_id);
- rotation_unlock(lg);
printf("current transaction id %d, saved transaction id %d\n",
lg->tid, lg->saved_tid);
printf("number of flushers: %d\n", (int) ATOMIC_GET(&lg->nr_flushers));
@@ -3525,4 +3530,5 @@ log_printinfo(logger *lg)
buf[0] = 0;
printf("pending range "ULLFMT": drops %"PRIu64", last_ts
%"PRIu64", flushed_ts %"PRIu64", refcount %"PRIu64"%s%s\n", p->id, (uint64_t)
ATOMIC_GET(&p->drops), (uint64_t) ATOMIC_GET(&p->last_ts), (uint64_t)
ATOMIC_GET(&p->flushed_ts), (uint64_t) ATOMIC_GET(&p->refcount), buf, p ==
lg->current ? " (current)" : "");
}
+ rotation_unlock(lg);
}
diff --git a/monetdb5/modules/atoms/xml.c b/monetdb5/modules/atoms/xml.c
--- a/monetdb5/modules/atoms/xml.c
+++ b/monetdb5/modules/atoms/xml.c
@@ -735,9 +735,9 @@ XMLxml2str(str *s, const xml *x)
}
str
-XMLstr2xml(xml *x, const char **s)
+XMLstr2xml(xml *x, const char *const*val)
{
- (void) s;
+ (void) val;
(void) x;
return createException(MAL, "xml.xml2str", SQLSTATE(HY005)
NO_LIBXML_FATAL);
}
diff --git a/monetdb5/modules/mal/mal_mapi.c b/monetdb5/modules/mal/mal_mapi.c
--- a/monetdb5/modules/mal/mal_mapi.c
+++ b/monetdb5/modules/mal/mal_mapi.c
@@ -527,7 +527,7 @@ start_listen(SOCKET *sockp, int *portp,
hints.ai_family = AF_INET6;
ipv6_vs6only = 0;
}
- char sport[8]; /* max "65535" */
+ char sport[16]; /* max "65535", but compiler
doesn't know */
snprintf(sport, sizeof(sport), "%d", *portp);
for (;;) { /* max twice */
int check = getaddrinfo(listenaddr, sport, &hints, &result);
diff --git a/sql/ChangeLog.Dec2023 b/sql/ChangeLog.Dec2023
--- a/sql/ChangeLog.Dec2023
+++ b/sql/ChangeLog.Dec2023
@@ -1,3 +1,12 @@
# ChangeLog file for sql
# This file is updated with Maddlog
+* Wed May 15 2024 Sjoerd Mullender <[email protected]>
+- When sys.persist_unlogged is called for a table, it may return that
+ zero rows were persisted. If this is because the call was done too
+ early, i.e. the table was recently created and the write-ahead log
+ where this was logged has not been processed yet, the call will
+ request an immediate write-ahead log rotation. This means that the
+ WAL will be processed as soon as possible and a new call to
+ sys.persist_unlogged soon after will likely return a positive result.
+
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
@@ -4471,6 +4471,16 @@ SQLpersist_unlogged(Client cntxt, MalBlk
GDKfree(sizes);
}
count = d_bi.count;
+ } else {
+ /* special case of log_tstart: third arg == NULL with second arg
+ * true is request to rotate log file ASAP */
+ store->logger_api.log_tstart(store, true, NULL);
+ /* special case for sql->debug: if 1024 bit is set,
+ * store_manager doesn't wait for 30 seconds of idle time before
+ * attempting to rotate */
+ MT_lock_set(&store->flush);
+ store->debug |= 1024;
+ MT_lock_unset(&store->flush);
}
bat_iterator_end(&d_bi);
diff --git a/sql/server/rel_optimize_proj.c b/sql/server/rel_optimize_proj.c
--- a/sql/server/rel_optimize_proj.c
+++ b/sql/server/rel_optimize_proj.c
@@ -907,7 +907,7 @@ rel_split_project_(visitor *v, sql_rel *
}
if (is_set(rel->op) || is_basetable(rel->op))
return rel;
- if (rel->l) {
+ if (rel->l && (rel->op != op_table || rel->flag != TRIGGER_WRAPPER)) {
rel->l = rel_split_project_(v, rel->l,
(is_topn(rel->op)||is_sample(rel->op)||is_ddl(rel->op)||is_modify(rel->op))?top:0);
if (!rel->l)
return NULL;
diff --git a/sql/server/rel_select.c b/sql/server/rel_select.c
--- a/sql/server/rel_select.c
+++ b/sql/server/rel_select.c
@@ -1515,9 +1515,9 @@ rel_column_ref(sql_query *query, sql_rel
return sql_error(sql, ERR_AMBIGUOUS,
SQLSTATE(42000) "SELECT: identifier '%s.%s' ambiguous", tname, cname);
if (v && !exp) {
if (*rel)
- *rel = rel_crossproduct(sql->sa, *rel,
v, op_join);
+ *rel = rel_crossproduct(sql->sa, *rel,
rel_dup(v), op_join);
else
- *rel = v;
+ *rel = rel_dup(v);
if (!(exp = rel_bind_column3(sql, *rel, sname,
tname, cname, f)) && sql->session->status == -ERR_AMBIGUOUS)
return NULL;
}
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
@@ -3741,7 +3741,7 @@ drop_del(sql_trans *tr, sql_table *t)
if (!isNew(t)) {
storage *bat = ATOMIC_PTR_GET(&t->data);
- trans_add_obj(tr, &t->base, bat, &tc_gc_del,
&commit_destroy_del, NOT_TO_BE_LOGGED(t) ? NULL : &log_destroy_del);
+ trans_add_obj(tr, &t->base, bat, &tc_gc_del,
&commit_destroy_del, isTempTable(t) ? NULL : &log_destroy_del);
}
return ok;
}
@@ -3751,7 +3751,7 @@ drop_col(sql_trans *tr, sql_column *c)
{
assert(!isNew(c));
sql_delta *d = ATOMIC_PTR_GET(&c->data);
- trans_add(tr, &c->base, d, &tc_gc_col, &commit_destroy_del,
NOT_TO_BE_LOGGED(c->t) ? NULL : &log_destroy_col);
+ trans_add(tr, &c->base, d, &tc_gc_col, &commit_destroy_del,
isTempTable(c->t) ? NULL : &log_destroy_col);
return LOG_OK;
}
@@ -3760,7 +3760,7 @@ drop_idx(sql_trans *tr, sql_idx *i)
{
assert(!isNew(i));
sql_delta *d = ATOMIC_PTR_GET(&i->data);
- trans_add(tr, &i->base, d, &tc_gc_idx, &commit_destroy_del,
NOT_TO_BE_LOGGED(i->t) ? NULL : &log_destroy_idx);
+ trans_add(tr, &i->base, d, &tc_gc_idx, &commit_destroy_del,
isTempTable(i->t) ? NULL : &log_destroy_idx);
return LOG_OK;
}
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -2417,7 +2417,10 @@ store_manager(sqlstore *store)
for (;;) {
const int idle = ATOMIC_GET(&GDKdebug) & FORCEMITOMASK ? 5000 :
IDLE_TIME * 1000000;
- if (store->debug&128 || ATOMIC_GET(&store->lastactive) + idle <
(ATOMIC_BASE_TYPE) GDKusec()) {
+ /* if debug bit 1024 is set, attempt immediate log activation
+ * and clear the bit */
+ if (store->debug&(128|1024) || ATOMIC_GET(&store->lastactive) +
idle < (ATOMIC_BASE_TYPE) GDKusec()) {
+ store->debug &= ~1024;
MT_lock_unset(&store->flush);
store_lock(store);
if (ATOMIC_GET(&store->nr_active) == 0) {
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]