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