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