Changeset: 717a01bbc9d7 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/717a01bbc9d7
Modified Files:
        gdk/gdk_logger.c
        gdk/gdk_logger_internals.h
        sql/include/sql_catalog.h
        sql/storage/bat/bat_storage.c
        sql/storage/store.c
Branch: Jan2022
Log Message:

merged with jul2021


diffs (219 lines):

diff --git a/gdk/gdk_logger.c b/gdk/gdk_logger.c
--- a/gdk/gdk_logger.c
+++ b/gdk/gdk_logger.c
@@ -277,6 +277,10 @@ la_bat_clear(logger *lg, logaction *la, 
 
        if (bid < 0)
                return GDK_FAIL;
+       if (bid == 0) {
+               GDKerror("la_bat_clear failed to find bid for object %d\n", 
la->cid);
+               return GDK_FAIL;
+       }
 
        if (lg->debug & 1)
                fprintf(stderr, "#la_bat_clear %d\n", la->cid);
@@ -650,8 +654,10 @@ la_bat_updates(logger *lg, logaction *la
 
        if (bid < 0)
                return GDK_FAIL;
-       if (bid == 0)
-               return GDK_SUCCEED; /* ignore bats no longer in the catalog */
+       if (!bid) {
+               GDKerror("la_bat_updates failed to find bid for object %d\n", 
la->cid);
+               return GDK_FAIL;
+       }
 
        if (!lg->flushing) {
                b = BATdescriptor(bid);
@@ -755,6 +761,10 @@ la_bat_destroy(logger *lg, logaction *la
 
        if (bid < 0)
                return GDK_FAIL;
+       if (!bid) {
+               GDKerror("la_bat_destroy failed to find bid for object %d\n", 
la->cid);
+               return GDK_FAIL;
+       }
        if (bid && logger_del_bat(lg, bid) != GDK_SUCCEED)
                return GDK_FAIL;
        return GDK_SUCCEED;
@@ -1046,6 +1056,7 @@ logger_open_output(logger *lg)
        }
 
        lg->end = 0;
+       lg->drops = 0;
        if (!LOG_DISABLED(lg)) {
                char id[32];
                char *filename;
@@ -1648,8 +1659,6 @@ bm_subcommit(logger *lg)
        sizes[i] = BATcount(dcatalog);
        n[i++] = dcatalog->batCacheid;
 
-       if (cleanup < (lg->cnt/2))
-               cleanup = 0;
        if (cleanup && (rcnt=cleanup_and_swap(lg, r, bids, lids, cnts, 
catalog_bid, catalog_id, dcatalog, cleanup)) < 0) {
                GDKfree(n);
                GDKfree(r);
@@ -1668,7 +1677,7 @@ bm_subcommit(logger *lg)
                sizes[i] = BATcount(lg->seqs_id);
                n[i++] = lg->seqs_val->batCacheid;
        }
-       if (!cleanup && lg->seqs_id && BATcount(lg->dseqs) > 
(BATcount(lg->seqs_id)/2)) {
+       if (!cleanup && lg->seqs_id && BATcount(lg->dseqs) > 
(BATcount(lg->seqs_id)/2) && BATcount(lg->dseqs) > 10 ) {
                BAT *tids, *ids, *vals;
 
                tids = bm_tids(lg->seqs_id, lg->dseqs);
@@ -2140,6 +2149,8 @@ logger_new(int debug, const char *fn, co
                .funcdata = funcdata,
 
                .id = 0,
+               .drops = 0,
+               .end = 0,
                .saved_id = getBBPlogno(),              /* get saved log numer 
from bbp */
                .saved_tid = (int)getBBPtransid(),      /* get saved 
transaction id from bbp */
        };
@@ -2275,14 +2286,15 @@ logger_cleanup_range(logger *lg, ulng id
 gdk_return
 logger_activate(logger *lg)
 {
-       if (lg->end > 0 && lg->saved_id+1 == lg->id) {
+       gdk_return res = GDK_SUCCEED;
+
+       if (lg->drops > 100000 && lg->end > 0 && lg->saved_id+1 == lg->id) {
                lg->id++;
                logger_close_output(lg);
                /* start new file */
-               if (logger_open_output(lg) != GDK_SUCCEED)
-                       return GDK_FAIL;
+               res = logger_open_output(lg);
        }
-       return GDK_SUCCEED;
+       return res;
 }
 
 gdk_return
@@ -2619,6 +2631,11 @@ log_bat_transient(logger *lg, log_id id)
                logger_unlock(lg);
                return GDK_FAIL;
        }
+       if (!bid) {
+               GDKerror("log_bat_transient failed to find bid for object 
%d\n", id);
+               logger_unlock(lg);
+               return GDK_FAIL;
+       }
        l.flag = LOG_DESTROY;
        l.id = id;
 
@@ -2633,7 +2650,9 @@ log_bat_transient(logger *lg, log_id id)
        if (lg->debug & 1)
                fprintf(stderr, "#Logged destroyed bat (%d) %d\n", id,
                                bid);
-       lg->end += BATcount(BBPquickdesc(bid));
+       BUN cnt = BATcount(BBPquickdesc(bid));
+       lg->end += cnt;
+       lg->drops += cnt;
        gdk_return r =  logger_del_bat(lg, bid);
        logger_unlock(lg);
        return r;
@@ -2761,7 +2780,7 @@ new_logfile(logger *lg)
        p = (lng) getfilepos(getFile(lg->output_log));
        if (p == -1)
                return GDK_FAIL;
-       if (p > log_large || (lg->end*1024) > log_large) {
+       if (lg->drops > 100000 || p > log_large || (lg->end*1024) > log_large) {
                lg->id++;
                logger_close_output(lg);
                return logger_open_output(lg);
@@ -2791,8 +2810,7 @@ log_tend(logger *lg)
 
        if (log_write_format(lg, &l) != GDK_SUCCEED ||
            mnstr_flush(lg->output_log, MNSTR_FLUSH_DATA) ||
-           (!(GDKdebug & NOSYNCMASK) && mnstr_fsync(lg->output_log)) ||
-           new_logfile(lg) != GDK_SUCCEED) {
+           (!(GDKdebug & NOSYNCMASK) && mnstr_fsync(lg->output_log))) {
                TRC_CRITICAL(GDK, "write failed\n");
                return GDK_FAIL;
        }
@@ -2809,6 +2827,8 @@ log_tdone(logger *lg, ulng commit_ts)
                lg->current->last_tid = lg->tid;
                lg->current->last_ts = commit_ts;
        }
+       if (!LOG_DISABLED(lg) && new_logfile(lg) != GDK_SUCCEED)
+               GDKfatal("Could not create new log file\n");
        return GDK_SUCCEED;
 }
 
@@ -2971,6 +2991,10 @@ logger_find_bat(logger *lg, log_id id)
        logger_lock(lg);
        log_bid bid = internal_find_bat(lg, id, -1);
        logger_unlock(lg);
+       if (!bid) {
+               GDKerror("logger_find_bat failed to find bid for object %d\n", 
id);
+               return GDK_FAIL;
+       }
        return bid;
 }
 
diff --git a/gdk/gdk_logger_internals.h b/gdk/gdk_logger_internals.h
--- a/gdk/gdk_logger_internals.h
+++ b/gdk/gdk_logger_internals.h
@@ -26,6 +26,7 @@ struct logger {
        int saved_tid;          /* id of transaction which was flushed out 
(into BBP storage)  */
        bool flushing;
        bool flushnow;
+       ulng drops;
        logged_range *pending;
        logged_range *current;
 
diff --git a/sql/include/sql_catalog.h b/sql/include/sql_catalog.h
--- a/sql/include/sql_catalog.h
+++ b/sql/include/sql_catalog.h
@@ -201,6 +201,7 @@ typedef struct sql_base {
 } sql_base;
 
 #define isNew(x)          ((x)->base.new)
+#define isDeleted(x)      ((x)->base.deleted)
 
 extern void base_init(sql_allocator *sa, sql_base * b, sqlid id, bool isnew, 
const char *name);
 
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
@@ -4040,7 +4040,7 @@ log_update_col( sql_trans *tr, sql_chang
 {
        sql_column *c = (sql_column*)change->obj;
 
-       if (!isTempTable(c->t) && !tr->parent) {/* don't write save point 
commits */
+       if (!isDeleted(c->t) && !isTempTable(c->t) && !tr->parent) {/* don't 
write save point commits */
                storage *s = ATOMIC_PTR_GET(&c->t->data);
                sql_delta *d = ATOMIC_PTR_GET(&c->data);
                return tr_log_cs(tr, c->t, &d->cs, s->segs->h, c->base.id);
@@ -4153,7 +4153,7 @@ log_update_idx( sql_trans *tr, sql_chang
 {
        sql_idx *i = (sql_idx*)change->obj;
 
-       if (!isTempTable(i->t) && !tr->parent) { /* don't write save point 
commits */
+       if (!isDeleted(i->t) && !isTempTable(i->t) && !tr->parent) { /* don't 
write save point commits */
                storage *s = ATOMIC_PTR_GET(&i->t->data);
                sql_delta *d = ATOMIC_PTR_GET(&i->data);
                return tr_log_cs(tr, i->t, &d->cs, s->segs->h, i->base.id);
@@ -4197,7 +4197,7 @@ log_update_del( sql_trans *tr, sql_chang
 {
        sql_table *t = (sql_table*)change->obj;
 
-       if (!isTempTable(t) && !tr->parent) /* don't write save point commits */
+       if (!isDeleted(t) && !isTempTable(t) && !tr->parent) /* don't write 
save point commits */
                return log_storage(tr, t, ATOMIC_PTR_GET(&t->data), t->base.id);
        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
@@ -3644,7 +3644,7 @@ sql_trans_rollback(sql_trans *tr, bool c
                list_destroy(tr->changes);
                tr->changes = NULL;
                tr->logchanges = 0;
-       } else if (ATOMIC_GET(&store->nr_active) == 1) { /* just me cleanup */
+       } else {
                if (!commit_lock)
                        MT_lock_set(&store->commit);
                store_lock(store);
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to