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