This is an automated email from the ASF dual-hosted git repository. zhangchen pushed a commit to branch branch-2.0 in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/branch-2.0 by this push: new 10ab006c7c [fix](inverted index change) better fix for update delete bitmap incompletely when build inverted index on mow table(#23141) 10ab006c7c is described below commit 10ab006c7ceba9ca3421d75d22b8d7b52693bb0d Author: YueW <45946325+tany...@users.noreply.github.com> AuthorDate: Fri Aug 18 18:09:25 2023 +0800 [fix](inverted index change) better fix for update delete bitmap incompletely when build inverted index on mow table(#23141) better fix for update delete bitmap incompletely when build inverted index on mow table master pr: #23047 --- be/src/olap/task/index_builder.cpp | 41 ++++++++++++++++++-------------------- 1 file changed, 19 insertions(+), 22 deletions(-) diff --git a/be/src/olap/task/index_builder.cpp b/be/src/olap/task/index_builder.cpp index d642253d99..0f9c51a4ba 100644 --- a/be/src/olap/task/index_builder.cpp +++ b/be/src/olap/task/index_builder.cpp @@ -449,30 +449,27 @@ Status IndexBuilder::modify_rowsets(const Merger::Statistics* stats) { if (_tablet->keys_type() == KeysType::UNIQUE_KEYS && _tablet->enable_unique_key_merge_on_write()) { - std::lock_guard<std::mutex> rwlock(_tablet->get_rowset_update_lock()); - std::shared_lock<std::shared_mutex> wrlock(_tablet->get_header_lock()); - RETURN_IF_ERROR(_tablet->modify_rowsets(_output_rowsets, _input_rowsets, true)); - - std::vector<RowsetSharedPtr> calc_delete_bitmap_rowsets; - int64_t to_add_min_version = INT64_MAX; - for (auto& rs : _output_rowsets) { - if (to_add_min_version > rs->start_version()) { - to_add_min_version = rs->start_version(); - } - } - Version calc_delete_bitmap_ver = - Version(to_add_min_version, _tablet->max_version_unlocked().second); - if (calc_delete_bitmap_ver.first <= calc_delete_bitmap_ver.second) { - Status res = _tablet->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; - - for (auto rs : calc_delete_bitmap_rowsets) { - res = _tablet->update_delete_bitmap_without_lock(rs); - CHECK(res.ok()) << "fail to update_delete_bitmap_without_lock, res: " << res; + std::lock_guard<std::mutex> wlock(_tablet->get_rowset_update_lock()); + std::shared_lock<std::shared_mutex> rlock(_tablet->get_header_lock()); + DeleteBitmapPtr delete_bitmap = std::make_shared<DeleteBitmap>(_tablet->tablet_id()); + for (auto i = 0; i < _input_rowsets.size(); ++i) { + RowsetId input_rowset_id = _input_rowsets[i]->rowset_id(); + RowsetId output_rowset_id = _output_rowsets[i]->rowset_id(); + for (const auto& [k, v] : _tablet->tablet_meta()->delete_bitmap().delete_bitmap) { + RowsetId rs_id = std::get<0>(k); + if (rs_id == input_rowset_id) { + DeleteBitmap::BitmapKey output_rs_key = {output_rowset_id, std::get<1>(k), + std::get<2>(k)}; + auto res = delete_bitmap->set(output_rs_key, v); + DCHECK(res > 0) << "delete_bitmap set failed, res=" << res; + } } } + _tablet->tablet_meta()->delete_bitmap().merge(*delete_bitmap); + + // modify_rowsets will remove the delete_bimap for input rowsets, + // should call it after merge delete_bitmap + RETURN_IF_ERROR(_tablet->modify_rowsets(_output_rowsets, _input_rowsets, true)); } else { std::lock_guard<std::shared_mutex> wrlock(_tablet->get_header_lock()); RETURN_IF_ERROR(_tablet->modify_rowsets(_output_rowsets, _input_rowsets, true)); --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org