Changeset: 25f90f1a1e0b for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=25f90f1a1e0b
Modified Files:
        sql/server/sql_mvc.c
        sql/storage/sql_storage.h
        sql/storage/store.c
Branch: Apr2019
Log Message:

Don't spare transactions with tables moved between schemas.

The sql_trans_destroy call in sql_session_destroy was aware of it, but 
sql_trans_create wasn't.


diffs (191 lines):

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
@@ -411,7 +411,7 @@ mvc_commit(mvc *m, int chain, const char
                if (mvc_debug)
                        fprintf(stderr, "#mvc_savepoint\n");
                store_lock();
-               m->session->tr = sql_trans_create(m->session->stk, tr, name);
+               m->session->tr = sql_trans_create(m->session->stk, tr, name, 
true);
                if(!m->session->tr) {
                        store_unlock();
                        msg = createException(SQL, "sql.commit", 
SQLSTATE(HY001) "%s allocation failure while committing the transaction, will 
ROLLBACK instead", operation);
@@ -451,7 +451,7 @@ build up the hash (not copied in the tra
                        ctr = sql_trans_deref(ctr);
                }
                while (tr->parent != NULL && ok == SQL_OK) 
-                       tr = sql_trans_destroy(tr);
+                       tr = sql_trans_destroy(tr, true);
                store_unlock();
        }
        cur -> parent = tr;
@@ -555,7 +555,7 @@ mvc_rollback(mvc *m, int chain, const ch
                        /* make sure we do not reuse changed data */
                        if (tr->wtime)
                                tr->status = 1;
-                       tr = sql_trans_destroy(tr);
+                       tr = sql_trans_destroy(tr, true);
                }
                m->session->tr = tr;    /* restart at savepoint */
                m->session->status = tr->status;
@@ -565,7 +565,7 @@ mvc_rollback(mvc *m, int chain, const ch
        } else if (tr->parent) {
                /* first release all intermediate savepoints */
                while (tr->parent->parent != NULL) {
-                       tr = sql_trans_destroy(tr);
+                       tr = sql_trans_destroy(tr, true);
                }
                m->session-> tr = tr;
                /* make sure we do not reuse changed data */
@@ -626,7 +626,7 @@ mvc_release(mvc *m, const char *name)
                /* commit all intermediate savepoints */
                if (sql_trans_commit(tr) != SQL_OK)
                        GDKfatal("release savepoints should not fail");
-               tr = sql_trans_destroy(tr);
+               tr = sql_trans_destroy(tr, true);
        }
        tr->name = NULL;
        store_unlock();
@@ -732,7 +732,7 @@ mvc_reset(mvc *m, bstream *rs, stream *w
                assert(m->session->tr->active == 0);
                store_lock();
                while (tr->parent->parent != NULL) 
-                       tr = sql_trans_destroy(tr);
+                       tr = sql_trans_destroy(tr, true);
                store_unlock();
        }
        if (tr && !sql_session_reset(m->session, 1 /*autocommit on*/))
@@ -801,7 +801,7 @@ mvc_destroy(mvc *m)
                if (m->session->tr->active)
                        sql_trans_end(m->session);
                while (tr->parent)
-                       tr = sql_trans_destroy(tr);
+                       tr = sql_trans_destroy(tr, true);
                m->session->tr = NULL;
                store_unlock();
        }
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
@@ -356,8 +356,8 @@ extern void store_lock(void);
 extern void store_unlock(void);
 extern int store_next_oid(void);
 
-extern sql_trans *sql_trans_create(backend_stack stk, sql_trans *parent, const 
char *name);
-extern sql_trans *sql_trans_destroy(sql_trans *tr);
+extern sql_trans *sql_trans_create(backend_stack stk, sql_trans *parent, const 
char *name, bool try_spare);
+extern sql_trans *sql_trans_destroy(sql_trans *tr, bool try_spare);
 extern int sql_trans_validate(sql_trans *tr);
 extern int sql_trans_commit(sql_trans *tr);
 
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -215,7 +215,7 @@ trans_drop_tmp(sql_trans *tr)
 /*#define STORE_DEBUG 1*/
 
 sql_trans *
-sql_trans_destroy(sql_trans *t)
+sql_trans_destroy(sql_trans *t, bool try_spare)
 {
        sql_trans *res = t->parent;
 
@@ -223,7 +223,7 @@ sql_trans_destroy(sql_trans *t)
        fprintf(stderr, "#destroy trans (%p)\n", t);
 #endif
 
-       if (res == gtrans && spares < MAX_SPARES && !t->name) {
+       if (res == gtrans && spares < MAX_SPARES && !t->name && try_spare) {
 #ifdef STORE_DEBUG
                fprintf(stderr, "#spared (%d) trans (%p)\n", spares, t);
 #endif
@@ -249,7 +249,7 @@ destroy_spare_transactions(void)
 
        spares = MAX_SPARES; /* ie now there not spared anymore */
        for (i = 0; i < s; i++) {
-               sql_trans_destroy(spare_trans[i]);
+               sql_trans_destroy(spare_trans[i], false);
        }
        spares = 0;
 }
@@ -1750,7 +1750,7 @@ store_load(void) {
                /* cannot initialize database in readonly mode */
                if (store_readonly)
                        return -1;
-               tr = sql_trans_create(backend_stk, NULL, NULL);
+               tr = sql_trans_create(backend_stk, NULL, NULL, true);
                if (!tr) {
                        fprintf(stderr, "Failure to start a transaction while 
loading the storage\n");
                        return -1;
@@ -1919,7 +1919,7 @@ store_load(void) {
                if (sql_trans_commit(tr) != SQL_OK) {
                        fprintf(stderr, "cannot commit initial transaction\n");
                }
-               sql_trans_destroy(tr);
+               sql_trans_destroy(tr, true);
        } else {
                GDKqsort(store_oids, NULL, NULL, nstore_oids, sizeof(sqlid), 0, 
TYPE_int, false, false);
                store_oid = store_oids[nstore_oids - 1] + 1;
@@ -2012,7 +2012,7 @@ store_exit(void)
           exit (but leak memory).
         */
        if (!transactions) {
-               sql_trans_destroy(gtrans);
+               sql_trans_destroy(gtrans, false);
                gtrans = NULL;
        }
 #ifdef STORE_DEBUG
@@ -4084,12 +4084,12 @@ reset_trans(sql_trans *tr, sql_trans *pt
 }
 
 sql_trans *
-sql_trans_create(backend_stack stk, sql_trans *parent, const char *name)
+sql_trans_create(backend_stack stk, sql_trans *parent, const char *name, bool 
try_spare)
 {
        sql_trans *tr = NULL;
 
        if (gtrans) {
-               if (!parent && spares > 0 && !name) {
+                if (!parent && spares > 0 && !name && try_spare) {
                        tr = spare_trans[--spares];
 #ifdef STORE_DEBUG
                        fprintf(stderr, "#reuse trans (%p) %d\n", tr, spares);
@@ -6516,7 +6516,7 @@ sql_session_create(backend_stack stk, in
        s = ZNEW(sql_session);
        if (!s)
                return NULL;
-       s->tr = sql_trans_create(s->stk, NULL, NULL);
+       s->tr = sql_trans_create(s->stk, NULL, NULL, true);
        if(!s->tr) {
                _DELETE(s);
                return NULL;
@@ -6525,7 +6525,7 @@ sql_session_create(backend_stack stk, in
        s->tr->active = 0;
        s->stk = stk;
        if(!sql_session_reset(s, ac)) {
-               sql_trans_destroy(s->tr);
+               sql_trans_destroy(s->tr, true);
                _DELETE(s);
                return NULL;
        }
@@ -6538,7 +6538,7 @@ sql_session_destroy(sql_session *s)
 {
        assert(!s->tr || s->tr->active == 0);
        if (s->tr)
-               sql_trans_destroy(s->tr);
+               sql_trans_destroy(s->tr, true);
        if (s->schema_name)
                _DELETE(s->schema_name);
        _DELETE(s);
@@ -6596,9 +6596,8 @@ sql_trans_begin(sql_session *s)
            (tr->stime < gtrans->wstime || tr->wtime || 
                        store_schema_number() != snr)) {
                if (!list_empty(tr->moved_tables)) {
-                       tr->name = (char*)1; /* make sure it get destroyed 
properly */
-                       sql_trans_destroy(tr);
-                       s->tr = tr = sql_trans_create(s->stk, NULL, NULL);
+                       sql_trans_destroy(tr, false);
+                       s->tr = tr = sql_trans_create(s->stk, NULL, NULL, 
false);
                } else {
                        reset_trans(tr, gtrans);
                }
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to