Changeset: adad935552d3 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=adad935552d3 Modified Files: gdk/gdk_logger.c gdk/gdk_logger.h monetdb5/modules/kernel/logger.c sql/storage/bat/bat_logger.c sql/storage/sql_storage.h sql/storage/store.c Branch: HTM Log Message:
Pass and store global (HTM) transaction id when pre-commiting and persising transaction in the WAL Set the htm_id to -1 for all WAL operations that do not require it diffs (233 lines): diff --git a/gdk/gdk_logger.c b/gdk/gdk_logger.c --- a/gdk/gdk_logger.c +++ b/gdk/gdk_logger.c @@ -75,6 +75,7 @@ #define LOG_USE 8 #define LOG_CLEAR 9 #define LOG_SEQ 10 +#define LOG_GLOBALCOMMIT 11 static char *log_commands[] = { NULL, @@ -88,12 +89,14 @@ static char *log_commands[] = { "LOG_USE", "LOG_CLEAR", "LOG_SEQ", + "LOG_GLOBALCOMMIT", }; typedef struct logformat_t { char flag; int tid; lng nr; + lng htm_id; } logformat; #define LOGFILE "log" @@ -1739,6 +1742,7 @@ log_bat_persists(logger *lg, BAT *b, con } l.flag = flag; l.tid = lg->tid; + l.htm_id = -1; lg->changes++; if (log_write_format(lg, &l) == LOG_ERR || log_write_string(lg, name) == LOG_ERR) @@ -1799,6 +1803,7 @@ log_bat_transient(logger *lg, const char l.flag = LOG_DESTROY; l.tid = lg->tid; l.nr = 0; + l.htm_id = -1; lg->changes++; /* if this is a snapshot bat, we need to skip all changes */ @@ -1852,6 +1857,7 @@ log_delta(logger *lg, BAT *uid, BAT *uva l.tid = lg->tid; l.nr = (BUNlast(uval) - BUNfirst(uval)); + l.htm_id = -1; lg->changes += l.nr; if (l.nr) { @@ -1895,6 +1901,7 @@ log_bat(logger *lg, BAT *b, const char * l.tid = lg->tid; l.nr = (BUNlast(b) - b->batInserted); + l.htm_id = -1; lg->changes += l.nr; if (l.nr) { @@ -1968,6 +1975,7 @@ log_bat_clear(logger *lg, const char *na l.nr = 1; l.tid = lg->tid; + l.htm_id = -1; lg->changes += l.nr; l.flag = LOG_CLEAR; @@ -1982,16 +1990,33 @@ log_bat_clear(logger *lg, const char *na } int -log_tstart(logger *lg) +log_tstart(logger *lg, lng htm_id) { logformat l; l.flag = LOG_START; l.tid = ++lg->tid; l.nr = lg->tid; + l.htm_id = htm_id; if (lg->debug & 1) - fprintf(stderr, "#log_tstart %d\n", lg->tid); + fprintf(stderr, "#log_tstart %d:" LLFMT "\n", lg->tid, htm_id); + + return log_write_format(lg, &l); +} + +int +log_globalpersist(logger *lg, lng htm_id) +{ + logformat l; + + l.flag = LOG_GLOBALCOMMIT; + l.tid = lg->tid; + l.nr = lg->tid; + l.htm_id = htm_id; + + if (lg->debug & 1) + fprintf(stderr, "#log_globalpersist %d:" LLFMT "\n", lg->tid, htm_id); return log_write_format(lg, &l); } @@ -2096,6 +2121,7 @@ log_tend(logger *lg) l.flag = LOG_END; l.tid = lg->tid; l.nr = lg->tid; + l.htm_id = -1; if (res || log_write_format(lg, &l) == LOG_ERR || mnstr_flush(lg->log) || @@ -2118,6 +2144,7 @@ log_abort(logger *lg) l.flag = LOG_END; l.tid = lg->tid; l.nr = -1; + l.htm_id = -1; if (log_write_format(lg, &l) == LOG_ERR) return LOG_ERR; @@ -2133,6 +2160,7 @@ log_sequence_(logger *lg, int seq, lng v l.flag = LOG_SEQ; l.tid = lg->tid; l.nr = seq; + l.htm_id = -1; if (lg->debug & 1) fprintf(stderr, "#log_sequence_ (%d," LLFMT ")\n", seq, val); diff --git a/gdk/gdk_logger.h b/gdk/gdk_logger.h --- a/gdk/gdk_logger.h +++ b/gdk/gdk_logger.h @@ -107,9 +107,10 @@ gdk_export int log_bat_persists(logger * gdk_export int log_bat_transient(logger *lg, const char *n); gdk_export int log_delta(logger *lg, BAT *uid, BAT *uval, const char *n); -gdk_export int log_tstart(logger *lg); /* TODO return transaction id */ +gdk_export int log_tstart(logger *lg, lng htm_id); /* TODO return transaction id */ gdk_export int log_tend(logger *lg); gdk_export int log_abort(logger *lg); +gdk_export int log_globalpersist(logger *lg, lng htm_id); gdk_export int log_sequence(logger *lg, int seq, lng id); diff --git a/monetdb5/modules/kernel/logger.c b/monetdb5/modules/kernel/logger.c --- a/monetdb5/modules/kernel/logger.c +++ b/monetdb5/modules/kernel/logger.c @@ -152,7 +152,7 @@ int log_tstart_wrap(logger *L ) { logger *l = *(logger**)L; - if (l && log_tstart(l) == LOG_OK) + if (l && log_tstart(l, -1) == LOG_OK) return GDK_SUCCEED; return GDK_FAIL; } 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 @@ -174,9 +174,9 @@ bl_log_isnew(void) } static int -bl_tstart(void) +bl_tstart(lng htm_id) { - return log_tstart(bat_logger); + return log_tstart(bat_logger, htm_id); } static int @@ -191,6 +191,12 @@ bl_sequence(int seq, lng id) return log_sequence(bat_logger, seq, id); } +static int +bl_globalpersist(lng htm_id) +{ + return log_globalpersist(bat_logger, htm_id); +} + int bat_logger_init( logger_functions *lf ) { @@ -204,5 +210,6 @@ bat_logger_init( logger_functions *lf ) lf->log_tstart = bl_tstart; lf->log_tend = bl_tend; lf->log_sequence = bl_sequence; + lf->log_globalpersist = bl_globalpersist; return LOG_OK; } 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 @@ -245,9 +245,10 @@ typedef int (*logger_changes_fptr)(void) typedef int (*logger_get_sequence_fptr) (int seq, lng *id); typedef int (*log_isnew_fptr)(void); -typedef int (*log_tstart_fptr) (void); +typedef int (*log_tstart_fptr) (lng htm_id); typedef int (*log_tend_fptr) (void); typedef int (*log_sequence_fptr) (int seq, lng id); +typedef int (*log_globalpersist_fptr) (lng htm_id); typedef struct logger_functions { logger_create_fptr create; @@ -262,6 +263,7 @@ typedef struct logger_functions { log_tstart_fptr log_tstart; log_tend_fptr log_tend; log_sequence_fptr log_sequence; + log_globalpersist_fptr log_globalpersist; } logger_functions; extern logger_functions logger_funcs; diff --git a/sql/storage/store.c b/sql/storage/store.c --- a/sql/storage/store.c +++ b/sql/storage/store.c @@ -3356,7 +3356,7 @@ sql_trans_precommit(sql_trans *tr) result = rollforward_trans(tr, R_SNAPSHOT); if (result == LOG_OK) - result = logger_funcs.log_tstart(); + result = logger_funcs.log_tstart(tr->htm_id); if (result == LOG_OK) result = rollforward_trans(tr, R_LOG); if (result == LOG_OK && prev_oid != store_oid) @@ -3384,6 +3384,9 @@ sql_trans_persistcommit(sql_trans *tr) of failure, the log will be replayed. */ result = rollforward_trans(tr, R_APPLY); } + if (result == LOG_OK) { + result = logger_funcs.log_globalpersist(tr->htm_id); + } return result; } _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list