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