Skip to content

Commit 9f17f2a

Browse files
hust-hhbgavinchou
authored andcommitted
[fix](cloud-mow) Fix clear GetDeleteBitmapResponse problem when geting delete bitmap fail and retry (apache#43358)
Problem Summary: pr apache#43261 doesn't clear GetDeleteBitmapResponse correctly, this pr fix this problem
1 parent 0ab780c commit 9f17f2a

File tree

4 files changed

+84
-1
lines changed

4 files changed

+84
-1
lines changed

be/src/cloud/cloud_meta_mgr.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -694,6 +694,13 @@ Status CloudMetaMgr::sync_tablet_delete_bitmap(CloudTablet* tablet, int64_t old_
694694
const auto& segment_ids = res.segment_ids();
695695
const auto& vers = res.versions();
696696
const auto& delete_bitmaps = res.segment_delete_bitmaps();
697+
if (rowset_ids.size() != segment_ids.size() || rowset_ids.size() != vers.size() ||
698+
rowset_ids.size() != delete_bitmaps.size()) {
699+
return Status::Error<ErrorCode::INTERNAL_ERROR, false>(
700+
"get delete bitmap data wrong,"
701+
"rowset_ids.size={},segment_ids.size={},vers.size={},delete_bitmaps.size={}",
702+
rowset_ids.size(), segment_ids.size(), vers.size(), delete_bitmaps.size());
703+
}
697704
for (size_t i = 0; i < rowset_ids.size(); i++) {
698705
RowsetId rst_id;
699706
rst_id.init(rowset_ids[i]);

cloud/src/meta-service/meta_service.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1942,6 +1942,11 @@ void MetaServiceImpl::get_delete_bitmap(google::protobuf::RpcController* control
19421942
last_ver = ver;
19431943
last_seg_id = seg_id;
19441944
} else {
1945+
TEST_SYNC_POINT_CALLBACK("get_delete_bitmap_code", &code);
1946+
if (code != MetaServiceCode::OK) {
1947+
msg = "test get get_delete_bitmap fail,code=" + MetaServiceCode_Name(code);
1948+
return;
1949+
}
19451950
response->mutable_segment_delete_bitmaps()->rbegin()->append(v);
19461951
}
19471952
}

cloud/src/meta-service/meta_service_helper.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ void finish_rpc(std::string_view func_name, brpc::Controller* ctrl, Response* re
9696
res->clear_rowset_ids();
9797
res->clear_segment_ids();
9898
res->clear_versions();
99-
res->segment_delete_bitmaps();
99+
res->clear_segment_delete_bitmaps();
100100
}
101101
LOG(INFO) << "finish " << func_name << " from " << ctrl->remote_side()
102102
<< " status=" << res->status().ShortDebugString()

cloud/test/meta_service_test.cpp

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5034,6 +5034,77 @@ TEST(MetaServiceTest, DeleteBimapCommitTxnTest) {
50345034
}
50355035
}
50365036

5037+
TEST(MetaServiceTest, GetDeleteBitmapWithRetryTest) {
5038+
auto meta_service = get_meta_service();
5039+
SyncPoint::get_instance()->enable_processing();
5040+
size_t index = 0;
5041+
SyncPoint::get_instance()->set_call_back("get_delete_bitmap_code", [&](auto&& args) {
5042+
LOG(INFO) << "GET_DELETE_BITMAP_CODE,index=" << index;
5043+
if (++index < 2) {
5044+
*doris::try_any_cast<MetaServiceCode*>(args[0]) = MetaServiceCode::KV_TXN_TOO_OLD;
5045+
}
5046+
});
5047+
5048+
// get delete bitmap update lock
5049+
brpc::Controller cntl;
5050+
GetDeleteBitmapUpdateLockRequest get_lock_req;
5051+
GetDeleteBitmapUpdateLockResponse get_lock_res;
5052+
get_lock_req.set_cloud_unique_id("test_cloud_unique_id");
5053+
get_lock_req.set_table_id(100);
5054+
get_lock_req.add_partition_ids(123);
5055+
get_lock_req.set_expiration(5);
5056+
get_lock_req.set_lock_id(888);
5057+
get_lock_req.set_initiator(-1);
5058+
meta_service->get_delete_bitmap_update_lock(
5059+
reinterpret_cast<::google::protobuf::RpcController*>(&cntl), &get_lock_req,
5060+
&get_lock_res, nullptr);
5061+
ASSERT_EQ(get_lock_res.status().code(), MetaServiceCode::OK);
5062+
5063+
//first update new key
5064+
UpdateDeleteBitmapRequest update_delete_bitmap_req;
5065+
UpdateDeleteBitmapResponse update_delete_bitmap_res;
5066+
update_delete_bitmap_req.set_cloud_unique_id("test_cloud_unique_id");
5067+
update_delete_bitmap_req.set_table_id(100);
5068+
update_delete_bitmap_req.set_partition_id(123);
5069+
update_delete_bitmap_req.set_lock_id(888);
5070+
update_delete_bitmap_req.set_initiator(-1);
5071+
update_delete_bitmap_req.set_tablet_id(333);
5072+
std::string large_value = generate_random_string(300 * 1000 * 3);
5073+
update_delete_bitmap_req.add_rowset_ids("456");
5074+
update_delete_bitmap_req.add_segment_ids(0);
5075+
update_delete_bitmap_req.add_versions(2);
5076+
update_delete_bitmap_req.add_segment_delete_bitmaps(large_value);
5077+
meta_service->update_delete_bitmap(reinterpret_cast<google::protobuf::RpcController*>(&cntl),
5078+
&update_delete_bitmap_req, &update_delete_bitmap_res,
5079+
nullptr);
5080+
ASSERT_EQ(update_delete_bitmap_res.status().code(), MetaServiceCode::OK);
5081+
5082+
GetDeleteBitmapRequest get_delete_bitmap_req;
5083+
GetDeleteBitmapResponse get_delete_bitmap_res;
5084+
get_delete_bitmap_req.set_cloud_unique_id("test_cloud_unique_id");
5085+
get_delete_bitmap_req.set_tablet_id(333);
5086+
5087+
get_delete_bitmap_req.add_rowset_ids("456");
5088+
get_delete_bitmap_req.add_begin_versions(2);
5089+
get_delete_bitmap_req.add_end_versions(2);
5090+
5091+
meta_service->get_delete_bitmap(reinterpret_cast<google::protobuf::RpcController*>(&cntl),
5092+
&get_delete_bitmap_req, &get_delete_bitmap_res, nullptr);
5093+
ASSERT_EQ(get_delete_bitmap_res.status().code(), MetaServiceCode::OK);
5094+
ASSERT_EQ(get_delete_bitmap_res.rowset_ids_size(), 1);
5095+
ASSERT_EQ(get_delete_bitmap_res.segment_ids_size(), 1);
5096+
ASSERT_EQ(get_delete_bitmap_res.versions_size(), 1);
5097+
ASSERT_EQ(get_delete_bitmap_res.segment_delete_bitmaps_size(), 1);
5098+
5099+
ASSERT_EQ(get_delete_bitmap_res.rowset_ids(0), "456");
5100+
ASSERT_EQ(get_delete_bitmap_res.segment_ids(0), 0);
5101+
ASSERT_EQ(get_delete_bitmap_res.versions(0), 2);
5102+
ASSERT_EQ(get_delete_bitmap_res.segment_delete_bitmaps(0), large_value);
5103+
5104+
SyncPoint::get_instance()->disable_processing();
5105+
SyncPoint::get_instance()->clear_all_call_backs();
5106+
}
5107+
50375108
TEST(MetaServiceTest, GetVersion) {
50385109
auto service = get_meta_service();
50395110

0 commit comments

Comments
 (0)