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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list