Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 7 additions & 7 deletions src/jrd/vio.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7321,16 +7321,17 @@ 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

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Your change makes possible that two pages will be locked at the same time, this is not good.
When one have primary record version locked and need to get seconary version, he should call DPM_fetch_back().
Of course, after VIO_data(), primary record should be re-acquired again.

record_param temp2;
const Record* prior = org_rpb->rpb_prior;
if (prior)
{
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);
Expand All @@ -7340,15 +7341,14 @@ 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 (!DPM_get(tdbb, org_rpb, LCK_write))
BUGCHECK(186); // msg 186 record disappeared
}

if (prior)
{
Expand Down
Loading