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