Skip to content

Commit 836d94d

Browse files
authored
support bypassing shared lock(#10667) (#10770)
close #10704 This PR support parsing the TiKV's shared lock and bypass them in conflict check. Signed-off-by: you06 <you1474600@gmail.com>
1 parent 7e58969 commit 836d94d

7 files changed

Lines changed: 24 additions & 2 deletions

File tree

dbms/src/Common/TiFlashMetrics.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -477,6 +477,7 @@ static_assert(RAFT_REGION_BIG_WRITE_THRES * 4 < RAFT_REGION_BIG_WRITE_MAX, "Inva
477477
F(type_apply_snapshot_write, {"type", "apply_snapshot_write"}), \
478478
F(type_large_txn_lock_put, {"type", "large_txn_lock_put"}), \
479479
F(type_large_txn_lock_del, {"type", "large_txn_lock_del"}), \
480+
F(type_shared_lock_put, {"type", "shared_lock_put"}), \
480481
F(type_ingest_sst, {"type", "ingest_sst"})) \
481482
M(tiflash_raft_apply_write_command_duration_seconds, \
482483
"Bucketed histogram of applying write command Raft logs", \

dbms/src/Storages/KVStore/MultiRaft/RegionCFDataBase.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,10 @@ RegionDataRes RegionCFDataBase<RegionLockCFDataTrait>::insert(TiKVKey && key, Ti
7272
{
7373
GET_METRIC(tiflash_raft_process_keys, type_large_txn_lock_put).Increment(1);
7474
}
75+
if (decoded->lock_type == kvrpcpb::Op::SharedLock)
76+
{
77+
GET_METRIC(tiflash_raft_process_keys, type_shared_lock_put).Increment(1);
78+
}
7579
}
7680
}
7781
// according to the process of pessimistic lock, just overwrite.

dbms/src/Storages/KVStore/MultiRaft/RegionData.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,7 @@ DecodedLockCFValuePtr RegionData::getLockInfo(const RegionLockReadQuery & query)
225225
const auto & lock_info = *lock_info_ptr;
226226

227227
if (lock_info.lock_version > query.read_tso || lock_info.lock_type == kvrpcpb::Op::Lock
228-
|| lock_info.lock_type == kvrpcpb::Op::PessimisticLock)
228+
|| lock_info.lock_type == kvrpcpb::Op::PessimisticLock || lock_info.lock_type == kvrpcpb::Op::SharedLock)
229229
continue;
230230
if (lock_info.min_commit_ts > query.read_tso)
231231
continue;

dbms/src/Storages/KVStore/TiKVHelpers/DecodedLockCFValue.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,10 @@ inline void decodeLockCfValue(DecodedLockCFValue & res)
4444
case LockType::Pessimistic:
4545
lock_type = kvrpcpb::Op::PessimisticLock;
4646
break;
47+
case LockType::Shared:
48+
// Skip parsing shared locks as they do not block any read requests.
49+
res.lock_type = kvrpcpb::Op::SharedLock;
50+
return;
4751
}
4852
res.lock_type = lock_type;
4953
res.primary_lock = readVarString<std::string_view>(data, len);

dbms/src/Storages/KVStore/TiKVHelpers/TiKVRecordFormat.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -370,6 +370,7 @@ enum LockType : UInt8
370370
Delete = 'D',
371371
Lock = 'L',
372372
Pessimistic = 'S',
373+
Shared = 'H',
373374
};
374375

375376
struct InnerDecodedWriteCFValue

dbms/src/Storages/KVStore/tests/gtest_kvstore.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -675,6 +675,18 @@ TEST_F(RegionKVStoreOldTest, RegionReadWrite)
675675
}
676676
region->clearAllData();
677677
}
678+
{
679+
region->insert(
680+
"lock",
681+
RecordKVFormat::genKey(table_id, 3),
682+
RecordKVFormat::encodeLockCfValue(RecordKVFormat::LockType::Shared, "PK", 3, 20, nullptr, 5));
683+
{
684+
auto iter = region->createCommittedScanner(true, true);
685+
auto lock = iter.getLockInfo({100, nullptr});
686+
ASSERT_EQ(lock, nullptr);
687+
}
688+
region->clearAllData();
689+
}
678690
{
679691
// Test duplicate and tryCompactionFilter
680692
region->insert(

0 commit comments

Comments
 (0)