This is an automated email from the ASF dual-hosted git repository. yiguolei pushed a commit to branch branch-2.1 in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/branch-2.1 by this push: new 72489a04c32 [cherry-pick](branch-2.1) remove some CHECKs in Tablet::revise_tablet_meta (#31268) (#34702) 72489a04c32 is described below commit 72489a04c32cde4a287c66087d17213824df298c Author: zhannngchen <48427519+zhannngc...@users.noreply.github.com> AuthorDate: Sun Jun 2 00:15:31 2024 +0800 [cherry-pick](branch-2.1) remove some CHECKs in Tablet::revise_tablet_meta (#31268) (#34702) ## Proposed changes Issue Number: close #xxx cherry-pick #31268 ## Further comments If this is a relatively large or complex change, kick off the discussion at [d...@doris.apache.org](mailto:d...@doris.apache.org) by explaining why you chose the solution you did and what alternatives you considered, etc... --- be/src/olap/tablet.cpp | 110 ++++++++++++++++++++++++++++----- be/src/olap/tablet.h | 4 +- be/src/olap/task/engine_clone_task.cpp | 2 +- 3 files changed, 97 insertions(+), 19 deletions(-) diff --git a/be/src/olap/tablet.cpp b/be/src/olap/tablet.cpp index fdc12896b2b..e5cdc2b5d96 100644 --- a/be/src/olap/tablet.cpp +++ b/be/src/olap/tablet.cpp @@ -355,11 +355,19 @@ Status Tablet::revise_tablet_meta(const std::vector<RowsetSharedPtr>& to_add, const std::vector<RowsetSharedPtr>& to_delete, bool is_incremental_clone) { LOG(INFO) << "begin to revise tablet. tablet_id=" << tablet_id(); - delete_rowsets(to_delete, false); - add_rowsets(to_add); - // reconstruct from tablet meta - _timestamped_version_tracker.construct_versioned_tracker(_tablet_meta->all_rs_metas()); - if (keys_type() == UNIQUE_KEYS && enable_unique_key_merge_on_write()) { + // 1. for incremental clone, we have to add the rowsets first to make it easy to compute + // all the delete bitmaps, and it's easy to delete them if we end up with a failure + // 2. for full clone, we can calculate delete bitmaps on the cloned rowsets directly. + if (is_incremental_clone) { + CHECK(to_delete.empty()); // don't need to delete rowsets + add_rowsets(to_add); + // reconstruct from tablet meta + _timestamped_version_tracker.construct_versioned_tracker(_tablet_meta->all_rs_metas()); + } + + Status calc_bm_status; + std::vector<RowsetSharedPtr> base_rowsets_for_full_clone = to_add; // copy vector + while (keys_type() == UNIQUE_KEYS && enable_unique_key_merge_on_write()) { std::vector<RowsetSharedPtr> calc_delete_bitmap_rowsets; int64_t to_add_min_version = INT64_MAX; int64_t to_add_max_version = INT64_MIN; @@ -394,17 +402,70 @@ Status Tablet::revise_tablet_meta(const std::vector<RowsetSharedPtr>& to_add, } if (calc_delete_bitmap_ver.first <= calc_delete_bitmap_ver.second) { - Status res = + calc_bm_status = capture_consistent_rowsets(calc_delete_bitmap_ver, &calc_delete_bitmap_rowsets); - // Because the data in memory has been changed, can't return an error. - CHECK(res.ok()) << "fail to capture_consistent_rowsets, res: " << res; - + if (!calc_bm_status.ok()) { + LOG(WARNING) << "fail to capture_consistent_rowsets, res: " << calc_bm_status; + break; + } for (auto rs : calc_delete_bitmap_rowsets) { - res = update_delete_bitmap_without_lock(rs); - CHECK(res.ok()) << "fail to update_delete_bitmap_without_lock, res: " << res; + if (is_incremental_clone) { + calc_bm_status = update_delete_bitmap_without_lock(rs); + } else { + calc_bm_status = + update_delete_bitmap_without_lock(rs, &base_rowsets_for_full_clone); + base_rowsets_for_full_clone.push_back(rs); + } + if (!calc_bm_status.ok()) { + LOG(WARNING) << "fail to update_delete_bitmap_without_lock, res: " + << calc_bm_status; + break; + } } } + break; // while (keys_type() == UNIQUE_KEYS && enable_unique_key_merge_on_write()) + } + + // error handling + if (!calc_bm_status.ok()) { + if (is_incremental_clone) { + delete_rowsets(to_add, false); + LOG(WARNING) << "incremental clone on tablet: " << tablet_id() << " failed due to " + << calc_bm_status.msg() << ", revert " << to_add.size() + << " rowsets added before."; + } else { + LOG(WARNING) << "full clone on tablet: " << tablet_id() << " failed due to " + << calc_bm_status.msg() << ", will not update tablet meta."; + } + return calc_bm_status; } + + // full clone, calculate delete bitmap succeeded, update rowset + if (!is_incremental_clone) { + delete_rowsets(to_delete, false); + add_rowsets(to_add); + // reconstruct from tablet meta + _timestamped_version_tracker.construct_versioned_tracker(_tablet_meta->all_rs_metas()); + + // check the rowsets used for delete bitmap calculation is equal to the rowsets + // that we can capture by version + if (keys_type() == UNIQUE_KEYS && enable_unique_key_merge_on_write()) { + Version full_version = Version(0, max_version_unlocked().second); + std::vector<RowsetSharedPtr> expected_rowsets; + auto st = capture_consistent_rowsets(full_version, &expected_rowsets); + DCHECK(st.ok()) << st; + DCHECK_EQ(base_rowsets_for_full_clone.size(), expected_rowsets.size()); + if (st.ok() && base_rowsets_for_full_clone.size() != expected_rowsets.size()) + [[unlikely]] { + LOG(WARNING) << "full clone succeeded, but the count(" + << base_rowsets_for_full_clone.size() + << ") of base rowsets used for delete bitmap calculation is not match " + "expect count(" + << expected_rowsets.size() << ") we capture from tablet meta"; + } + } + } + // clear stale rowset for (auto& [v, rs] : _stale_rs_version_map) { _engine.add_unused_rowset(rs); @@ -3201,12 +3262,18 @@ void Tablet::_rowset_ids_difference(const RowsetIdUnorderedSet& cur, } // The caller should hold _rowset_update_lock and _meta_lock lock. -Status Tablet::update_delete_bitmap_without_lock(const RowsetSharedPtr& rowset) { +Status Tablet::update_delete_bitmap_without_lock( + const RowsetSharedPtr& rowset, const std::vector<RowsetSharedPtr>* specified_base_rowsets) { DBUG_EXECUTE_IF("Tablet.update_delete_bitmap_without_lock.random_failed", { - if (rand() % 100 < (100 * dp->param("percent", 0.1))) { - LOG_WARNING("Tablet.update_delete_bitmap_without_lock.random_failed"); + auto rnd = rand() % 100; + auto percent = dp->param("percent", 0.1); + if (rnd < (100 * percent)) { + LOG(WARNING) << "BaseTablet.update_delete_bitmap_without_lock.random_failed"; return Status::InternalError( "debug tablet update delete bitmap without lock random failed"); + } else { + LOG(INFO) << "BaseTablet.update_delete_bitmap_without_lock.random_failed not triggered" + << ", rnd:" << rnd << ", percent: " << percent; } }); int64_t cur_version = rowset->end_version(); @@ -3219,12 +3286,21 @@ Status Tablet::update_delete_bitmap_without_lock(const RowsetSharedPtr& rowset) << tablet_id() << " cur max_version: " << cur_version; return Status::OK(); } - RowsetIdUnorderedSet cur_rowset_ids; - RETURN_IF_ERROR(all_rs_id(cur_version - 1, &cur_rowset_ids)); + + // calculate delete bitmap between segments if necessary. DeleteBitmapPtr delete_bitmap = std::make_shared<DeleteBitmap>(tablet_id()); RETURN_IF_ERROR(calc_delete_bitmap_between_segments(rowset, segments, delete_bitmap)); - std::vector<RowsetSharedPtr> specified_rowsets = get_rowset_by_ids(&cur_rowset_ids); + // get all base rowsets to calculate on + std::vector<RowsetSharedPtr> specified_rowsets; + RowsetIdUnorderedSet cur_rowset_ids; + if (specified_base_rowsets == nullptr) { + RETURN_IF_ERROR(all_rs_id(cur_version - 1, &cur_rowset_ids)); + specified_rowsets = get_rowset_by_ids(&cur_rowset_ids); + } else { + specified_rowsets = *specified_base_rowsets; + } + OlapStopWatch watch; auto token = _engine.calc_delete_bitmap_executor()->create_token(); RETURN_IF_ERROR(calc_delete_bitmap(rowset, segments, specified_rowsets, delete_bitmap, diff --git a/be/src/olap/tablet.h b/be/src/olap/tablet.h index 9195aec91e0..028567bb5a4 100644 --- a/be/src/olap/tablet.h +++ b/be/src/olap/tablet.h @@ -490,7 +490,9 @@ public: const std::map<RowsetId, RowsetSharedPtr>& rsid_to_rowset, vectorized::Block* output_block); - Status update_delete_bitmap_without_lock(const RowsetSharedPtr& rowset); + Status update_delete_bitmap_without_lock( + const RowsetSharedPtr& rowset, + const std::vector<RowsetSharedPtr>* specified_base_rowsets = nullptr); Status commit_phase_update_delete_bitmap( const RowsetSharedPtr& rowset, RowsetIdUnorderedSet& pre_rowset_ids, diff --git a/be/src/olap/task/engine_clone_task.cpp b/be/src/olap/task/engine_clone_task.cpp index 03b07608f8f..70ec93727e9 100644 --- a/be/src/olap/task/engine_clone_task.cpp +++ b/be/src/olap/task/engine_clone_task.cpp @@ -836,7 +836,7 @@ Status EngineCloneTask::_finish_full_clone(Tablet* tablet, } } if (tablet->enable_unique_key_merge_on_write()) { - tablet->tablet_meta()->delete_bitmap() = cloned_tablet_meta->delete_bitmap(); + tablet->tablet_meta()->delete_bitmap().merge(cloned_tablet_meta->delete_bitmap()); } return tablet->revise_tablet_meta(to_add, to_delete, false); // TODO(plat1ko): write cooldown meta to remote if this replica is cooldown replica --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org