@@ -541,29 +541,8 @@ Status CloudSchemaChangeJob::_convert_historical_rowsets(const SchemaChangeParam
541541 // during double write phase by `CloudMetaMgr::sync_tablet_rowsets` in another thread
542542 std::unique_lock lock {_new_tablet->get_sync_meta_lock ()};
543543 std::unique_lock wlock (_new_tablet->get_header_lock ());
544- // Mirror MS behavior: delete rowsets in [2, alter_version] before adding
545- // SC output rowsets to avoid stale compaction rowsets remaining visible.
546- {
547- int64_t alter_ver = sc_job->alter_version ();
548- std::vector<RowsetSharedPtr> to_delete;
549- for (auto & [v, rs] : _new_tablet->rowset_map ()) {
550- if (v.first >= 2 && v.second <= alter_ver) {
551- to_delete.push_back (rs);
552- }
553- }
554- if (!to_delete.empty ()) {
555- LOG_INFO (
556- " schema change: delete {} local rowsets in [2, {}] before adding SC "
557- " output, tablet_id={}, versions=[{}]" ,
558- to_delete.size (), alter_ver, _new_tablet->tablet_id (),
559- fmt::join (to_delete | std::views::transform ([](const auto & rs) {
560- return rs->version ().to_string ();
561- }),
562- " , " ));
563- _new_tablet->delete_rowsets_for_schema_change (to_delete, wlock);
564- }
565- }
566- _new_tablet->add_rowsets (std::move (_output_rowsets), true , wlock, false );
544+ _new_tablet->replace_rowsets_with_schema_change_output (
545+ _output_rowsets, sc_job->alter_version (), wlock, " commit" , true );
567546 // Ensure the real new tablet has a continuous local version graph before it becomes
568547 // visible. Later RUNNING-tablet delete bitmap sync depends on capturing all old versions.
569548 RETURN_IF_ERROR (_cloud_storage_engine.meta_mgr ().fill_version_holes (
@@ -610,6 +589,11 @@ Status CloudSchemaChangeJob::_process_delete_bitmap(int64_t alter_version,
610589
611590 // step 1, process incremental rowset without delete bitmap update lock
612591 RETURN_IF_ERROR (_cloud_storage_engine.meta_mgr ().sync_tablet_rowsets (tmp_tablet.get ()));
592+ {
593+ std::unique_lock wlock (tmp_tablet->get_header_lock ());
594+ tmp_tablet->replace_rowsets_with_schema_change_output (_output_rowsets, alter_version, wlock,
595+ " delete_bitmap_without_lock" , false );
596+ }
613597 int64_t max_version = tmp_tablet->max_version ().second ;
614598 LOG (INFO) << " alter table for mow table, calculate delete bitmap of "
615599 << " incremental rowsets without lock, version: " << start_calc_delete_bitmap_version
@@ -619,10 +603,6 @@ Status CloudSchemaChangeJob::_process_delete_bitmap(int64_t alter_version,
619603 {start_calc_delete_bitmap_version, max_version}, CaptureRowsetOps {}));
620604 DBUG_EXECUTE_IF (" CloudSchemaChangeJob::_process_delete_bitmap.after.capture_without_lock" ,
621605 DBUG_BLOCK);
622- {
623- std::unique_lock wlock (tmp_tablet->get_header_lock ());
624- tmp_tablet->add_rowsets (_output_rowsets, true , wlock, false );
625- }
626606 for (auto rowset : ret.rowsets ) {
627607 RETURN_IF_ERROR (CloudTablet::update_delete_bitmap_without_lock (tmp_tablet, rowset));
628608 }
@@ -635,17 +615,18 @@ Status CloudSchemaChangeJob::_process_delete_bitmap(int64_t alter_version,
635615 RETURN_IF_ERROR (_cloud_storage_engine.meta_mgr ().get_delete_bitmap_update_lock (
636616 *_new_tablet, SCHEMA_CHANGE_DELETE_BITMAP_LOCK_ID, initiator));
637617 RETURN_IF_ERROR (_cloud_storage_engine.meta_mgr ().sync_tablet_rowsets (tmp_tablet.get ()));
618+ {
619+ std::unique_lock wlock (tmp_tablet->get_header_lock ());
620+ tmp_tablet->replace_rowsets_with_schema_change_output (_output_rowsets, alter_version, wlock,
621+ " delete_bitmap_with_lock" , false );
622+ }
638623 int64_t new_max_version = tmp_tablet->max_version ().second ;
639624 LOG (INFO) << " alter table for mow table, calculate delete bitmap of "
640625 << " incremental rowsets with lock, version: " << max_version + 1 << " -"
641626 << new_max_version << " new_tablet_id: " << _new_tablet->tablet_id ();
642627 if (new_max_version > max_version) {
643628 auto ret = DORIS_TRY (tmp_tablet->capture_consistent_rowsets_unlocked (
644629 {max_version + 1 , new_max_version}, CaptureRowsetOps {}));
645- {
646- std::unique_lock wlock (tmp_tablet->get_header_lock ());
647- tmp_tablet->add_rowsets (_output_rowsets, true , wlock, false );
648- }
649630 for (auto rowset : ret.rowsets ) {
650631 RETURN_IF_ERROR (CloudTablet::update_delete_bitmap_without_lock (tmp_tablet, rowset));
651632 }
0 commit comments