From 5990654c0e96e608ee930b265d1ab53ac2be9a21 Mon Sep 17 00:00:00 2001 From: "aleksey.mochalov" Date: Tue, 14 Apr 2026 09:33:40 +0300 Subject: [PATCH 1/2] lock the record header before fetching its backversion with delta --- src/jrd/vio.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/jrd/vio.cpp b/src/jrd/vio.cpp index fb959b29e3d..956262da2ed 100644 --- a/src/jrd/vio.cpp +++ b/src/jrd/vio.cpp @@ -7321,6 +7321,9 @@ void VIO_update_in_place(thread_db* tdbb, AutoTempRecord gc_rec; + if (!DPM_get(tdbb, org_rpb, LCK_write)) + BUGCHECK(186); // msg 186 record disappeared + record_param temp2; const Record* prior = org_rpb->rpb_prior; if (prior) @@ -7347,9 +7350,6 @@ void VIO_update_in_place(thread_db* tdbb, stack->push(PageNumber(pageSpaceID, temp2.rpb_page)); } - if (!DPM_get(tdbb, org_rpb, LCK_write)) - BUGCHECK(186); // msg 186 record disappeared - if (prior) { const ULONG page = org_rpb->rpb_b_page; From 4ebd3ffa0722c26bbab81b8f8b4f7f284a811263 Mon Sep 17 00:00:00 2001 From: "aleksey.mochalov" Date: Wed, 15 Apr 2026 14:09:51 +0300 Subject: [PATCH 2/2] Changed according to Vlad Khorsun suggestion --- src/jrd/vio.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/jrd/vio.cpp b/src/jrd/vio.cpp index 956262da2ed..c6f7479eff3 100644 --- a/src/jrd/vio.cpp +++ b/src/jrd/vio.cpp @@ -7330,10 +7330,8 @@ void VIO_update_in_place(thread_db* tdbb, { temp2 = *org_rpb; temp2.rpb_record = gc_rec = relation->getGCRecord(tdbb); - temp2.rpb_page = org_rpb->rpb_b_page; - temp2.rpb_line = org_rpb->rpb_b_line; - if (!DPM_fetch(tdbb, &temp2, LCK_read)) + if (!DPM_fetch_back(tdbb, &temp2, LCK_read, -1)) BUGCHECK(291); // msg 291 cannot find record back version VIO_data(tdbb, &temp2, relation->rel_pool); @@ -7343,11 +7341,13 @@ void VIO_update_in_place(thread_db* tdbb, if (temp2.rpb_prior) temp2.rpb_flags |= rpb_delta; - temp2.rpb_number = org_rpb->rpb_number; DPM_store(tdbb, &temp2, *stack, DPM_secondary); const USHORT pageSpaceID = temp2.getWindow(tdbb).win_page.getPageSpaceID(); stack->push(PageNumber(pageSpaceID, temp2.rpb_page)); + + if (!DPM_get(tdbb, org_rpb, LCK_write)) + BUGCHECK(186); // msg 186 record disappeared } if (prior)