Changeset: 1af86ad39743 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=1af86ad39743
Modified Files:
gdk/gdk_logger.c
gdk/gdk_logger.h
sql/storage/bat/bat_logger.c
Branch: transaction-replication
Log Message:
The shared logger should pick up where it left of.
Reading the last processed shared transaction id from the log_shared file store
locally on the slave.
diffs (126 lines):
diff --git a/gdk/gdk_logger.c b/gdk/gdk_logger.c
--- a/gdk/gdk_logger.c
+++ b/gdk/gdk_logger.c
@@ -111,9 +111,6 @@ typedef struct logformat_t {
lng nr;
} logformat;
-#define LOGFILE "log"
-#define LOGFILE_SHARED "log_shared"
-
static int bm_commit(logger *lg);
static int tr_grow(trans *tr);
@@ -1576,14 +1573,14 @@ logger_new(int debug, char *fn, char *lo
return NULL;
}
if (lg->debug & 1) {
- fprintf(stderr, "#logger_new dir=%s\n", lg->dir);
+ fprintf(stderr, "#logger_new dir set to %s\n", lg->dir);
}
if (shared) {
logger_set_logdir_path(filename, fn, local_logdir);
- /* set the slave logdir as well */
+ /* set the local logdir as well */
if ((lg->fn = GDKstrdup(fn)) == NULL ||
- (lg->local_dir = GDKstrdup(filename)) == NULL) {
+ (lg->local_dir = GDKstrdup(filename)) == NULL) {
fprintf(stderr, "!ERROR: logger_new: strdup failed\n");
GDKfree(lg->fn);
GDKfree(lg->dir);
@@ -1592,7 +1589,33 @@ logger_new(int debug, char *fn, char *lo
return NULL;
}
if (lg->debug & 1) {
- fprintf(stderr, "#logger_new slave_dir=%s\n", lg->dir);
+ fprintf(stderr, "#logger_new local_dir set to %s\n",
lg->local_dir);
+ }
+
+ /* get last shared logger id from the local log dir,
+ * but first check if the file exists */
+ char shared_log_filename[BUFSIZ];
+ snprintf(shared_log_filename, BUFSIZ, "%s%s", lg->local_dir,
LOGFILE_SHARED);
+
+ if (access(shared_log_filename, F_OK) != -1) {
+ lng res = logger_read_last_transaction_id(lg,
lg->local_dir, LOGFILE_SHARED);
+ if (res == LOG_ERR) {
+ fprintf(stderr, "!ERROR: logger_new: failed to
read previous shared logger id form %s\n", LOGFILE_SHARED);
+ GDKfree(lg->fn);
+ GDKfree(lg->dir);
+ GDKfree(lg->local_dir);
+ GDKfree(lg);
+ return NULL;
+ }
+
+ lg->id = res;
+ if (lg->debug & 1) {
+ fprintf(stderr, "#logger_new last shared
transactions is read form %s is %lld\n", shared_log_filename, lg->id);
+ }
+ } else {
+ if (lg->debug & 1) {
+ fprintf(stderr, "#logger_new no previous %s
found\n", LOGFILE_SHARED);
+ }
}
}
@@ -1814,15 +1837,15 @@ logger_changes(logger *lg)
return lg->changes;
}
-/* Read the last recorded transactions id from the LOGFILE */
+/* Read the last recorded transactions id from a logfile */
lng
-logger_read_last_transaction_id(logger *lg)
+logger_read_last_transaction_id(logger *lg, char *dir, char *logger_file)
{
char filename[BUFSIZ];
FILE *fp;
int id;
- snprintf(filename, BUFSIZ, "%s%s", lg->dir, LOGFILE);
+ snprintf(filename, BUFSIZ, "%s%s", dir, logger_file);
if ((fp = fopen(filename, "r")) == NULL) {
fprintf(stderr, "!ERROR: logger_read_last_transaction_id:
unable to open file %s\n", filename);
goto error;
diff --git a/gdk/gdk_logger.h b/gdk/gdk_logger.h
--- a/gdk/gdk_logger.h
+++ b/gdk/gdk_logger.h
@@ -23,6 +23,9 @@
#define LOG_OK 0
#define LOG_ERR (-1)
+#define LOGFILE "log"
+#define LOGFILE_SHARED "log_shared"
+
typedef struct logaction {
int type; /* type of change */
lng nr;
@@ -118,7 +121,7 @@ gdk_export int logger_exit(logger *lg);
gdk_export int logger_restart(logger *lg);
gdk_export int logger_cleanup(logger *lg, int keep_persisted_log_files);
gdk_export lng logger_changes(logger *lg);
-gdk_export lng logger_read_last_transaction_id(logger *lg);
+gdk_export lng logger_read_last_transaction_id(logger *lg, char *dir, char
*logger_file);
gdk_export int logger_sequence(logger *lg, int seq, lng *id);
gdk_export int logger_reload(logger *lg);
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
@@ -405,13 +405,13 @@ bl_changes(void)
static lng
bl_read_last_transaction_id_shared(void)
{
- return logger_read_last_transaction_id(bat_logger_shared);
+ return logger_read_last_transaction_id(bat_logger_shared,
bat_logger_shared->dir, LOGFILE);
}
static lng
bl_get_transaction_drift_shared(void)
{
- lng res = logger_read_last_transaction_id(bat_logger_shared);
+ lng res = bl_read_last_transaction_id_shared();
if (res != LOG_ERR) {
return MIN(res, GDK_int_max) - MIN(bat_logger_shared->id,
GDK_int_max);
}
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list