Changeset: 024f8fa4d433 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=024f8fa4d433
Modified Files:
        sql/storage/bat/bat_logger.c
        sql/storage/sql_storage.h
        sql/storage/store.c
Branch: hot-snapshot
Log Message:

Plumbing for sql.snapshot into bat_logger.c


diffs (122 lines):

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
@@ -342,6 +342,14 @@ bl_reload_shared(void)
        return logger_reload(bat_logger_shared) == GDK_SUCCEED ? LOG_OK : 
LOG_ERR;
 }
 
+static const char* 
+bl_snapshot(stream *plan)
+{
+       mnstr_printf(plan, "Here's the plan: make a snapshot!\n");
+       return NULL;
+}
+
+
 void
 bat_logger_init( logger_functions *lf )
 {
@@ -351,6 +359,7 @@ bat_logger_init( logger_functions *lf )
        lf->cleanup = bl_cleanup;
        lf->changes = bl_changes;
        lf->get_sequence = bl_get_sequence;
+       lf->snapshot = bl_snapshot;
        lf->log_isnew = bl_log_isnew;
        lf->log_tstart = bl_tstart;
        lf->log_tend = bl_tend;
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
@@ -285,6 +285,7 @@ typedef lng (*logger_read_last_transacti
 typedef lng (*logger_get_transaction_drift_fptr)(void);
 
 typedef int (*logger_reload_fptr) (void);
+typedef const char* (*logger_snapshot_fptr)(stream *plan);
 
 typedef int (*log_isnew_fptr)(void);
 typedef int (*log_tstart_fptr) (void);
@@ -304,6 +305,7 @@ typedef struct logger_functions {
        logger_get_transaction_drift_fptr get_transaction_drift;
 
        logger_reload_fptr reload;
+       logger_snapshot_fptr snapshot;
 
        log_isnew_fptr log_isnew;
        log_tstart_fptr log_tstart;
@@ -331,7 +333,7 @@ extern void store_apply_deltas(void);
 extern void store_flush_log(void);
 extern void store_resume_log(void);
 extern void store_suspend_log(void);
-extern char *store_hot_snapshot(const char *dir);
+extern const char *store_hot_snapshot(const char *dir);
 
 extern void store_manager(void);
 extern void idle_manager(void);
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -1788,11 +1788,61 @@ store_suspend_log(void)
        MT_lock_unset(&bs_lock);
 }
 
-char *
+const char *
 store_hot_snapshot(const char *dir)
 {
-       fprintf(stderr, "#hot_snapshot %s\n", dir);
-       return NULL;
+       stream *plan_stream = NULL;
+       const char *err;
+       int reenable_logging = 0;
+
+       if (!logger_funcs.snapshot) {
+               err = "backend does not support snapshots";
+               goto end;
+       }
+       plan_stream = file_wastream(stderr, "stderr");
+       if (!plan_stream) {
+               err = "file_wastream(stderr)";
+               goto end;
+       }
+
+       fprintf(stderr, "#suspend logger for hot_snapshot %s\n", dir);
+       MT_lock_set(&bs_lock);
+       reenable_logging = logging_enabled;
+       logging_enabled = 0;
+       while (currently_logging) {
+               /* logging in progress, wait for it to finish */
+               MT_lock_unset(&bs_lock);
+               MT_sleep_ms(100);
+               if (GDKexiting()) {
+                       err = "server is exiting";
+                       goto end;  /* note lock not held */
+               }
+               MT_lock_set(&bs_lock);
+       }
+
+       /* WE STILL HAVE THE LOCK */
+       fprintf(stderr, "#begin prepare hot_snapshot %s\n", dir);
+       err = logger_funcs.snapshot(plan_stream);
+       MT_lock_unset(&bs_lock);
+
+       if (err)
+               goto end;  /* note lock not held */
+       fprintf(stderr, "#end prepare hot_snapshot %s\n", dir);
+
+       fprintf(stderr, "#begin execute hot_snapshot %s\n", dir);
+       (void)dir;
+       fprintf(stderr, "#end execute hot_snapshot %s\n", dir);
+
+end:
+       if (reenable_logging) {
+               fprintf(stderr, "#resume logger for hot_snapshot %s\n", dir);
+               MT_lock_set(&bs_lock);
+               logging_enabled = reenable_logging;
+               MT_lock_unset(&bs_lock);
+       }
+       if (plan_stream)
+               close_stream(plan_stream);
+       return err;
 }
 
 static int
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to