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

Reply via email to