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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list