Changeset: 5f0a8934fa26 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/5f0a8934fa26
Modified Files:
        sql/backends/monet5/sql_gencode.c
        sql/server/sql_mvc.c
        sql/storage/store.c
Branch: Jul2021
Log Message:

moving locks down into the storage layer


diffs (truncated from 324 to 300 lines):

diff --git a/sql/backends/monet5/sql_gencode.c 
b/sql/backends/monet5/sql_gencode.c
--- a/sql/backends/monet5/sql_gencode.c
+++ b/sql/backends/monet5/sql_gencode.c
@@ -1131,9 +1131,7 @@ mal_function_find_implementation_address
        m->type = Q_PARSE;
        m->user_id = m->role_id = USER_MONETDB;
 
-       store_lock(m->session->tr->store);
        m->session = sql_session_create(m->store, m->pa, 0);
-       store_unlock(m->session->tr->store);
        if (!m->session) {
                (void) sql_error(o, 02, SQLSTATE(HY013) MAL_MALLOC_FAIL);
                goto bailout;
@@ -1177,9 +1175,7 @@ bailout:
        if (m) {
                bstream_destroy(m->scanner.rs);
                if (m->session) {
-                       store_lock(m->session->tr->store);
                        sql_session_destroy(m->session);
-                       store_unlock(m->session->tr->store);
                }
                if (m->sa)
                        sa_destroy(m->sa);
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
@@ -441,9 +441,7 @@ mvc_debug_on(mvc *m, int flg)
 void
 mvc_cancel_session(mvc *m)
 {
-       store_lock(m->store);
        (void)sql_trans_end(m->session, 0);
-       store_unlock(m->store);
 }
 
 int
@@ -452,7 +450,6 @@ mvc_trans(mvc *m)
        int schema_changed = 0, err = m->session->status;
        assert(!m->session->tr->active);        /* can only start a new 
transaction */
 
-       store_lock(m->store);
        TRC_INFO(SQL_TRANS, "Starting transaction\n");
        schema_changed = sql_trans_begin(m->session);
        if (m->qc && (schema_changed || err)){
@@ -464,12 +461,10 @@ mvc_trans(mvc *m)
                        m->qc = qc_create(m->pa, m->clientid, seqnr);
                        if (!m->qc) {
                                (void)sql_trans_end(m->session, 0);
-                               store_unlock(m->store);
                                return -1;
                        }
                }
        }
-       store_unlock(m->store);
        return 0;
 }
 
