This is an automated email from the ASF dual-hosted git repository.
zhangchen pushed a commit to branch branch-1.2-lts
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/branch-1.2-lts by this push:
new ade93477a8 [fix](merge-on-write) fix that failed to update delete
bitmap when revise tablet meta for clone (#17857)
ade93477a8 is described below
commit ade93477a87a6f215316a6681d62e383a188cc3e
Author: Xin Liao <[email protected]>
AuthorDate: Sat Mar 18 11:06:22 2023 +0800
[fix](merge-on-write) fix that failed to update delete bitmap when revise
tablet meta for clone (#17857)
---
be/src/olap/tablet.cpp | 44 +++++++++++++++++++----
be/src/olap/tablet.h | 3 +-
be/src/olap/task/engine_clone_task.cpp | 64 ++++++++--------------------------
3 files changed, 53 insertions(+), 58 deletions(-)
diff --git a/be/src/olap/tablet.cpp b/be/src/olap/tablet.cpp
index 3c6dfdfdf3..76110cfc6f 100644
--- a/be/src/olap/tablet.cpp
+++ b/be/src/olap/tablet.cpp
@@ -180,7 +180,8 @@ void Tablet::save_meta() {
}
Status Tablet::revise_tablet_meta(const std::vector<RowsetMetaSharedPtr>&
rowsets_to_clone,
- const std::vector<Version>&
versions_to_delete) {
+ const std::vector<Version>&
versions_to_delete,
+ bool is_incremental_clone) {
LOG(INFO) << "begin to revise tablet. tablet=" << full_name()
<< ", rowsets_to_clone=" << rowsets_to_clone.size()
<< ", versions_to_delete=" << versions_to_delete.size();
@@ -213,17 +214,46 @@ Status Tablet::revise_tablet_meta(const
std::vector<RowsetMetaSharedPtr>& rowset
_rowset_tree = std::move(new_rowset_tree);
std::vector<RowsetSharedPtr> calc_delete_bitmap_rowsets;
int64_t to_add_min_version = INT64_MAX;
+ int64_t to_add_max_version = INT64_MIN;
for (auto& rs : rs_to_add) {
if (to_add_min_version > rs->start_version()) {
to_add_min_version = rs->start_version();
}
+ if (to_add_max_version < rs->end_version()) {
+ to_add_max_version = rs->end_version();
+ }
+ }
+ for (auto& [ver, rs] : _rs_version_map) {
+ if (is_incremental_clone && ver.first >= to_add_min_version) {
+ // From the rowset of to_add with smallest version, all other
rowsets
+ // need to recalculate the delete bitmap
+ // For example:
+ // local tablet: [0-1] [2-5] [6-6] [9-10]
+ // clone tablet: [7-7] [8-8]
+ // new tablet: [0-1] [2-5] [6-6] [7-7] [8-8] [9-10]
+ // [7-7] [8-8] [9-10] need to recalculate delete bitmap
+ calc_delete_bitmap_rowsets.push_back(rs);
+ } else if (!is_incremental_clone && ver.first >
to_add_max_version) {
+ // the delete bitmap of to_add's rowsets has clone from remote
when full clone.
+ // only other rowsets in local need to recalculate the delete
bitmap.
+ // For example:
+ // local tablet: [0-1]x [2-5]x [6-6]x [7-7]x [9-10]
+ // clone tablet: [0-1] [2-4] [5-6] [7-8]
+ // new tablet: [0-1] [2-4] [5-6] [7-8] [9-10]
+ // only [9-10] need to recalculate delete bitmap
+ calc_delete_bitmap_rowsets.push_back(rs);
+ }
}
- Version calc_delete_bitmap_ver;
- calc_delete_bitmap_ver = Version(to_add_min_version,
max_version().second);
- RETURN_IF_ERROR(
- capture_consistent_rowsets(calc_delete_bitmap_ver,
&calc_delete_bitmap_rowsets));
- for (auto rs : calc_delete_bitmap_rowsets) {
- RETURN_IF_ERROR(update_delete_bitmap_without_lock(rs));
+ std::sort(calc_delete_bitmap_rowsets.begin(),
calc_delete_bitmap_rowsets.end(),
+ Rowset::comparator);
+ for (size_t i = 0; i < calc_delete_bitmap_rowsets.size(); i++) {
+ CHECK(i == 0 || calc_delete_bitmap_rowsets[i]->start_version() ==
+ calc_delete_bitmap_rowsets[i -
1]->end_version() + 1)
+ << "calc_delete_bitmap_rowsets[" << i
+ << "] version: " <<
calc_delete_bitmap_rowsets[i]->version()
+ << " calc_delete_bitmap_rowsets[" << i - 1
+ << "] version: " << calc_delete_bitmap_rowsets[i -
1]->version();
+
CHECK(update_delete_bitmap_without_lock(calc_delete_bitmap_rowsets[i]).ok());
}
}
diff --git a/be/src/olap/tablet.h b/be/src/olap/tablet.h
index b56862df59..64ef265b0f 100644
--- a/be/src/olap/tablet.h
+++ b/be/src/olap/tablet.h
@@ -81,7 +81,8 @@ public:
void save_meta();
// Used in clone task, to update local meta when finishing a clone job
Status revise_tablet_meta(const std::vector<RowsetMetaSharedPtr>&
rowsets_to_clone,
- const std::vector<Version>& versions_to_delete);
+ const std::vector<Version>& versions_to_delete,
+ bool is_incremental_clone);
Status pick_quick_compaction_rowsets(std::vector<RowsetSharedPtr>*
input_rowsets,
int64_t* permits);
diff --git a/be/src/olap/task/engine_clone_task.cpp
b/be/src/olap/task/engine_clone_task.cpp
index b77373ec6b..5c8c2f8070 100644
--- a/be/src/olap/task/engine_clone_task.cpp
+++ b/be/src/olap/task/engine_clone_task.cpp
@@ -562,7 +562,7 @@ Status EngineCloneTask::_finish_incremental_clone(Tablet*
tablet,
/// For incremental clone, nothing will be deleted.
/// So versions_to_delete is empty.
std::vector<Version> versions_to_delete;
- return tablet->revise_tablet_meta(rowsets_to_clone, versions_to_delete);
+ return tablet->revise_tablet_meta(rowsets_to_clone, versions_to_delete,
true);
}
/// This method will do:
@@ -582,8 +582,8 @@ Status EngineCloneTask::_finish_full_clone(Tablet* tablet,
TabletMeta* cloned_ta
//
// after compare, the version mark with "x" will be deleted
//
- // local tablet: [0-1] [2-5]x [6-6]x [7-7]x
- // clone tablet: [0-1]x [2-4] [5-6] [7-8]
+ // local tablet: [0-1]x [2-5]x [6-6]x [7-7]x
+ // clone tablet: [0-1] [2-4] [5-6] [7-8]
// All versions deleted from local tablet will be saved in
versions_to_delete
// And these versions file will be deleted finally.
@@ -606,33 +606,12 @@ Status EngineCloneTask::_finish_full_clone(Tablet*
tablet, TabletMeta* cloned_ta
"version cross src latest. cloned_max_version={},
local_version={}",
cloned_max_version.to_string(), local_version.to_string());
} else if (local_version.second <= cloned_max_version.second) {
- // if local version smaller than src, check if existed in src,
will not clone it
- bool existed_in_src = false;
-
- // if delta labeled with local_version is same with the specified
version in clone header,
- // there is no necessity to clone it.
- for (auto& rs_meta : cloned_tablet_meta->all_rs_metas()) {
- if (rs_meta->version().first == local_version.first &&
- rs_meta->version().second == local_version.second) {
- existed_in_src = true;
- break;
- }
- }
-
- if (existed_in_src) {
- cloned_tablet_meta->delete_rs_meta_by_version(local_version,
-
&rs_metas_found_in_src);
- LOG(INFO) << "version exist in local tablet, no need to clone.
delete it from "
- "clone tablet"
- << ". tablet=" << tablet->full_name() << ",
version='" << local_version;
- } else {
- versions_to_delete.push_back(local_version);
- LOG(INFO) << "version not exist in local tablet. it will be
replaced by other "
- "version. "
- << "delete it from local tablet. "
- << "tablet=" << tablet->full_name() << ","
- << ", version=" << local_version;
- }
+ versions_to_delete.push_back(local_version);
+ LOG(INFO) << "version not exist in local tablet. it will be
replaced by other "
+ "version. "
+ << "delete it from local tablet. "
+ << "tablet=" << tablet->full_name() << ","
+ << ", version=" << local_version;
}
}
std::vector<RowsetMetaSharedPtr> rowsets_to_clone;
@@ -642,32 +621,17 @@ Status EngineCloneTask::_finish_full_clone(Tablet*
tablet, TabletMeta* cloned_ta
<< tablet->full_name() << ", version=" << rs_meta->version();
}
+ if (tablet->enable_unique_key_merge_on_write()) {
+ tablet->tablet_meta()->delete_bitmap() =
cloned_tablet_meta->delete_bitmap();
+ }
+
// clone_data to tablet
// only replace rowset info, must not modify other info such as alter task
info. for example
// 1. local tablet finished alter task
// 2. local tablet has error in push
// 3. local tablet cloned rowset from other nodes
// 4. if cleared alter task info, then push will not write to new tablet,
the report info is error
- Status clone_res = tablet->revise_tablet_meta(rowsets_to_clone,
versions_to_delete);
- // in previous step, copy all files from CLONE_DIR to tablet dir
- // but some rowset is useless, so that remove them here
- for (auto& rs_meta_ptr : rs_metas_found_in_src) {
- RowsetSharedPtr rowset_to_remove;
- auto s =
-
RowsetFactory::create_rowset(cloned_tablet_meta->tablet_schema(),
- tablet->tablet_path(),
rs_meta_ptr, &rowset_to_remove);
- if (!s.ok()) {
- LOG(WARNING) << "failed to init rowset to remove: "
- << rs_meta_ptr->rowset_id().to_string();
- continue;
- }
- s = rowset_to_remove->remove();
- if (!s.ok()) {
- LOG(WARNING) << "failed to remove rowset " <<
rs_meta_ptr->rowset_id().to_string()
- << ": " << s;
- }
- }
- return clone_res;
+ return tablet->revise_tablet_meta(rowsets_to_clone, versions_to_delete,
false);
}
} // namespace doris
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]