Changeset: ea5b77821f95 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/ea5b77821f95
Modified Files:
        sql/storage/store.c
Branch: iso
Log Message:

Cleanup and unlock more


diffs (84 lines):

diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -3661,34 +3661,35 @@ sql_trans_commit(sql_trans *tr)
 {
        int ok = LOG_OK;
        sqlstore *store = tr->store;
-       bool locked = false;
-
-       if (!tr->parent && !list_empty(tr->predicates)) {
+
+       if (!tr->parent && !list_empty(tr->predicates) && 
!list_empty(tr->changes)) {
+               store_lock(store);
+
+               if ((ok = sql_trans_valid(tr)) != LOG_OK) {
+                       store_unlock(store);
+                       sql_trans_rollback(tr);
+                       return ok == LOG_CONFLICT ? SQL_CONFLICT : SQL_ERR;
+               }
+               store_unlock(store);
+       }
+
+       if (!tr->parent && (!list_empty(tr->dependencies) || 
!list_empty(tr->removals))) {
                MT_lock_set(&store->commit);
                store_lock(store);
-               locked = true;
-
-               if ((ok = sql_trans_valid(tr)) != LOG_OK) {
+
+               if ((ok = transaction_check_dependencies_and_removals(tr)) != 
LOG_OK) {
                        store_unlock(store);
                        MT_lock_unset(&store->commit);
                        sql_trans_rollback(tr);
                        return ok == LOG_CONFLICT ? SQL_CONFLICT : SQL_ERR;
                }
+               store_unlock(store);
+               MT_lock_unset(&store->commit);
        }
 
        if (!list_empty(tr->changes)) {
-               if (!locked) {
-                       MT_lock_set(&store->commit);
-                       store_lock(store);
-                       locked = true;
-               }
-
-               if (!tr->parent && (ok = 
transaction_check_dependencies_and_removals(tr)) != LOG_OK) {
-                       store_unlock(store);
-                       MT_lock_unset(&store->commit);
-                       sql_trans_rollback(tr);
-                       return ok == LOG_CONFLICT ? SQL_CONFLICT : SQL_ERR;
-               }
+               MT_lock_set(&store->commit);
+               store_lock(store);
 
                ulng oldest = store_oldest(store);
                store_pending_changes(store, oldest);
@@ -3764,9 +3765,10 @@ sql_trans_commit(sql_trans *tr)
                list_destroy(tr->changes);
                tr->changes = NULL;
                tr->ts = commit_ts;
+               store_unlock(store);
+               MT_lock_unset(&store->commit);
        } else if (ATOMIC_GET(&store->nr_active) == 1) { /* just me cleanup */
-               if (!locked)
-                       store_lock(store);
+               store_lock(store);
                ulng oldest = store_timestamp(store);
                store_pending_changes(store, oldest);
                if (ATOMIC_GET(&store->nr_active) == 1 && !tr->parent) {
@@ -3774,13 +3776,6 @@ sql_trans_commit(sql_trans *tr)
                        id_hash_clear(store->removals);
                }
                store_unlock(store);
-               if (locked)
-                       MT_lock_unset(&store->commit);
-               locked = false;
-       }
-       if (locked) {
-               store_unlock(store);
-               MT_lock_unset(&store->commit);
        }
        /* drop local temp tables with commit action CA_DROP, after cleanup */
        if (cs_size(&tr->localtmps)) {
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to