From 2046731b16e1b2f662f1b5b11b8fb726557f8b34 Mon Sep 17 00:00:00 2001 From: Ilya Eremin Date: Wed, 10 Aug 2022 10:23:23 +0300 Subject: [PATCH] Do not allow the AST thread to release EX lock on a relation while it's in the deleting state The problem is rarely reproduced by bugs.core_2879 test. Without the fix the phase 4 of delete_relation DFW may fail because MET_lookup_relation_id cannot find a relation. --- src/jrd/dfw.epp | 1 + src/jrd/met.epp | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/jrd/dfw.epp b/src/jrd/dfw.epp index 401fe9d10a0..b7fb38d5630 100644 --- a/src/jrd/dfw.epp +++ b/src/jrd/dfw.epp @@ -4955,6 +4955,7 @@ static bool delete_relation(thread_db* tdbb, SSHORT phase, DeferredWork* work, j case 4: relation = MET_lookup_relation_id(tdbb, work->dfw_id, true); if (!relation) { + fb_assert(false); return false; } diff --git a/src/jrd/met.epp b/src/jrd/met.epp index edbd0170d12..416e19f8df1 100644 --- a/src/jrd/met.epp +++ b/src/jrd/met.epp @@ -4468,7 +4468,7 @@ static int blocking_ast_relation(void* ast_object) if (relation->rel_use_count) relation->rel_flags |= REL_blocking; - else + else if (!(relation->rel_flags & REL_deleting)) { relation->rel_flags &= ~REL_blocking; relation->rel_flags |= REL_check_existence;