Changeset: f544505e4227 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/f544505e4227
Modified Files:
        sql/storage/objectset.c
Branch: Aug2024
Log Message:

Avoid recursively locking read locks: this may cause deadlock.


diffs (147 lines):

diff --git a/sql/storage/objectset.c b/sql/storage/objectset.c
--- a/sql/storage/objectset.c
+++ b/sql/storage/objectset.c
@@ -755,15 +755,17 @@ find_name(objectset *os, const char *nam
 }
 
 static objectversion*
-get_valid_object_name(sql_trans *tr, objectversion *ov)
+get_valid_object_name(sql_trans *tr, objectversion *ov, bool lock)
 {
        while(ov) {
                if (ov->ts == tr->tid || (tr->parent && 
tr_version_of_parent(tr, ov->ts)) || ov->ts < tr->ts)
                        return ov;
                else {
-                       lock_reader(ov->os);
+                       if (lock)
+                               lock_reader(ov->os);
                        objectversion* name_based_older = ov->name_based_older;
-                       unlock_reader(ov->os);
+                       if (lock)
+                               unlock_reader(ov->os);
                        ov = name_based_older;
                }
        }
@@ -771,15 +773,17 @@ get_valid_object_name(sql_trans *tr, obj
 }
 
 static objectversion*
-get_valid_object_id(sql_trans *tr, objectversion *ov)
+get_valid_object_id(sql_trans *tr, objectversion *ov, bool lock)
 {
        while(ov) {
                if (ov->ts == tr->tid || (tr->parent && 
tr_version_of_parent(tr, ov->ts))  || ov->ts < tr->ts)
                        return ov;
                else {
-                       lock_reader(ov->os);
+                       if (lock)
+                               lock_reader(ov->os);
                        objectversion* id_based_older = ov->id_based_older;
-                       unlock_reader(ov->os);
+                       if (lock)
+                               unlock_reader(ov->os);
                        ov = id_based_older;
                }
        }
@@ -797,7 +801,7 @@ os_add_name_based(objectset *os, struct 
 
        if (name_based_node) {
                objectversion *co = name_based_node->ov;
-               objectversion *oo = get_valid_object_name(tr, co);
+               objectversion *oo = get_valid_object_name(tr, co, true);
                if (co != oo) { /* conflict ? */
                        TRC_WARNING(SQL_STORE, "%s" "if (co != oo) { /* 
conflict ? */", __func__);
                        return -3;
@@ -849,7 +853,7 @@ os_add_id_based(objectset *os, struct sq
 
        if (id_based_node) {
                objectversion *co = id_based_node->ov;
-               objectversion *oo = get_valid_object_id(tr, co);
+               objectversion *oo = get_valid_object_id(tr, co, true);
                if (co != oo) { /* conflict ? */
                        TRC_WARNING(SQL_STORE, "%s" "if (co != oo) { /* 
conflict ? */", __func__);
                        return -3;
@@ -947,7 +951,7 @@ os_del_name_based(objectset *os, struct 
 
        if (name_based_node) {
                objectversion *co = name_based_node->ov;
-               objectversion *oo = get_valid_object_name(tr, co);
+               objectversion *oo = get_valid_object_name(tr, co, true);
                ov->name_based_head = oo->name_based_head;
                if (co != oo) { /* conflict ? */
                        TRC_WARNING(SQL_STORE, "%s: " "if (co != oo) { /* 
conflict ? */", __func__);
@@ -981,7 +985,7 @@ os_del_id_based(objectset *os, struct sq
 
        if (id_based_node) {
                objectversion *co = id_based_node->ov;
-               objectversion *oo = get_valid_object_id(tr, co);
+               objectversion *oo = get_valid_object_id(tr, co, true);
                ov->id_based_head = oo->id_based_head;
                if (co != oo) { /* conflict ? */
                        TRC_WARNING(SQL_STORE, "%s" "if (co != oo) { /* 
conflict ? */", __func__);
@@ -1050,7 +1054,8 @@ os_size(objectset *os, struct sql_trans 
                lock_reader(os);
                for(versionhead  *n = os->name_based_h; n; n=n->next) {
                        objectversion *ov = n->ov;
-                       if ((ov=get_valid_object_name(tr, ov)) && 
os_atmc_get_state(ov) == active)
+                       assert(os == ov->os);
+                       if ((ov=get_valid_object_name(tr, ov, false)) && 
os_atmc_get_state(ov) == active)
                                cnt++;
                }
                unlock_reader(os);
@@ -1086,9 +1091,9 @@ os_find_name(objectset *os, struct sql_t
        versionhead  *n = find_name(os, name);
 
        if (n) {
-                objectversion *ov = get_valid_object_name(tr, n->ov);
-                if (ov && os_atmc_get_state(ov) == active)
-                        return ov->b;
+               objectversion *ov = get_valid_object_name(tr, n->ov, true);
+               if (ov && os_atmc_get_state(ov) == active)
+                       return ov->b;
        }
        return NULL;
 }
@@ -1101,9 +1106,9 @@ os_find_id(objectset *os, struct sql_tra
        versionhead  *n = find_id(os, id);
 
        if (n) {
-                objectversion *ov = get_valid_object_id(tr, n->ov);
-                if (ov && os_atmc_get_state(ov) == active)
-                        return ov->b;
+               objectversion *ov = get_valid_object_id(tr, n->ov, true);
+               if (ov && os_atmc_get_state(ov) == active)
+                       return ov->b;
        }
        return NULL;
 }
@@ -1142,7 +1147,8 @@ oi_next(struct os_iter *oi)
                                if (n->ov->b->name && strcmp(n->ov->b->name, 
oi->name) == 0) {
                                        objectversion *ov = n->ov;
 
-                                       ov = get_valid_object_name(oi->tr, ov);
+                                       assert(oi->os == ov->os);
+                                       ov = get_valid_object_name(oi->tr, ov, 
false);
                                        if (ov && os_atmc_get_state(ov) == 
active)
                                                b = ov->b;
                                }
@@ -1157,7 +1163,8 @@ oi_next(struct os_iter *oi)
                                        objectversion *ov = n->ov;
 
                                        n = oi->n = n->next;
-                                       ov = get_valid_object_name(oi->tr, ov);
+                                       assert(oi->os == ov->os);
+                                       ov = get_valid_object_name(oi->tr, ov, 
false);
                                        if (ov && os_atmc_get_state(ov) == 
active)
                                                b = ov->b;
                                } else {
@@ -1174,7 +1181,8 @@ oi_next(struct os_iter *oi)
                        objectversion *ov = n->ov;
                        n = oi->n = n->next;
 
-                       ov = get_valid_object_id(oi->tr, ov);
+                       assert(oi->os == ov->os);
+                       ov = get_valid_object_id(oi->tr, ov, false);
                        if (ov && os_atmc_get_state(ov) == active)
                                b = ov->b;
                }
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to