Changeset: d86209ff2a0d for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/d86209ff2a0d
Modified Files:
        clients/Tests/exports.stable.out
        gdk/gdk_logger.c
        gdk/gdk_logger.h
        sql/storage/bat/bat_logger.c
        sql/storage/bat/bat_storage.c
        sql/storage/objectset.c
        sql/storage/sql_storage.h
        sql/storage/store.c
Branch: Jul2021
Log Message:

when the store manager is cleaning out pending changes (ie not other activity), 
lets activate
the logger too do some possible cleanup as well.


diffs (152 lines):

diff --git a/clients/Tests/exports.stable.out b/clients/Tests/exports.stable.out
--- a/clients/Tests/exports.stable.out
+++ b/clients/Tests/exports.stable.out
@@ -546,6 +546,7 @@ logger *logger_create(int debug, const c
 void logger_destroy(logger *lg);
 log_bid logger_find_bat(logger *lg, log_id id);
 gdk_return logger_flush(logger *lg, ulng saved_id);
+gdk_return logger_activate(logger *lg);
 int logger_sequence(logger *lg, int seq, lng *id);
 log_level_t lvl_per_component[];
 void *mdlopen(const char *library, int mode);
diff --git a/gdk/gdk_logger.c b/gdk/gdk_logger.c
--- a/gdk/gdk_logger.c
+++ b/gdk/gdk_logger.c
@@ -2098,6 +2098,27 @@ logger_cleanup_range(logger *lg)
 }
 
 gdk_return
+logger_activate(logger *lg)
+{
+       if (LOG_DISABLED(lg)) {
+               if (lg->saved_id+1 == lg->id) {
+                       lg->saved_id++;
+                       lg->saved_tid = lg->tid;
+                       logger_cleanup_range(lg);
+               }
+               return GDK_SUCCEED;
+       }
+       if (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;
+       }
+       return GDK_SUCCEED;
+}
+
+gdk_return
 logger_flush(logger *lg, ulng ts)
 {
        ulng lid = logger_next_logfile(lg, ts);
diff --git a/gdk/gdk_logger.h b/gdk/gdk_logger.h
--- a/gdk/gdk_logger.h
+++ b/gdk/gdk_logger.h
@@ -50,6 +50,7 @@ gdk_export log_bid old_logger_find_bat(o
 gdk_export logger *logger_create(int debug, const char *fn, const char 
*logdir, int version, preversionfix_fptr prefuncp, postversionfix_fptr 
postfuncp, void *funcdata);
 gdk_export void logger_destroy(logger *lg);
 gdk_export gdk_return logger_flush(logger *lg, ulng saved_id); /* try too 
flush a part of the logs, including the passed saved_id transaction id */
+gdk_export gdk_return logger_activate(logger *lg); /* when the server has been 
idle, activate logger too make more cleanup possible */
 
 gdk_export lng logger_changes(logger *lg);
 gdk_export int logger_sequence(logger *lg, int seq, lng *id);
diff --git a/sql/storage/bat/bat_logger.c b/sql/storage/bat/bat_logger.c
--- a/sql/storage/bat/bat_logger.c
+++ b/sql/storage/bat/bat_logger.c
@@ -2325,6 +2325,14 @@ bl_flush(sqlstore *store, lng save_id)
 }
 
 static int
+bl_activate(sqlstore *store)
+{
+       if (store->logger)
+               return logger_activate(store->logger) == GDK_SUCCEED ? LOG_OK : 
LOG_ERR;
+       return LOG_OK;
+}
+
+static int
 bl_changes(sqlstore *store)
 {
        return (int) MIN(logger_changes(store->logger), GDK_int_max);
@@ -2745,6 +2753,7 @@ bat_logger_init( logger_functions *lf )
        lf->create = bl_create;
        lf->destroy = bl_destroy;
        lf->flush = bl_flush;
+       lf->activate = bl_activate;
        lf->changes = bl_changes;
        lf->get_sequence = bl_get_sequence;
        lf->log_isnew = bl_log_isnew;
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
@@ -2969,18 +2969,19 @@ claim_segment(sql_trans *tr, sql_table *
        assert(s->segs);
        ulng oldest = store_oldest(tr->store);
        BUN slot = 0;
-       int reused = 0;
+       int reused = 0, enabled = 0;
 
        /* naive vacuum approach, iterator through segments, check for large 
enough deleted segments
         * or create new segment at the end */
        /* when claiming an segment use atomic CAS */
+       if (enabled)
        for (segment *seg = s->segs->h, *p = NULL; seg && ok == LOG_OK; p = 
seg, seg = seg->next) {
                if (seg->deleted && seg->ts < oldest && (seg->end-seg->start) 
>= cnt) { /* re-use old deleted or rolledback append */
 
                        if ((seg->end - seg->start) >= cnt) {
 
                                /* if previous is claimed before we could 
simply adjust the end/start */
-                               if (p && p->ts == tr->tid && !p->deleted) {
+                               if (enabled && p && p->ts == tr->tid && 
!p->deleted) {
                                        slot = p->end;
                                        p->end += cnt;
                                        seg->start += cnt;
diff --git a/sql/storage/objectset.c b/sql/storage/objectset.c
--- a/sql/storage/objectset.c
+++ b/sql/storage/objectset.c
@@ -1101,9 +1101,11 @@ os_obj_intransaction(objectset *os, stru
        versionhead  *n = find_id(os, b->id);
 
        if (n) {
-                objectversion *ov = get_valid_object_id(tr, n->ov);
-                if (ov && os_atmc_get_state(ov) == active && ov->ts == tr->tid)
-                        return true;
+               //objectversion *ov = get_valid_object_id(tr, n->ov);
+               objectversion *ov = n->ov;
+
+               if (ov && os_atmc_get_state(ov) == active && ov->ts == tr->tid)
+                       return true;
        }
        return false;
 }
diff --git a/sql/storage/sql_storage.h b/sql/storage/sql_storage.h
--- a/sql/storage/sql_storage.h
+++ b/sql/storage/sql_storage.h
@@ -243,6 +243,7 @@ typedef int (*logger_create_fptr) (struc
 
 typedef void (*logger_destroy_fptr) (struct sqlstore *store);
 typedef int (*logger_flush_fptr) (struct sqlstore *store, lng save_id);
+typedef int (*logger_activate_fptr) (struct sqlstore *store);
 typedef int (*logger_cleanup_fptr) (struct sqlstore *store);
 
 typedef int (*logger_changes_fptr)(struct sqlstore *store);
@@ -273,6 +274,7 @@ typedef struct logger_functions {
        logger_create_fptr create;
        logger_destroy_fptr destroy;
        logger_flush_fptr flush;
+       logger_activate_fptr activate;
 
        logger_changes_fptr changes;
        logger_get_sequence_fptr get_sequence;
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -2045,6 +2045,7 @@ store_manager(sqlstore *store)
                                        ulng oldest = store_timestamp(store)+1;
                                        store_pending_changes(store, oldest, 
oldest);
                                }
+                               store->logger_api.activate(store); /* rotate 
too new log file */
                                store_unlock(store);
                        }
                        if (GDKexiting())
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to