Changeset: 1d892f70b280 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=1d892f70b280 Modified Files: gdk/gdk_logger.c gdk/gdk_logger.h monetdb5/modules/kernel/logger.c sql/server/sql_mvc.c sql/storage/bat/bat_logger.c sql/storage/restrict/restrict_logger.c sql/storage/sql_storage.h sql/storage/store.c Branch: transaction-replication Log Message:
Fix mixup with read-only database and separate read-only loggers Pass a flag to indicate that a the create logger should be read-only Do not modify the contents of the logdir if the logger is read-only diffs (226 lines): diff --git a/gdk/gdk_logger.c b/gdk/gdk_logger.c --- a/gdk/gdk_logger.c +++ b/gdk/gdk_logger.c @@ -1221,7 +1221,7 @@ logger_find_persistent_catalog(logger *l } static logger * -logger_new(int debug, char *fn, logger_settings *log_settings, int version, preversionfix_fptr prefuncp, postversionfix_fptr postfuncp) +logger_new(int debug, char *fn, logger_settings *log_settings, int version, preversionfix_fptr prefuncp, postversionfix_fptr postfuncp, int readonly) { int id = LOG_SID; logger *lg = (struct logger *) GDKmalloc(sizeof(struct logger)); @@ -1300,7 +1300,7 @@ logger_new(int debug, char *fn, logger_s snprintf(bak, BUFSIZ, "%s_catalog_bid", fn); catalog_bid = BBPindex(bak); - if (catalog_bid == 0) { + if (catalog_bid == 0 && !readonly) { if (!logger_create_catalog_file(debug, lg, fn, fp, filename, bak)) { goto error; } @@ -1310,6 +1310,7 @@ logger_new(int debug, char *fn, logger_s goto error; } } + seqs_id = logger_find_bat(lg, "seqs_id"); if (seqs_id == 0) { lg->seqs_id = logbat_new(TYPE_int, 1); @@ -1372,15 +1373,12 @@ logger_new(int debug, char *fn, logger_s BBPrename(lg->freed->batCacheid, bak); if (fp != NULL) { -#if SIZEOF_OID == 8 - char cvfile[BUFSIZ]; -#endif - if (check_version(lg, fp)) { goto error; } -#if SIZEOF_OID == 8 +/* Do not do conversion is running in readonly mode */ +#if SIZEOF_OID == 8 && !readonly /* When a file *_32-64-convert exists in the database, * it was left there by the BBP initialization code * when it did a conversion of 32-bit OIDs to 64 bits @@ -1407,6 +1405,7 @@ logger_new(int debug, char *fn, logger_s * what we expect, the conversion was apparently done * already, and so we can delete the file. */ + char cvfile[BUFSIZ]; snprintf(cvfile, sizeof(cvfile), "%sconvert-32-64", lg->dir); snprintf(bak, sizeof(bak), "%s_32-64-convert", fn); { @@ -1485,9 +1484,9 @@ logger_new(int debug, char *fn, logger_s } logger * -logger_create(int debug, char *fn, logger_settings *log_settings, int version, preversionfix_fptr prefuncp, postversionfix_fptr postfuncp) +logger_create(int debug, char *fn, logger_settings *log_settings, int version, preversionfix_fptr prefuncp, postversionfix_fptr postfuncp, int readonly) { - logger *lg = logger_new(debug, fn, log_settings, version, prefuncp, postfuncp); + logger *lg = logger_new(debug, fn, log_settings, version, prefuncp, postfuncp, readonly); if (!lg) return NULL; diff --git a/gdk/gdk_logger.h b/gdk/gdk_logger.h --- a/gdk/gdk_logger.h +++ b/gdk/gdk_logger.h @@ -82,10 +82,10 @@ typedef struct logger { * if shared_logdir and shared_drift_threshold are set, * as well as if readonly = 1, the instance is assumed to be in slave mode*/ typedef struct logger_settings { - char *logdir; /* server (the regular) write-ahead log directory */ + char *logdir; /* (the regular) server write-ahead log directory */ char *shared_logdir; /* shared write-ahead log directory */ int shared_drift_threshold; /* shared write-ahead log drift threshold */ - int readonly; /* flag if the db is in read-only mode */ + int create_readonly; /* flag if a read-only logger should be created */ } logger_settings; #define BATSIZE 0 @@ -109,7 +109,7 @@ typedef int log_bid; /* the sequence identifier for frontend objects */ #define OBJ_SID 1 -gdk_export logger *logger_create(int debug, char *fn, logger_settings *log_settings, int version, preversionfix_fptr prefuncp, postversionfix_fptr postfuncp); +gdk_export logger *logger_create(int debug, char *fn, logger_settings *log_settings, int version, preversionfix_fptr prefuncp, postversionfix_fptr postfuncp, int readonly); gdk_export void logger_destroy(logger *lg); gdk_export int logger_exit(logger *lg); gdk_export int logger_restart(logger *lg); 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 @@ -98,7 +98,7 @@ logger_create_wrap( logger *L, int *debu * -1 by default, meaning it should be ignored, since it is not set */ log_settings->shared_drift_threshold = GDKgetenv_int("gdk_shared_drift_threshold", -1); - logger *l = logger_create(*debug, *fn, log_settings, *version, NULL, NULL); + logger *l = logger_create(*debug, *fn, log_settings, *version, NULL, NULL, 0); if (l) { *(logger**)L = l; diff --git a/sql/server/sql_mvc.c b/sql/server/sql_mvc.c --- a/sql/server/sql_mvc.c +++ b/sql/server/sql_mvc.c @@ -51,7 +51,12 @@ mvc_init(int debug, store_type store, in * -1 by default, meaning it should be ignored, since it is not set */ log_settings->shared_drift_threshold = GDKgetenv_int("gdk_shared_drift_threshold", -1); - log_settings->readonly = ro; + /* log is not readonly by default */ + log_settings->create_readonly = 0; + /* check if all parameters for a shared log are set */ + if (ro && log_settings->shared_logdir != NULL && log_settings->shared_drift_threshold >= 0) { + log_settings->create_readonly = 1; + } mvc_debug = debug&4; if (mvc_debug) { @@ -65,7 +70,7 @@ mvc_init(int debug, store_type store, in scanner_init_keywords(); - if ((first = store_init(debug, store, su, log_settings, stk)) < 0) { + if ((first = store_init(debug, store, ro, su, log_settings, stk)) < 0) { fprintf(stderr, "!mvc_init: unable to create system tables\n"); return -1; } 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 @@ -275,11 +275,11 @@ bl_postversion( void *lg) } static int -bl_create(int debug, logger_settings *log_settings, int cat_version) +bl_create(int debug, logger_settings *log_settings, int cat_version, int readonly_logger) { if (bat_logger) return LOG_ERR; - bat_logger = logger_create(debug, "sql", log_settings, cat_version, bl_preversion, bl_postversion); + bat_logger = logger_create(debug, "sql", log_settings, cat_version, bl_preversion, bl_postversion, readonly_logger); if (bat_logger) return LOG_OK; return LOG_ERR; diff --git a/sql/storage/restrict/restrict_logger.c b/sql/storage/restrict/restrict_logger.c --- a/sql/storage/restrict/restrict_logger.c +++ b/sql/storage/restrict/restrict_logger.c @@ -27,7 +27,7 @@ bl_create(int debug, logger_settings *lo { if (restrict_logger) return LOG_ERR; - restrict_logger = logger_create(debug, "sql", log_settings, catalog_version, NULL, NULL); + restrict_logger = logger_create(debug, "sql", log_settings, catalog_version, NULL, NULL, 0); if (restrict_logger) return LOG_OK; return LOG_ERR; 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 @@ -247,7 +247,7 @@ typedef struct store_functions { extern store_functions store_funcs; -typedef int (*logger_create_fptr) (int debug, logger_settings *log_settings, int catalog_version); +typedef int (*logger_create_fptr) (int debug, logger_settings *log_settings, int catalog_version, int readonly_logger); typedef void (*logger_destroy_fptr) (void); typedef int (*logger_restart_fptr) (void); @@ -290,7 +290,7 @@ extern void res_tables_destroy(res_table extern res_table *res_tables_find(res_table *results, int res_id); extern int - store_init(int debug, store_type store, int singleuser, logger_settings *log_settings, backend_stack stk); + store_init(int debug, store_type store, int readonly, int singleuser, logger_settings *log_settings, backend_stack stk); extern void store_exit(void); extern void store_apply_deltas(void); diff --git a/sql/storage/store.c b/sql/storage/store.c --- a/sql/storage/store.c +++ b/sql/storage/store.c @@ -1288,7 +1288,7 @@ store_schema_number(void) } int -store_init(int debug, store_type store, int singleuser, logger_settings *log_settings, backend_stack stk) +store_init(int debug, store_type store, int readonly, int singleuser, logger_settings *log_settings, backend_stack stk) { sqlid id = 0; lng lng_store_oid; @@ -1316,10 +1316,17 @@ store_init(int debug, store_type store, } active_store_type = store; if (!logger_funcs.create || - logger_funcs.create(debug, log_settings, CATALOG_VERSION*v) == LOG_ERR) { + logger_funcs.create(debug, log_settings, CATALOG_VERSION*v, 0) == LOG_ERR) { MT_lock_unset(&bs_lock, "store_init"); return -1; } + /* check if we need to create a read-only log as well */ + if (log_settings->create_readonly) { + if (!logger_funcs.create || logger_funcs.create(debug, log_settings, CATALOG_VERSION*v, 1) == LOG_ERR) { + MT_lock_unset(&bs_lock, "store_init"); + return -1; + } + } sa = sa_create(); MT_lock_unset(&bs_lock, "store_init"); @@ -1334,12 +1341,12 @@ store_init(int debug, store_type store, gtrans = tr = create_trans(sa, stk); active_transactions = sa_list(sa); - store_readonly = log_settings->readonly; + store_readonly = readonly; store_singleuser = singleuser; if (logger_funcs.log_isnew()) { /* cannot initialize database in readonly mode */ - if (log_settings->readonly) + if (readonly) return -1; tr = sql_trans_create(stk, NULL, NULL); } else { _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list