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