From 596a87df758e1e00715f63c22cabc4c6dadfba10 Mon Sep 17 00:00:00 2001 From: meiyi Date: Thu, 19 Jun 2025 19:09:49 +0800 Subject: [PATCH 1/3] [fix](mow) fix update delete bitmap lock not removed if schema change for empty tablet (#51780) fix update delete bitmap lock not removed if schema change for empty tablet --- cloud/src/meta-service/meta_service_job.cpp | 31 +++++++++++---------- cloud/test/meta_service_job_test.cpp | 23 +++++++++++++++ 2 files changed, 39 insertions(+), 15 deletions(-) diff --git a/cloud/src/meta-service/meta_service_job.cpp b/cloud/src/meta-service/meta_service_job.cpp index 8d8da279b733e0..a6fff9f79bc120 100644 --- a/cloud/src/meta-service/meta_service_job.cpp +++ b/cloud/src/meta-service/meta_service_job.cpp @@ -1188,6 +1188,22 @@ void process_schema_change_job(MetaServiceCode& code, std::string& msg, std::str new_tablet_meta.SerializeToString(&new_tablet_val); txn->put(new_tablet_key, new_tablet_val); + // process mow table, check lock + if (new_tablet_meta.enable_unique_key_merge_on_write()) { + bool success = check_and_remove_delete_bitmap_update_lock( + code, msg, ss, txn, instance_id, new_table_id, new_tablet_id, + SCHEMA_CHANGE_DELETE_BITMAP_LOCK_ID, schema_change.delete_bitmap_lock_initiator(), + use_version); + if (!success) { + return; + } + + std::string pending_key = meta_pending_delete_bitmap_key({instance_id, new_tablet_id}); + txn->remove(pending_key); + LOG(INFO) << "xxx sc remove delete bitmap pending key, pending_key=" << hex(pending_key) + << " tablet_id=" << new_tablet_id << ", job_id=" << schema_change.id(); + } + //========================================================================== // move rowsets [2-alter_version] to recycle //========================================================================== @@ -1317,21 +1333,6 @@ void process_schema_change_job(MetaServiceCode& code, std::string& msg, std::str return; } - // process mow table, check lock - if (new_tablet_meta.enable_unique_key_merge_on_write()) { - bool success = check_and_remove_delete_bitmap_update_lock( - code, msg, ss, txn, instance_id, new_table_id, SCHEMA_CHANGE_DELETE_BITMAP_LOCK_ID, - schema_change.delete_bitmap_lock_initiator()); - if (!success) { - return; - } - - std::string pending_key = meta_pending_delete_bitmap_key({instance_id, new_tablet_id}); - txn->remove(pending_key); - LOG(INFO) << "xxx sc remove delete bitmap pending key, pending_key=" << hex(pending_key) - << " tablet_id=" << new_tablet_id << "job_id=" << schema_change.id(); - } - for (size_t i = 0; i < schema_change.txn_ids().size(); ++i) { auto tmp_rowset_key = meta_rowset_tmp_key({instance_id, schema_change.txn_ids().at(i), new_tablet_id}); diff --git a/cloud/test/meta_service_job_test.cpp b/cloud/test/meta_service_job_test.cpp index cf1b8cd7d581d8..551b85c082d10f 100644 --- a/cloud/test/meta_service_job_test.cpp +++ b/cloud/test/meta_service_job_test.cpp @@ -1881,6 +1881,29 @@ TEST(MetaServiceJobTest, SchemaChangeJobWithMoWTest) { remove_delete_bitmap_lock(meta_service.get(), table_id); res.Clear(); } + + // alter version < 2 + { + int64_t new_tablet_id = 16; + ASSERT_NO_FATAL_FAILURE(create_tablet(meta_service.get(), table_id, index_id, partition_id, + new_tablet_id, true, true)); + StartTabletJobResponse sc_res; + ASSERT_NO_FATAL_FAILURE(start_schema_change_job(meta_service.get(), table_id, index_id, + partition_id, tablet_id, new_tablet_id, + "job2", "be1", sc_res)); + std::vector output_rowsets; + auto res_code = get_delete_bitmap_lock(meta_service.get(), table_id, -2, 12345); + ASSERT_EQ(res_code, MetaServiceCode::OK); + FinishTabletJobResponse res; + finish_schema_change_job(meta_service.get(), tablet_id, new_tablet_id, "job2", "be1", + output_rowsets, res); + ASSERT_EQ(res.status().code(), MetaServiceCode::OK); + res_code = get_delete_bitmap_lock(meta_service.get(), table_id, 100, -1); + ASSERT_EQ(res_code, MetaServiceCode::OK); + res_code = remove_delete_bitmap_lock(meta_service.get(), table_id, 100, -1); + ASSERT_EQ(res_code, MetaServiceCode::OK); + res.Clear(); + } } TEST(MetaServiceJobTest, ConcurrentCompactionTest) { From b2938e24487c97a39cc9cd2f4e1a8efcb7cbd949 Mon Sep 17 00:00:00 2001 From: meiyi Date: Tue, 24 Jun 2025 10:36:46 +0800 Subject: [PATCH 2/3] fix --- cloud/src/meta-service/meta_service_job.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/cloud/src/meta-service/meta_service_job.cpp b/cloud/src/meta-service/meta_service_job.cpp index a6fff9f79bc120..c71859decb743e 100644 --- a/cloud/src/meta-service/meta_service_job.cpp +++ b/cloud/src/meta-service/meta_service_job.cpp @@ -1191,9 +1191,8 @@ void process_schema_change_job(MetaServiceCode& code, std::string& msg, std::str // process mow table, check lock if (new_tablet_meta.enable_unique_key_merge_on_write()) { bool success = check_and_remove_delete_bitmap_update_lock( - code, msg, ss, txn, instance_id, new_table_id, new_tablet_id, - SCHEMA_CHANGE_DELETE_BITMAP_LOCK_ID, schema_change.delete_bitmap_lock_initiator(), - use_version); + code, msg, ss, txn, instance_id, new_table_id, SCHEMA_CHANGE_DELETE_BITMAP_LOCK_ID, + schema_change.delete_bitmap_lock_initiator()); if (!success) { return; } @@ -1201,7 +1200,7 @@ void process_schema_change_job(MetaServiceCode& code, std::string& msg, std::str std::string pending_key = meta_pending_delete_bitmap_key({instance_id, new_tablet_id}); txn->remove(pending_key); LOG(INFO) << "xxx sc remove delete bitmap pending key, pending_key=" << hex(pending_key) - << " tablet_id=" << new_tablet_id << ", job_id=" << schema_change.id(); + << " tablet_id=" << new_tablet_id << "job_id=" << schema_change.id(); } //========================================================================== From 6cb01c786208bafac4acb9ff9ec9d1785317e748 Mon Sep 17 00:00:00 2001 From: meiyi Date: Tue, 24 Jun 2025 10:47:44 +0800 Subject: [PATCH 3/3] fix case --- cloud/test/meta_service_job_test.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/cloud/test/meta_service_job_test.cpp b/cloud/test/meta_service_job_test.cpp index 551b85c082d10f..521d01d101fbad 100644 --- a/cloud/test/meta_service_job_test.cpp +++ b/cloud/test/meta_service_job_test.cpp @@ -1900,8 +1900,7 @@ TEST(MetaServiceJobTest, SchemaChangeJobWithMoWTest) { ASSERT_EQ(res.status().code(), MetaServiceCode::OK); res_code = get_delete_bitmap_lock(meta_service.get(), table_id, 100, -1); ASSERT_EQ(res_code, MetaServiceCode::OK); - res_code = remove_delete_bitmap_lock(meta_service.get(), table_id, 100, -1); - ASSERT_EQ(res_code, MetaServiceCode::OK); + remove_delete_bitmap_lock(meta_service.get(), table_id); res.Clear(); } }