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 <sjo...@acm.org>
+- 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 -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to