Changeset: b3db30cb03cc for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=b3db30cb03cc
Modified Files:
        sql/backends/monet5/sql.c
        sql/server/sql_mvc.c
        sql/server/sql_mvc.h
Branch: HTM
Log Message:

Split pull mvc_commit_prepare and mvc_commit_finish out of mvc commit
Add mvc_precommit and mvc_persistcommit
Wire mvc_precommit to SQLprecommit


diffs (185 lines):

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
@@ -358,12 +358,34 @@ SQLabort(Client cntxt, MalBlkPtr mb, Mal
 str
 SQLprecommit(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
 {
+       mvc *sql = NULL;
+       str msg;
+       sql_trans *tr = NULL;
+       (void) stk;
+       (void) pci;
+
+       if ((msg = getSQLContext(cntxt, mb, &sql, NULL)) != NULL)
+               return msg;
+       if ((msg = checkSQLContext(cntxt)) != NULL)
+               return msg;
+
+       if (sql->session->auto_commit != 0)
+               throw(SQL, "sql.trans", "2DM30!COMMIT: not allowed in auto 
commit mode");
+       tr = mvc_precommit(sql, 0, 0);
+
+       if (tr == NULL) {
+               throw(SQL, "sql.trans", "2D000!COMMIT: failed");
+       }
        return MAL_SUCCEED;
 }
 
 str
 SQLpersistcommit(Client cntxt, MalBlkPtr mb, MalStkPtr stk, InstrPtr pci)
 {
+       (void) cntxt;
+       (void) mb;
+       (void) stk;
+       (void) pci;
        return MAL_SUCCEED;
 }
 
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
@@ -192,16 +192,15 @@ mvc_trans(mvc *m)
 }
 
 int
-mvc_commit(mvc *m, int chain, char *name)
-{
-       sql_trans *cur, *tr = m->session->tr;
+mvc_commit_prepare(mvc *m, int chain, char *name, sql_trans *tr) {
+       sql_trans *cur = m->session->tr;
        int ok = SQL_OK;//, wait = 0;
 
        assert(tr);
        assert(m->session->active);     /* only commit an active transaction */
        
        if (mvc_debug)
-               fprintf(stderr, "#mvc_commit %s\n", (name) ? name : "");
+               fprintf(stderr, "#mvc_commit_prepare %s\n", (name) ? name : "");
 
        if (m->session->status < 0) {
                (void)sql_error(m, 010, "40000!COMMIT: transaction is aborted, 
will ROLLBACK instead");
@@ -223,7 +222,7 @@ build up the hash (not copied in the tra
                        qc_clean(m->qc);
                m->session->schema = find_sql_schema(m->session->tr, 
m->session->schema_name);
                if (mvc_debug)
-                       fprintf(stderr, "#mvc_commit %s done\n", name);
+                       fprintf(stderr, "#mvc_commit_prepare %s done\n", name);
                return 0;
        }
 
@@ -247,7 +246,7 @@ build up the hash (not copied in the tra
                        sql_trans_end(m->session);
                m->type = Q_TRANS;
                if (mvc_debug)
-                       fprintf(stderr, "#mvc_commit %s done\n", (name) ? name 
: "");
+                       fprintf(stderr, "#mvc_commit_prepare %s done\n", (name) 
? name : "");
                store_unlock();
                return 0;
        }
@@ -265,8 +264,32 @@ build up the hash (not copied in the tra
                store_lock();
        }
         * */
-       /* validation phase */
+       return ok;
+}
+
+void
+mvc_commit_finish(mvc *m, int chain, char *name) {
+       sql_trans_end(m->session);
+       if (chain)
+               sql_trans_begin(m->session);
+       store_unlock();
+       m->type = Q_TRANS;
+       if (mvc_debug)
+               fprintf(stderr, "#mvc_commit_finish %s done\n", (name) ? name : 
"");
+}
+
+int
+mvc_commit(mvc *m, int chain, char *name)
+{
+       sql_trans *tr = m->session->tr;
+       int ok = SQL_OK;//, wait = 0;
+
+       if ((ok = mvc_commit_prepare(m, chain, name, tr)) != SQL_OK) {
+               return 0;
+       }
+
        if (sql_trans_validate(tr)) {
+               /* execute commit */
                if ((ok = sql_trans_commit(tr)) != SQL_OK) {
                        char *msg = sql_message("40000!COMMIT: transaction 
commit failed (perhaps your disk is full?) exiting (kernel error: %s)", 
GDKerrbuf);
                        GDKfatal("%s", msg);
@@ -278,13 +301,49 @@ build up the hash (not copied in the tra
                mvc_rollback(m, chain, name);
                return -1;
        }
-       sql_trans_end(m->session);
-       if (chain) 
-               sql_trans_begin(m->session);
-       store_unlock();
-       m->type = Q_TRANS;
-       if (mvc_debug)
-               fprintf(stderr, "#mvc_commit %s done\n", (name) ? name : "");
+
+       mvc_commit_finish(m, chain, name);
+
+       return ok;
+}
+
+sql_trans *
+mvc_precommit(mvc *m, int chain, char *name) {
+       sql_trans *tr = m->session->tr;
+       int ok = SQL_OK;//, wait = 0;
+
+       if ((ok = mvc_commit_prepare(m, chain, name, tr)) != SQL_OK) {
+               return 0;
+       }
+
+       if (sql_trans_validate(tr)) {
+               if ((ok = sql_trans_precommit(tr)) != SQL_OK) {
+                       char *msg = sql_message("40000!COMMIT: transaction 
commit failed (perhaps your disk is full?) exiting (kernel error: %s)", 
GDKerrbuf);
+                       GDKfatal("%s", msg);
+                       _DELETE(msg);
+               }
+       } else {
+               store_unlock();
+               (void)sql_error(m, 010, "40000!COMMIT: transaction is aborted 
because of concurrency conflicts, will ROLLBACK instead");
+               mvc_rollback(m, chain, name);
+               return NULL;
+       }
+
+       return tr;
+}
+
+int
+mvc_persistcommit(mvc *m, int chain, char *name, sql_trans *tr) {
+       int ok = SQL_OK;//, wait = 0;
+
+       if ((ok = sql_trans_persistcommit(tr)) != SQL_OK) {
+               char *msg = sql_message("40000!COMMIT: transaction commit 
failed (perhaps your disk is full?) exiting (kernel error: %s)", GDKerrbuf);
+               GDKfatal("%s", msg);
+               _DELETE(msg);
+       }
+
+       mvc_commit_finish(m, chain, name);
+
        return ok;
 }
 
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
@@ -152,7 +152,11 @@ extern int mvc_type(mvc *c);
 #define has_snapshots(tr) ((tr) && (tr)->parent && (tr)->parent->parent)
 
 extern void mvc_trans(mvc *c);
+extern int mvc_commit_prepare(mvc *m, int chain, char *name, sql_trans *tr);
+extern void mvc_commit_finish(mvc *m, int chain, char *name);
 extern int mvc_commit(mvc *c, int chain, char *name);
+extern sql_trans *mvc_precommit(mvc *m, int chain, char *name);
+extern int mvc_persistcommit(mvc *m, int chain, char *name, sql_trans *tr);
 extern int mvc_rollback(mvc *c, int chain, char *name);
 extern int mvc_release(mvc *c, char *name);
 
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to