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

Reply via email to