From e746e1ab46e526f3ca3033f54ba6479ead25bc20 Mon Sep 17 00:00:00 2001 From: huanghaibin <284824253@qq.com> Date: Wed, 6 Nov 2024 16:58:54 +0800 Subject: [PATCH] [fix](cloud-mow) Fix clear GetDeleteBitmapResponse problem when geting delete bitmap fail and retry --- be/src/cloud/cloud_meta_mgr.cpp | 7 ++ cloud/src/meta-service/meta_service.cpp | 5 ++ cloud/src/meta-service/meta_service_helper.h | 2 +- cloud/test/meta_service_test.cpp | 71 ++++++++++++++++++++ 4 files changed, 84 insertions(+), 1 deletion(-) diff --git a/be/src/cloud/cloud_meta_mgr.cpp b/be/src/cloud/cloud_meta_mgr.cpp index 15d52daac4120a..c4be539c13c350 100644 --- a/be/src/cloud/cloud_meta_mgr.cpp +++ b/be/src/cloud/cloud_meta_mgr.cpp @@ -704,6 +704,13 @@ Status CloudMetaMgr::sync_tablet_delete_bitmap(CloudTablet* tablet, int64_t old_ const auto& segment_ids = res.segment_ids(); const auto& vers = res.versions(); const auto& delete_bitmaps = res.segment_delete_bitmaps(); + if (rowset_ids.size() != segment_ids.size() || rowset_ids.size() != vers.size() || + rowset_ids.size() != delete_bitmaps.size()) { + return Status::Error( + "get delete bitmap data wrong," + "rowset_ids.size={},segment_ids.size={},vers.size={},delete_bitmaps.size={}", + rowset_ids.size(), segment_ids.size(), vers.size(), delete_bitmaps.size()); + } for (size_t i = 0; i < rowset_ids.size(); i++) { RowsetId rst_id; rst_id.init(rowset_ids[i]); diff --git a/cloud/src/meta-service/meta_service.cpp b/cloud/src/meta-service/meta_service.cpp index dfa06ca5fa08dc..0d67f9e4406656 100644 --- a/cloud/src/meta-service/meta_service.cpp +++ b/cloud/src/meta-service/meta_service.cpp @@ -1942,6 +1942,11 @@ void MetaServiceImpl::get_delete_bitmap(google::protobuf::RpcController* control last_ver = ver; last_seg_id = seg_id; } else { + TEST_SYNC_POINT_CALLBACK("get_delete_bitmap_code", &code); + if (code != MetaServiceCode::OK) { + msg = "test get get_delete_bitmap fail,code=" + MetaServiceCode_Name(code); + return; + } response->mutable_segment_delete_bitmaps()->rbegin()->append(v); } } diff --git a/cloud/src/meta-service/meta_service_helper.h b/cloud/src/meta-service/meta_service_helper.h index d2be8ac32742a4..9e9ff38c2ecda0 100644 --- a/cloud/src/meta-service/meta_service_helper.h +++ b/cloud/src/meta-service/meta_service_helper.h @@ -96,7 +96,7 @@ void finish_rpc(std::string_view func_name, brpc::Controller* ctrl, Response* re res->clear_rowset_ids(); res->clear_segment_ids(); res->clear_versions(); - res->segment_delete_bitmaps(); + res->clear_segment_delete_bitmaps(); } LOG(INFO) << "finish " << func_name << " from " << ctrl->remote_side() << " status=" << res->status().ShortDebugString() diff --git a/cloud/test/meta_service_test.cpp b/cloud/test/meta_service_test.cpp index ee90e604e1c5f6..ba0aedf93335d1 100644 --- a/cloud/test/meta_service_test.cpp +++ b/cloud/test/meta_service_test.cpp @@ -5036,6 +5036,77 @@ TEST(MetaServiceTest, DeleteBimapCommitTxnTest) { } } +TEST(MetaServiceTest, GetDeleteBitmapWithRetryTest) { + auto meta_service = get_meta_service(); + SyncPoint::get_instance()->enable_processing(); + size_t index = 0; + SyncPoint::get_instance()->set_call_back("get_delete_bitmap_code", [&](auto&& args) { + LOG(INFO) << "GET_DELETE_BITMAP_CODE,index=" << index; + if (++index < 2) { + *doris::try_any_cast(args[0]) = MetaServiceCode::KV_TXN_TOO_OLD; + } + }); + + // get delete bitmap update lock + brpc::Controller cntl; + GetDeleteBitmapUpdateLockRequest get_lock_req; + GetDeleteBitmapUpdateLockResponse get_lock_res; + get_lock_req.set_cloud_unique_id("test_cloud_unique_id"); + get_lock_req.set_table_id(100); + get_lock_req.add_partition_ids(123); + get_lock_req.set_expiration(5); + get_lock_req.set_lock_id(888); + get_lock_req.set_initiator(-1); + meta_service->get_delete_bitmap_update_lock( + reinterpret_cast<::google::protobuf::RpcController*>(&cntl), &get_lock_req, + &get_lock_res, nullptr); + ASSERT_EQ(get_lock_res.status().code(), MetaServiceCode::OK); + + //first update new key + UpdateDeleteBitmapRequest update_delete_bitmap_req; + UpdateDeleteBitmapResponse update_delete_bitmap_res; + update_delete_bitmap_req.set_cloud_unique_id("test_cloud_unique_id"); + update_delete_bitmap_req.set_table_id(100); + update_delete_bitmap_req.set_partition_id(123); + update_delete_bitmap_req.set_lock_id(888); + update_delete_bitmap_req.set_initiator(-1); + update_delete_bitmap_req.set_tablet_id(333); + std::string large_value = generate_random_string(300 * 1000 * 3); + update_delete_bitmap_req.add_rowset_ids("456"); + update_delete_bitmap_req.add_segment_ids(0); + update_delete_bitmap_req.add_versions(2); + update_delete_bitmap_req.add_segment_delete_bitmaps(large_value); + meta_service->update_delete_bitmap(reinterpret_cast(&cntl), + &update_delete_bitmap_req, &update_delete_bitmap_res, + nullptr); + ASSERT_EQ(update_delete_bitmap_res.status().code(), MetaServiceCode::OK); + + GetDeleteBitmapRequest get_delete_bitmap_req; + GetDeleteBitmapResponse get_delete_bitmap_res; + get_delete_bitmap_req.set_cloud_unique_id("test_cloud_unique_id"); + get_delete_bitmap_req.set_tablet_id(333); + + get_delete_bitmap_req.add_rowset_ids("456"); + get_delete_bitmap_req.add_begin_versions(2); + get_delete_bitmap_req.add_end_versions(2); + + meta_service->get_delete_bitmap(reinterpret_cast(&cntl), + &get_delete_bitmap_req, &get_delete_bitmap_res, nullptr); + ASSERT_EQ(get_delete_bitmap_res.status().code(), MetaServiceCode::OK); + ASSERT_EQ(get_delete_bitmap_res.rowset_ids_size(), 1); + ASSERT_EQ(get_delete_bitmap_res.segment_ids_size(), 1); + ASSERT_EQ(get_delete_bitmap_res.versions_size(), 1); + ASSERT_EQ(get_delete_bitmap_res.segment_delete_bitmaps_size(), 1); + + ASSERT_EQ(get_delete_bitmap_res.rowset_ids(0), "456"); + ASSERT_EQ(get_delete_bitmap_res.segment_ids(0), 0); + ASSERT_EQ(get_delete_bitmap_res.versions(0), 2); + ASSERT_EQ(get_delete_bitmap_res.segment_delete_bitmaps(0), large_value); + + SyncPoint::get_instance()->disable_processing(); + SyncPoint::get_instance()->clear_all_call_backs(); +} + TEST(MetaServiceTest, GetVersion) { auto service = get_meta_service();