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