@@ -502,16 +497,13 @@ mvc_commit(mvc *m, int chain, const char
        if (name && name[0] != '\0') {
                sql_trans *tr = m->session->tr;
                TRC_DEBUG(SQL_TRANS, "Savepoint\n");
-               store_lock(m->store);
                m->session->tr = sql_trans_create(m->store, tr, name);
                if (!m->session->tr) {
-                       store_unlock(m->store);
                        msg = createException(SQL, "sql.commit", 
SQLSTATE(HY013) "%s allocation failure while committing the transaction, will 
ROLLBACK instead", operation);
                        if ((other = mvc_rollback(m, chain, name, false)) != 
MAL_SUCCEED)
                                freeException(other);
                        return msg;
                }
-               store_unlock(m->store);
                m->type = Q_TRANS;
                m->session->schema = find_sql_schema(m->session->tr, 
m->session->schema_name);
                TRC_INFO(SQL_TRANS, "Savepoint commit '%s' done\n", name);
@@ -519,15 +511,12 @@ mvc_commit(mvc *m, int chain, const char
        }
 
        if (!tr->parent && !name) {
-               store_lock(m->store);
                if (sql_trans_end(m->session, 1) != SQL_OK) {
-                       store_unlock(m->store);
                        /* transaction conflict */
                        msg = createException(SQL, "sql.commit", 
SQLSTATE(40000) "%s transaction is aborted because of concurrency conflicts, 
will ROLLBACK instead", operation);
                        return msg;
                }
                msg = WLCcommit(m->clientid);
-               store_unlock(m->store);
                if (msg != MAL_SUCCEED) {
                        if ((other = mvc_rollback(m, chain, name, false)) != 
MAL_SUCCEED)
                                freeException(other);
@@ -538,18 +527,15 @@ mvc_commit(mvc *m, int chain, const char
 
        /* commit and cleanup nested transactions */
        if (tr->parent) {
-               store_lock(m->store);
                while (tr->parent != NULL && ok == SQL_OK) {
                        if ((ok = sql_trans_commit(tr)) != SQL_OK) {
                                GDKfatal("%s transaction commit failed (perhaps 
your disk is full?) exiting (kernel error: %s)", operation, GDKerrbuf);
                        }
                        tr = sql_trans_destroy(tr);
                }
-               store_unlock(m->store);
                m->session->tr = tr;
        }
 
-       store_lock(m->store);
        /* if there is nothing to commit reuse the current transaction */
        if (tr->changes == NULL) {
                if (!chain)
@@ -557,14 +543,12 @@ mvc_commit(mvc *m, int chain, const char
                m->type = Q_TRANS;
                /* save points not handled by WLC...
                msg = WLCcommit(m->clientid);
-               store_unlock(m->store);
                if (msg != MAL_SUCCEED) {
                        if ((other = mvc_rollback(m, chain, name, false)) != 
MAL_SUCCEED)
                                freeException(other);
                        return msg;
                }
                */
-               store_unlock(m->store);
                TRC_INFO(SQL_TRANS,
                        "Commit done (no changes)\n");
                return msg;
@@ -576,7 +560,6 @@ mvc_commit(mvc *m, int chain, const char
        /*
        msg = WLCcommit(m->clientid);
        if (msg != MAL_SUCCEED) {
-               store_unlock(m->store);
                if ((other = mvc_rollback(m, chain, name, false)) != 
MAL_SUCCEED)
                        freeException(other);
                return msg;
@@ -585,7 +568,6 @@ mvc_commit(mvc *m, int chain, const char
        (void)sql_trans_end(m->session, 1);
        if (chain)
                sql_trans_begin(m->session);
-       store_unlock(m->store);
        m->type = Q_TRANS;
        TRC_INFO(SQL_TRANS,
                "Commit done\n");
@@ -600,7 +582,6 @@ mvc_rollback(mvc *m, int chain, const ch
        TRC_DEBUG(SQL_TRANS, "Rollback: %s\n", (name) ? name : "");
        (void) disabling_auto_commit;
 
-       store_lock(m->store);
        sql_trans *tr = m->session->tr;
        assert(m->session->tr && m->session->tr->active);       /* only abort 
an active transaction */
        if (name && name[0] != '\0') {
@@ -609,7 +590,6 @@ mvc_rollback(mvc *m, int chain, const ch
                if (!tr) {
                        msg = createException(SQL, "sql.rollback", 
SQLSTATE(42000) "ROLLBACK TO SAVEPOINT: no such savepoint: '%s'", name);
                        m->session->status = -1;
-                       store_unlock(m->store);
                        return msg;
                }
                tr = m->session->tr;
@@ -639,7 +619,6 @@ mvc_rollback(mvc *m, int chain, const ch
                        sql_trans_begin(m->session);
        }
        msg = WLCrollback(m->clientid);
-       store_unlock(m->store);
        if (msg != MAL_SUCCEED) {
                m->session->status = -1;
                return msg;
@@ -680,7 +659,6 @@ mvc_release(mvc *m, const char *name)
                return msg;
        }
        tr = m->session->tr;
-       store_lock(m->store);
        while (ok == SQL_OK && (!tr->name || strcmp(tr->name, name) != 0)) {
                /* commit all intermediate savepoints */
                if (sql_trans_commit(tr) != SQL_OK)
@@ -689,7 +667,6 @@ mvc_release(mvc *m, const char *name)
        }
        _DELETE(tr->name);
        tr->name = NULL;
-       store_unlock(m->store);
        m->session->tr = tr;
        m->session->schema = find_sql_schema(m->session->tr, 
m->session->schema_name);
 
@@ -776,9 +753,7 @@ mvc_create(sql_store *store, sql_allocat
        m->schema_path_has_tmp = 0;
        m->store = store;
 
-       store_lock(m->store);
        m->session = sql_session_create(m->store, m->pa, 1 /*autocommit on*/);
-       store_unlock(m->store);
        if (!m->session) {
                qc_destroy(m->qc);
                list_destroy(m->global_vars);
@@ -800,14 +775,12 @@ mvc_reset(mvc *m, bstream *rs, stream *w
 
        TRC_DEBUG(SQL_TRANS, "MVC reset\n");
        tr = m->session->tr;
-       store_lock(m->store);
        if (tr && tr->parent) {
                assert(m->session->tr->active == 0);
                while (tr->parent->parent != NULL)
                        tr = sql_trans_destroy(tr);
        }
        reset = sql_session_reset(m->session, 1 /*autocommit on*/);
-       store_unlock(m->store);
        if (tr && !reset)
                res = 0;
 
@@ -855,7 +828,6 @@ mvc_destroy(mvc *m)
 
        TRC_DEBUG(SQL_TRANS, "MVC destroy\n");
        tr = m->session->tr;
-       store_lock(m->store);
        if (tr) {
                if (m->session->tr->active)
                        (void)sql_trans_end(m->session, 0);
@@ -863,7 +835,6 @@ mvc_destroy(mvc *m)
                        tr = sql_trans_destroy(tr);
        }
        sql_session_destroy(m->session);
-       store_unlock(m->store);
 
        list_destroy(m->global_vars);
        list_destroy(m->schema_path);
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -3233,6 +3233,7 @@ sql_trans_rollback(sql_trans *tr)
                }
        }
        if (tr->changes) {
+               store_lock(store);
                /* revert the change list */
                list *nl = SA_LIST(tr->sa, (fdestroy) NULL);
                for(node *n=tr->changes->h; n; n = n->next)
@@ -3274,6 +3275,7 @@ sql_trans_rollback(sql_trans *tr)
                list_destroy(tr->changes);
                tr->changes = NULL;
                tr->logchanges = 0;
+               store_unlock(store);
        }
        if (tr->localtmps.dset) {
                list_destroy2(tr->localtmps.dset, tr->store);
@@ -3314,8 +3316,11 @@ sql_trans_destroy(sql_trans *tr)
        }
        if (tr->changes)
                sql_trans_rollback(tr);
+       sqlstore *store = tr->store;
+       store_lock(store);
        cs_destroy(&tr->localtmps, tr->store);
        _DELETE(tr);
+       store_unlock(store);
        return res;
 }
 
@@ -3327,6 +3332,7 @@ sql_trans_create_(sqlstore *store, sql_t
        if (!tr)
                return NULL;
 
+       store_lock(store);
        tr->sa = NULL;
        tr->store = store;
        tr->tid = store_transaction_id(store);
@@ -3347,6 +3353,7 @@ sql_trans_create_(sqlstore *store, sql_t
        cs_new(&tr->localtmps, tr->sa, (fdestroy) &table_destroy);
        tr->parent = parent;
        TRC_DEBUG(SQL_STORE, "New transaction: %p\n", tr);
+       store_unlock(store);
        return tr;
 }
 
@@ -3406,6 +3413,7 @@ sql_trans_commit(sql_trans *tr)
 {
        int ok = LOG_OK;
        sqlstore *store = tr->store;
+       store_lock(store);
        ulng commit_ts = tr->parent ? tr->parent->tid : store_timestamp(store);
        ulng oldest = store_oldest_given_max(store, commit_ts);
 
@@ -3479,6 +3487,7 @@ sql_trans_commit(sql_trans *tr)
        }
        tr->localtmps.nelm = NULL;
        tr->ts = commit_ts;
+       store_unlock(store);
        return (ok==LOG_OK)?SQL_OK:SQL_ERR;
 }
 
@@ -6267,6 +6276,7 @@ sql_trans_begin(sql_session *s)
        sql_trans *tr = s->tr;
        sqlstore *store = tr->store;
 
+       store_lock(store);
        TRC_DEBUG(SQL_STORE, "Enter sql_trans_begin for transaction: " ULLFMT 
"\n", tr->tid);
        tr->ts = store_timestamp(store);
        tr->active = 1;
@@ -6278,6 +6288,7 @@ sql_trans_begin(sql_session *s)
 
        s->status = 0;
        TRC_DEBUG(SQL_STORE, "Exit sql_trans_begin for transaction: " ULLFMT 
"\n", tr->tid);
+       store_unlock(store);
        return 0;
 }
 
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to