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

Reply via email to