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