diff --git a/contrib/kvproto b/contrib/kvproto index db74bf0e3ac..6db24b6c67f 160000 --- a/contrib/kvproto +++ b/contrib/kvproto @@ -1 +1 @@ -Subproject commit db74bf0e3ac1afb162b00d7f3ca5752006eb79dc +Subproject commit 6db24b6c67f30a03694931462d12c2e6982c63e2 diff --git a/dbms/src/Common/TiFlashMetrics.h b/dbms/src/Common/TiFlashMetrics.h index fbfaf903c28..a49e92e8e89 100644 --- a/dbms/src/Common/TiFlashMetrics.h +++ b/dbms/src/Common/TiFlashMetrics.h @@ -507,6 +507,7 @@ static_assert(RAFT_REGION_BIG_WRITE_THRES * 4 < RAFT_REGION_BIG_WRITE_MAX, "Inva F(type_write_del, {"type", "write_del"}), \ F(type_lock_del, {"type", "lock_del"}), \ F(type_pessimistic_lock_put, {"type", "pessimistic_lock_put"}), \ + F(type_shared_lock_put, {"type", "shared_lock_put"}), \ F(type_lock_replaced, {"type", "lock_replaced"}), \ F(type_default_del, {"type", "default_del"}), \ F(type_apply_snapshot, {"type", "apply_snapshot"}), \ diff --git a/dbms/src/Storages/KVStore/TiKVHelpers/DecodedLockCFValue.cpp b/dbms/src/Storages/KVStore/TiKVHelpers/DecodedLockCFValue.cpp index f1ef4970b41..1e899751e9e 100644 --- a/dbms/src/Storages/KVStore/TiKVHelpers/DecodedLockCFValue.cpp +++ b/dbms/src/Storages/KVStore/TiKVHelpers/DecodedLockCFValue.cpp @@ -48,6 +48,10 @@ namespace RecordKVFormat case LockType::Pessimistic: lock_type = kvrpcpb::Op::PessimisticLock; break; + case LockType::Shared: + // Skip parsing shared locks as they do not block any read requests. + res.lock_type = kvrpcpb::Op::SharedLock; + return inner; } res.lock_type = lock_type; res.primary_lock = readVarString(data, len); @@ -166,6 +170,10 @@ DecodedLockCFValue::DecodedLockCFValue(std::shared_ptr key_, std: { GET_METRIC(tiflash_raft_process_keys, type_pessimistic_lock_put).Increment(1); } + else if (parsed->lock_type == kvrpcpb::Op::SharedLock) + { + GET_METRIC(tiflash_raft_process_keys, type_shared_lock_put).Increment(1); + } if (parsed->generation == 0) { // It is not a large txn, we cache the parsed lock. @@ -244,7 +252,8 @@ void DecodedLockCFValue::Inner::getLockInfoPtr( LockInfoPtr & res) const { res = nullptr; - if (lock_version > query.read_tso || lock_type == kvrpcpb::Op::Lock || lock_type == kvrpcpb::Op::PessimisticLock) + if (lock_version > query.read_tso || lock_type == kvrpcpb::Op::Lock || lock_type == kvrpcpb::Op::PessimisticLock + || lock_type == kvrpcpb::Op::SharedLock) return; if (min_commit_ts > query.read_tso) return; diff --git a/dbms/src/Storages/KVStore/TiKVHelpers/TiKVRecordFormat.h b/dbms/src/Storages/KVStore/TiKVHelpers/TiKVRecordFormat.h index 78eadace43c..0fa1e35b2a3 100644 --- a/dbms/src/Storages/KVStore/TiKVHelpers/TiKVRecordFormat.h +++ b/dbms/src/Storages/KVStore/TiKVHelpers/TiKVRecordFormat.h @@ -351,6 +351,7 @@ enum LockType : UInt8 Delete = 'D', Lock = 'L', Pessimistic = 'S', + Shared = 'H', }; struct InnerDecodedWriteCFValue diff --git a/dbms/src/Storages/KVStore/tests/gtest_kvstore.cpp b/dbms/src/Storages/KVStore/tests/gtest_kvstore.cpp index ae3816bca17..e3b7bee464f 100644 --- a/dbms/src/Storages/KVStore/tests/gtest_kvstore.cpp +++ b/dbms/src/Storages/KVStore/tests/gtest_kvstore.cpp @@ -720,6 +720,19 @@ TEST_F(RegionKVStoreOldTest, RegionReadWrite) } region->clearAllData(); } + { + region->insertFromSnap( + tmt, + "lock", + RecordKVFormat::genKey(table_id, 3), + RecordKVFormat::encodeLockCfValue(RecordKVFormat::LockType::Shared, "PK", 3, 20, nullptr, 5)); + { + auto iter = region->createCommittedScanner(true, true); + auto lock = iter.getLockInfo({100, nullptr}); + ASSERT_EQ(lock, nullptr); + } + region->clearAllData(); + } { // Test duplicate and tryCompactionFilter region->insertFromSnap(