Skip to content

Commit 5b14baa

Browse files
authored
Fix #7700 - SKIP LOCKED returns conflict error or wait when config ReadConsistency = 0 (#7701)
* Fix #7700 - SKIP LOCKED returns conflict error or wait when config ReadConsistency = 0. * Rename RecordLock::DONT to NONE.
1 parent de99d19 commit 5b14baa

File tree

5 files changed

+28
-20
lines changed

5 files changed

+28
-20
lines changed

src/dsql/StmtNodes.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2658,7 +2658,7 @@ const StmtNode* EraseNode::erase(thread_db* tdbb, Request* request, WhichTrigger
26582658

26592659
if (rpb->rpb_runtime_flags & RPB_refetch)
26602660
{
2661-
VIO_refetch_record(tdbb, rpb, transaction, false, false);
2661+
VIO_refetch_record(tdbb, rpb, transaction, RecordLock::NONE, false);
26622662
rpb->rpb_runtime_flags &= ~RPB_refetch;
26632663
}
26642664

@@ -7112,7 +7112,7 @@ const StmtNode* ModifyNode::modify(thread_db* tdbb, Request* request, WhichTrigg
71127112

71137113
if (orgRpb->rpb_runtime_flags & RPB_refetch)
71147114
{
7115-
VIO_refetch_record(tdbb, orgRpb, transaction, false, false);
7115+
VIO_refetch_record(tdbb, orgRpb, transaction, RecordLock::NONE, false);
71167116
orgRpb->rpb_runtime_flags &= ~RPB_refetch;
71177117
}
71187118

@@ -10547,9 +10547,9 @@ static void cleanupRpb(thread_db* tdbb, record_param* rpb)
1054710547
}
1054810548

1054910549
// Try to set write lock on record until success or record exists
10550-
static void forceWriteLock(thread_db * tdbb, record_param * rpb, jrd_tra * transaction)
10550+
static void forceWriteLock(thread_db* tdbb, record_param* rpb, jrd_tra* transaction)
1055110551
{
10552-
while (VIO_refetch_record(tdbb, rpb, transaction, true, true))
10552+
while (VIO_refetch_record(tdbb, rpb, transaction, RecordLock::LOCK, true))
1055310553
{
1055410554
rpb->rpb_runtime_flags &= ~RPB_refetch;
1055510555

src/jrd/recsrc/RecordSource.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,7 @@ bool RecordStream::refetchRecord(thread_db* tdbb) const
240240

241241
if (rpb->rpb_runtime_flags & RPB_refetch)
242242
{
243-
if (VIO_refetch_record(tdbb, rpb, transaction, true, false))
243+
if (VIO_refetch_record(tdbb, rpb, transaction, RecordLock::LOCK, false))
244244
{
245245
rpb->rpb_runtime_flags &= ~RPB_refetch;
246246
return true;

src/jrd/recsrc/SortedStream.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -478,7 +478,7 @@ void SortedStream::mapData(thread_db* tdbb, Request* request, UCHAR* data) const
478478

479479
tdbb->bumpRelStats(RuntimeStatistics::RECORD_RPT_READS, relation->rel_id);
480480

481-
if (VIO_chase_record_version(tdbb, &temp, transaction, tdbb->getDefaultPool(), false, false))
481+
if (VIO_chase_record_version(tdbb, &temp, transaction, tdbb->getDefaultPool(), RecordLock::NONE, false))
482482
{
483483
if (!(temp.rpb_runtime_flags & RPB_undo_data))
484484
VIO_data(tdbb, &temp, tdbb->getDefaultPool());

src/jrd/vio.cpp

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1109,7 +1109,7 @@ void VIO_backout(thread_db* tdbb, record_param* rpb, const jrd_tra* transaction)
11091109

11101110
bool VIO_chase_record_version(thread_db* tdbb, record_param* rpb,
11111111
jrd_tra* transaction, MemoryPool* pool,
1112-
bool writelock, bool noundo)
1112+
RecordLock recordLock, bool noundo)
11131113
{
11141114
/**************************************
11151115
*
@@ -1258,9 +1258,10 @@ bool VIO_chase_record_version(thread_db* tdbb, record_param* rpb,
12581258
// If the transaction is a read committed and chooses the no version
12591259
// option, wait for reads also!
12601260

1261-
if ((transaction->tra_flags & TRA_read_committed) &&
1261+
if (recordLock != RecordLock::SKIP &&
1262+
(transaction->tra_flags & TRA_read_committed) &&
12621263
!(transaction->tra_flags & TRA_read_consistency) &&
1263-
(!(transaction->tra_flags & TRA_rec_version) || writelock))
1264+
(!(transaction->tra_flags & TRA_rec_version) || recordLock == RecordLock::LOCK))
12641265
{
12651266
if (state == tra_limbo)
12661267
{
@@ -1975,7 +1976,7 @@ bool VIO_erase(thread_db* tdbb, record_param* rpb, jrd_tra* transaction)
19751976

19761977
if (rpb->rpb_runtime_flags & (RPB_refetch | RPB_undo_read))
19771978
{
1978-
VIO_refetch_record(tdbb, rpb, transaction, false, true);
1979+
VIO_refetch_record(tdbb, rpb, transaction, RecordLock::NONE, true);
19791980
rpb->rpb_runtime_flags &= ~RPB_refetch;
19801981
fb_assert(!(rpb->rpb_runtime_flags & RPB_undo_read));
19811982
}
@@ -2905,7 +2906,7 @@ bool VIO_get(thread_db* tdbb, record_param* rpb, jrd_tra* transaction, MemoryPoo
29052906
const USHORT lock_type = (rpb->rpb_stream_flags & RPB_s_update) ? LCK_write : LCK_read;
29062907

29072908
if (!DPM_get(tdbb, rpb, lock_type) ||
2908-
!VIO_chase_record_version(tdbb, rpb, transaction, pool, false, false))
2909+
!VIO_chase_record_version(tdbb, rpb, transaction, pool, RecordLock::NONE, false))
29092910
{
29102911
return false;
29112912
}
@@ -3280,7 +3281,7 @@ bool VIO_modify(thread_db* tdbb, record_param* org_rpb, record_param* new_rpb, j
32803281
old_record->copyFrom(org_rpb->rpb_record);
32813282
}
32823283

3283-
VIO_refetch_record(tdbb, org_rpb, transaction, false, true);
3284+
VIO_refetch_record(tdbb, org_rpb, transaction, RecordLock::NONE, true);
32843285
org_rpb->rpb_runtime_flags &= ~RPB_refetch;
32853286
fb_assert(!(org_rpb->rpb_runtime_flags & RPB_undo_read));
32863287

@@ -3763,7 +3764,7 @@ bool VIO_next_record(thread_db* tdbb,
37633764
{
37643765
return false;
37653766
}
3766-
} while (!VIO_chase_record_version(tdbb, rpb, transaction, pool, false, false));
3767+
} while (!VIO_chase_record_version(tdbb, rpb, transaction, pool, RecordLock::NONE, false));
37673768

37683769
if (rpb->rpb_runtime_flags & RPB_undo_data)
37693770
fb_assert(rpb->getWindow(tdbb).win_bdb == NULL);
@@ -3841,7 +3842,7 @@ Record* VIO_record(thread_db* tdbb, record_param* rpb, const Format* format, Mem
38413842

38423843

38433844
bool VIO_refetch_record(thread_db* tdbb, record_param* rpb, jrd_tra* transaction,
3844-
bool writelock, bool noundo)
3845+
RecordLock recordLock, bool noundo)
38453846
{
38463847
/**************************************
38473848
*
@@ -3864,9 +3865,9 @@ bool VIO_refetch_record(thread_db* tdbb, record_param* rpb, jrd_tra* transaction
38643865
const TraNumber tid_fetch = rpb->rpb_transaction_nr;
38653866

38663867
if (!DPM_get(tdbb, rpb, LCK_read) ||
3867-
!VIO_chase_record_version(tdbb, rpb, transaction, tdbb->getDefaultPool(), writelock, noundo))
3868+
!VIO_chase_record_version(tdbb, rpb, transaction, tdbb->getDefaultPool(), recordLock, noundo))
38683869
{
3869-
if (writelock)
3870+
if (recordLock == RecordLock::LOCK)
38703871
return false;
38713872

38723873
ERR_post(Arg::Gds(isc_no_cur_rec));
@@ -3890,7 +3891,7 @@ bool VIO_refetch_record(thread_db* tdbb, record_param* rpb, jrd_tra* transaction
38903891
// make sure the record has not been updated. Also, punt after
38913892
// VIO_data() call which will release the page.
38923893

3893-
if (!writelock &&
3894+
if (recordLock != RecordLock::LOCK &&
38943895
(transaction->tra_flags & TRA_read_committed) &&
38953896
(tid_fetch != rpb->rpb_transaction_nr) &&
38963897
// added to check that it was not current transaction,
@@ -4486,7 +4487,7 @@ WriteLockResult VIO_writelock(thread_db* tdbb, record_param* org_rpb, jrd_tra* t
44864487

44874488
if (org_rpb->rpb_runtime_flags & (RPB_refetch | RPB_undo_read))
44884489
{
4489-
if (!VIO_refetch_record(tdbb, org_rpb, transaction, true, true))
4490+
if (!VIO_refetch_record(tdbb, org_rpb, transaction, (skipLocked ? RecordLock::SKIP : RecordLock::LOCK), true))
44904491
return WriteLockResult::CONFLICTED;
44914492

44924493
org_rpb->rpb_runtime_flags &= ~RPB_refetch;

src/jrd/vio_proto.h

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,13 @@ namespace Jrd
4444
DPM_next_pointer_page // data pages from one pointer page
4545
};
4646

47+
enum class RecordLock
48+
{
49+
NONE,
50+
LOCK,
51+
SKIP
52+
};
53+
4754
enum class WriteLockResult
4855
{
4956
LOCKED,
@@ -54,7 +61,7 @@ namespace Jrd
5461

5562
void VIO_backout(Jrd::thread_db*, Jrd::record_param*, const Jrd::jrd_tra*);
5663
bool VIO_chase_record_version(Jrd::thread_db*, Jrd::record_param*,
57-
Jrd::jrd_tra*, MemoryPool*, bool, bool);
64+
Jrd::jrd_tra*, MemoryPool*, Jrd::RecordLock, bool);
5865
void VIO_copy_record(Jrd::thread_db*, Jrd::jrd_rel*, Jrd::Record*, Jrd::Record*);
5966
void VIO_data(Jrd::thread_db*, Jrd::record_param*, MemoryPool*);
6067
bool VIO_erase(Jrd::thread_db*, Jrd::record_param*, Jrd::jrd_tra*);
@@ -69,7 +76,7 @@ Jrd::WriteLockResult VIO_writelock(Jrd::thread_db*, Jrd::record_param*, Jrd::jrd
6976
bool VIO_modify(Jrd::thread_db*, Jrd::record_param*, Jrd::record_param*, Jrd::jrd_tra*);
7077
bool VIO_next_record(Jrd::thread_db*, Jrd::record_param*, Jrd::jrd_tra*, MemoryPool*, Jrd::FindNextRecordScope);
7178
Jrd::Record* VIO_record(Jrd::thread_db*, Jrd::record_param*, const Jrd::Format*, MemoryPool*);
72-
bool VIO_refetch_record(Jrd::thread_db*, Jrd::record_param*, Jrd::jrd_tra*, bool, bool);
79+
bool VIO_refetch_record(Jrd::thread_db*, Jrd::record_param*, Jrd::jrd_tra*, Jrd::RecordLock, bool);
7380
void VIO_store(Jrd::thread_db*, Jrd::record_param*, Jrd::jrd_tra*);
7481
bool VIO_sweep(Jrd::thread_db*, Jrd::jrd_tra*, Jrd::TraceSweepEvent*);
7582
void VIO_intermediate_gc(Jrd::thread_db* tdbb, Jrd::record_param* rpb, Jrd::jrd_tra* transaction);

0 commit comments

Comments
 (0)