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
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to