Changeset: c1944efdc3c9 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=c1944efdc3c9 Modified Files: gdk/gdk_logger.c sql/backends/monet5/sql.c sql/backends/monet5/sql.h sql/backends/monet5/sql.mal sql/scripts/85_htm.sql sql/server/sql_mvc.c sql/server/sql_mvc.h sql/storage/bat/bat_logger.c sql/storage/sql_storage.h sql/storage/store.c Branch: HTM Log Message:
Add a mal functionto force re-init the store diffs (truncated from 332 to 300 lines): diff --git a/gdk/gdk_logger.c b/gdk/gdk_logger.c --- a/gdk/gdk_logger.c +++ b/gdk/gdk_logger.c @@ -860,45 +860,45 @@ static int log_sequence_nrs(logger *lg); /* Update the last transaction id written in the catalog file. * Only used by the shared logger. */ -static int -logger_update_catalog_file(logger *lg, const char *dir, const char *filename, int role) -{ - FILE *fp; - int bak_exists; - int farmid = BBPselectfarm(role, 0, offheap); - - bak_exists = 0; - /* check if an older file exists and move bak it up */ - if (access(filename, 0) != -1) { - bak_exists = 1; - if (GDKmove(farmid, dir, filename, NULL, dir, filename, "bak") == GDK_FAIL) { - fprintf(stderr, "!ERROR: logger_update_catalog_file: rename %s to %s.bak in %s failed\n", filename, filename, dir); - return LOG_ERR; - } - } - - if ((fp = GDKfileopen(farmid, dir, filename, NULL, "w")) != NULL) { - if (fprintf(fp, "%06d\n\n", lg->version) < 0) { - fprintf(stderr, "!ERROR: logger_update_catalog_file: write to %s failed\n", filename); - return LOG_ERR; - } - - if (fprintf(fp, LLFMT "\n", lg->id) < 0 || fclose(fp) < 0) { - fprintf(stderr, "!ERROR: logger_update_catalog_file: write/flush to %s failed\n", filename); - return LOG_ERR; - } - - /* cleanup the bak file, if it exists*/ - if (bak_exists) { - GDKunlink(farmid, dir, filename, "bak"); - } - } else { - fprintf(stderr, "!ERROR: logger_update_catalog_file: could not create %s\n", filename); - GDKerror("logger_update_catalog_file: could not open %s\n", filename); - return LOG_ERR; - } - return LOG_OK; -} +//static int +//logger_update_catalog_file(logger *lg, const char *dir, const char *filename, int role) +//{ +// FILE *fp; +// int bak_exists; +// int farmid = BBPselectfarm(role, 0, offheap); +// +// bak_exists = 0; +// /* check if an older file exists and move bak it up */ +// if (access(filename, 0) != -1) { +// bak_exists = 1; +// if (GDKmove(farmid, dir, filename, NULL, dir, filename, "bak") == GDK_FAIL) { +// fprintf(stderr, "!ERROR: logger_update_catalog_file: rename %s to %s.bak in %s failed\n", filename, filename, dir); +// return LOG_ERR; +// } +// } +// +// if ((fp = GDKfileopen(farmid, dir, filename, NULL, "w")) != NULL) { +// if (fprintf(fp, "%06d\n\n", lg->version) < 0) { +// fprintf(stderr, "!ERROR: logger_update_catalog_file: write to %s failed\n", filename); +// return LOG_ERR; +// } +// +// if (fprintf(fp, LLFMT "\n", lg->id) < 0 || fclose(fp) < 0) { +// fprintf(stderr, "!ERROR: logger_update_catalog_file: write/flush to %s failed\n", filename); +// return LOG_ERR; +// } +// +// /* cleanup the bak file, if it exists*/ +// if (bak_exists) { +// GDKunlink(farmid, dir, filename, "bak"); +// } +// } else { +// fprintf(stderr, "!ERROR: logger_update_catalog_file: could not create %s\n", filename); +// GDKerror("logger_update_catalog_file: could not open %s\n", filename); +// return LOG_ERR; +// } +// return LOG_OK; +//} static int logger_open(logger *lg) @@ -1014,7 +1014,8 @@ logger_readlog(logger *lg, char *filenam err = 1; else if (l.tid != l.nr) /* abort record */ tr = tr_abort(lg, tr); - else if (l.precommit_id == 0 || (l.precommit_id > 0 && l.persistcommit == 1)) +// else if (l.precommit_id == 0 || (l.precommit_id > 0 && l.persistcommit == 1)) + else if (l.precommit_id >= 0) /* precommit_id == 0: not a 2-phase transaction otherwise the transaction might must be globally committed to re-commit */ tr = tr_commit(lg, tr); @@ -1124,7 +1125,7 @@ logger_readlogs(logger *lg, FILE *fp, ch lg->id = lid; } /* if this is a shared logger, write the id in the shared file */ - logger_update_catalog_file(lg, lg->local_dir, LOGFILE_SHARED, lg->local_dbfarm_role); +// logger_update_catalog_file(lg, lg->local_dir, LOGFILE_SHARED, lg->local_dbfarm_role); } } return res; @@ -1820,6 +1821,7 @@ logger_new(int debug, const char *fn, co #endif lg->dbfarm_role = logger_set_logdir_path(filename, fn, logdir, shared); + lg->local_dbfarm_role = logger_set_logdir_path(filename, fn, logdir, shared); lg->fn = GDKstrdup(fn); lg->dir = GDKstrdup(filename); lg->bufsize = 64*1024; @@ -1902,6 +1904,7 @@ logger_new(int debug, const char *fn, co int logger_reload(logger *lg) { + int res; char filename[BUFSIZ]; snprintf(filename, sizeof(filename), "%s", lg->dir); @@ -1909,7 +1912,10 @@ logger_reload(logger *lg) fprintf(stderr, "#logger_reload %s\n", filename); } - return logger_load(lg->debug, lg->fn, filename, lg); + lg->shared = 1; + res = logger_load(lg->debug, lg->fn, filename, lg); + lg->shared = 0; + return res; } /* Create a new logger */ diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c --- a/sql/backends/monet5/sql.c +++ b/sql/backends/monet5/sql.c @@ -385,6 +385,7 @@ SQLpersistcommit(Client cntxt, MalBlkPtr if ((msg = checkSQLContext(cntxt)) != NULL) return msg; + /* If update flag is set, persistcommit does not throw and exception in autocommit, * since it was probably executed after a precommit with no-update transaction. */ if (sql->session->auto_commit != 0 && sql->affected_rows > 0) @@ -403,6 +404,28 @@ SQLpersistcommit(Client cntxt, MalBlkPtr } str +SQLforcepersistcommit(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci) +{ + (void) cntxt; + (void) mb; + (void) stk; + (void) pci; + + mvc_force_persistcommit(0); +// if (result < 0) { +// throw(MAL, "sql.persistcommit", "failed"); +// } + +// SQLepilogue(NULL); +// SQLprelude(NULL); + +// SQLexit(NULL); +// SQLinit(); + + return MAL_SUCCEED; +} + +str SQLshutdown_wrap(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci) { str msg; diff --git a/sql/backends/monet5/sql.h b/sql/backends/monet5/sql.h --- a/sql/backends/monet5/sql.h +++ b/sql/backends/monet5/sql.h @@ -72,6 +72,7 @@ sql5_export str SQLcommit(Client cntxt, sql5_export str SQLabort(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); sql5_export str SQLprecommit(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr p); sql5_export str SQLpersistcommit(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr p); +sql5_export str SQLforcepersistcommit(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr p); sql5_export str SQLshutdown_wrap(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); sql5_export str SQLtransaction2(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); sql5_export str SQLcatalog(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci); diff --git a/sql/backends/monet5/sql.mal b/sql/backends/monet5/sql.mal --- a/sql/backends/monet5/sql.mal +++ b/sql/backends/monet5/sql.mal @@ -61,6 +61,9 @@ comment "Pre-commit changes, writing the pattern persistcommit(id:lng) :int address SQLpersistcommit comment "Persists the per-committed changes, rolling-forward the transaction."; +pattern forcepersistcommit(id:lng) :int +address SQLforcepersistcommit +comment "Persists the per-committed changes."; pattern catalog(type:int,sname:str,name:str,action:int):void address SQLcatalog diff --git a/sql/scripts/85_htm.sql b/sql/scripts/85_htm.sql --- a/sql/scripts/85_htm.sql +++ b/sql/scripts/85_htm.sql @@ -9,3 +9,7 @@ CREATE PROCEDURE precommit(id bigint) CREATE PROCEDURE persistcommit(id bigint) EXTERNAL name sql.persistcommit; + +CREATE PROCEDURE forcepersistcommit(id bigint) + EXTERNAL name sql.forcepersistcommit; + \ No newline at end of file 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 @@ -380,6 +380,11 @@ mvc_persistcommit(mvc *m, int chain, con } int +mvc_force_persistcommit(lng id) { + return sql_trans_force_persistcommit(id); +} + +int mvc_abort(mvc *m) { sql_trans *tr = m->session->tr; diff --git a/sql/server/sql_mvc.h b/sql/server/sql_mvc.h --- a/sql/server/sql_mvc.h +++ b/sql/server/sql_mvc.h @@ -141,6 +141,7 @@ extern void mvc_commit_finish(mvc *m, in extern int mvc_commit(mvc *c, int chain, const char *name); extern int mvc_precommit(mvc *m, int chain, const char *name, lng id); extern int mvc_persistcommit(mvc *m, int chain, const char *name, lng id); +extern int mvc_force_persistcommit(lng id); extern int mvc_abort(mvc *m); extern int mvc_rollback(mvc *c, int chain, const char *name); extern int mvc_release(mvc *c, const char *name); 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 @@ -296,6 +296,12 @@ bl_reload_shared(void) } static int +bl_reload(void) +{ + return logger_reload(bat_logger); +} + +static int bl_persist_precommit(lng precommit_id) { return log_persist_precommit(bat_logger, precommit_id); @@ -321,6 +327,7 @@ bat_logger_init( logger_functions *lf ) lf->log_tend = bl_tend; lf->log_sequence = bl_sequence; lf->log_persist_precommit = bl_persist_precommit; + lf->reload = bl_reload; lf->log_abort = bl_abort; return LOG_OK; } 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 @@ -338,6 +338,7 @@ extern int sql_trans_validate(sql_trans extern int sql_trans_commit(sql_trans *tr); extern int sql_trans_precommit(sql_trans *tr); extern int sql_trans_persistcommit(sql_trans *tr); +extern int sql_trans_force_persistcommit(lng id); extern int sql_trans_abort(sql_trans *tr); extern sql_type *sql_trans_create_type(sql_trans *tr, sql_schema * s, const char *sqlname, int digits, int scale, int radix, const char *impl); diff --git a/sql/storage/store.c b/sql/storage/store.c --- a/sql/storage/store.c +++ b/sql/storage/store.c @@ -3518,6 +3518,56 @@ sql_trans_persistcommit(sql_trans *tr) } int +sql_trans_force_persistcommit(lng id) +{ + int res; + (void)id; + + MT_lock_set(&bs_lock, "store_manager"); + res = logger_funcs.reload(); + if (res != LOG_OK) { + MT_lock_unset(&bs_lock, "store_manager"); + GDKfatal("shared write-ahead log loading failure"); + } + /* destroy all global transactions + * we will re-load the new later */ + sql_trans_destroy(gtrans); + destroy_spare_transactions(); + + /* re-set the store_oid */ + store_oid = 0; + /* reload the store and the global transactions */ + res = store_load(); + if (res < 0) { _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list