This is an automated email from the ASF dual-hosted git repository.
dataroaring pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/master by this push:
new 26a46d8c3f [fix](cooldown) Handle full clone with cooldowned rowsets
(#17069)
26a46d8c3f is described below
commit 26a46d8c3fef64017a2506b15dea85482fbaa8fb
Author: plat1ko <[email protected]>
AuthorDate: Tue Feb 28 11:04:01 2023 +0800
[fix](cooldown) Handle full clone with cooldowned rowsets (#17069)
---
be/src/olap/base_tablet.h | 2 +-
be/src/olap/rowset/beta_rowset.cpp | 6 +-
be/src/olap/rowset/beta_rowset.h | 4 +-
be/src/olap/rowset/rowset_factory.cpp | 5 +-
be/src/olap/rowset/rowset_factory.h | 4 +-
be/src/olap/snapshot_manager.cpp | 6 --
be/src/olap/storage_engine.cpp | 4 +-
be/src/olap/tablet.cpp | 81 +++++---------------
be/src/olap/tablet.h | 14 ++--
be/src/olap/tablet_manager.cpp | 6 --
be/src/olap/tablet_manager.h | 2 -
be/src/olap/tablet_meta.cpp | 1 +
be/src/olap/tablet_meta.h | 5 --
be/src/olap/task/engine_clone_task.cpp | 130 +++++++--------------------------
14 files changed, 66 insertions(+), 204 deletions(-)
diff --git a/be/src/olap/base_tablet.h b/be/src/olap/base_tablet.h
index 8f8c624307..05707e81a6 100644
--- a/be/src/olap/base_tablet.h
+++ b/be/src/olap/base_tablet.h
@@ -73,7 +73,7 @@ protected:
protected:
TabletState _state;
- TabletMetaSharedPtr _tablet_meta;
+ const TabletMetaSharedPtr _tablet_meta;
TabletSchemaSPtr _schema;
DataDir* _data_dir;
diff --git a/be/src/olap/rowset/beta_rowset.cpp
b/be/src/olap/rowset/beta_rowset.cpp
index 5f881dbd20..26d4b0b7ce 100644
--- a/be/src/olap/rowset/beta_rowset.cpp
+++ b/be/src/olap/rowset/beta_rowset.cpp
@@ -98,9 +98,9 @@ std::string BetaRowset::local_segment_path_segcompacted(const
std::string& table
return fmt::format("{}/{}_{}-{}.dat", tablet_path, rowset_id.to_string(),
begin, end);
}
-BetaRowset::BetaRowset(TabletSchemaSPtr schema, const std::string& tablet_path,
- RowsetMetaSharedPtr rowset_meta)
- : Rowset(schema, tablet_path, std::move(rowset_meta)) {
+BetaRowset::BetaRowset(const TabletSchemaSPtr& schema, const std::string&
tablet_path,
+ const RowsetMetaSharedPtr& rowset_meta)
+ : Rowset(schema, tablet_path, rowset_meta) {
if (_rowset_meta->is_local()) {
_rowset_dir = tablet_path;
} else {
diff --git a/be/src/olap/rowset/beta_rowset.h b/be/src/olap/rowset/beta_rowset.h
index af3bbd08c9..c2a86f13c8 100644
--- a/be/src/olap/rowset/beta_rowset.h
+++ b/be/src/olap/rowset/beta_rowset.h
@@ -91,8 +91,8 @@ public:
Status get_segments_size(std::vector<size_t>* segments_size);
protected:
- BetaRowset(TabletSchemaSPtr schema, const std::string& tablet_path,
- RowsetMetaSharedPtr rowset_meta);
+ BetaRowset(const TabletSchemaSPtr& schema, const std::string& tablet_path,
+ const RowsetMetaSharedPtr& rowset_meta);
// init segment groups
Status init() override;
diff --git a/be/src/olap/rowset/rowset_factory.cpp
b/be/src/olap/rowset/rowset_factory.cpp
index 7657e5c4ac..78f6b2326c 100644
--- a/be/src/olap/rowset/rowset_factory.cpp
+++ b/be/src/olap/rowset/rowset_factory.cpp
@@ -28,8 +28,9 @@
namespace doris {
using namespace ErrorCode;
-Status RowsetFactory::create_rowset(TabletSchemaSPtr schema, const
std::string& tablet_path,
- RowsetMetaSharedPtr rowset_meta,
RowsetSharedPtr* rowset) {
+Status RowsetFactory::create_rowset(const TabletSchemaSPtr& schema, const
std::string& tablet_path,
+ const RowsetMetaSharedPtr& rowset_meta,
+ RowsetSharedPtr* rowset) {
if (rowset_meta->rowset_type() == ALPHA_ROWSET) {
return Status::Error<ROWSET_INVALID>();
}
diff --git a/be/src/olap/rowset/rowset_factory.h
b/be/src/olap/rowset/rowset_factory.h
index ea7106935b..6f6b262456 100644
--- a/be/src/olap/rowset/rowset_factory.h
+++ b/be/src/olap/rowset/rowset_factory.h
@@ -31,8 +31,8 @@ class RowsetFactory {
public:
// return OK and set inited rowset in `*rowset`.
// return others if failed to create or init rowset.
- static Status create_rowset(TabletSchemaSPtr schema, const std::string&
tablet_path,
- RowsetMetaSharedPtr rowset_meta,
RowsetSharedPtr* rowset);
+ static Status create_rowset(const TabletSchemaSPtr& schema, const
std::string& tablet_path,
+ const RowsetMetaSharedPtr& rowset_meta,
RowsetSharedPtr* rowset);
// create and init rowset writer.
// return OK and set `*output` to inited rowset writer.
diff --git a/be/src/olap/snapshot_manager.cpp b/be/src/olap/snapshot_manager.cpp
index 2c348ccc14..6e29a37dd7 100644
--- a/be/src/olap/snapshot_manager.cpp
+++ b/be/src/olap/snapshot_manager.cpp
@@ -175,9 +175,6 @@ Status SnapshotManager::convert_rowset_ids(const
std::string& clone_dir, int64_t
// remote rowset
*rowset_meta = visible_rowset;
}
- // FIXME(cyx): Redundant?
- rowset_meta->set_tablet_id(tablet_id);
- rowset_meta->set_tablet_schema_hash(schema_hash);
Version rowset_version = {visible_rowset.start_version(),
visible_rowset.end_version()};
rs_version_map[rowset_version] = rowset_meta;
}
@@ -206,9 +203,6 @@ Status SnapshotManager::convert_rowset_ids(const
std::string& clone_dir, int64_t
// remote rowset
*rowset_meta = stale_rowset;
}
- // FIXME(cyx): Redundant?
- rowset_meta->set_tablet_id(tablet_id);
- rowset_meta->set_tablet_schema_hash(schema_hash);
}
if (!rowset_id_mapping.empty() &&
cloned_tablet_meta_pb.has_delete_bitmap()) {
diff --git a/be/src/olap/storage_engine.cpp b/be/src/olap/storage_engine.cpp
index 089242dbd1..abfc5401e6 100644
--- a/be/src/olap/storage_engine.cpp
+++ b/be/src/olap/storage_engine.cpp
@@ -854,6 +854,7 @@ void StorageEngine::start_delete_unused_rowset() {
if (it->second->is_local()) {
unused_rowsets_copy[it->first] = it->second;
}
+ // remote rowset data will be reclaimed by
`remove_unused_remote_files`
it = _unused_rowsets.erase(it);
} else {
++it;
@@ -861,9 +862,6 @@ void StorageEngine::start_delete_unused_rowset() {
}
}
for (auto it = unused_rowsets_copy.begin(); it !=
unused_rowsets_copy.end(); ++it) {
- // FIXME(cyx): Currently remote unused rowsets are generated by
compaction gc,
- // we cannot remove them directly as other BE may need them.
-
VLOG_NOTICE << "start to remove rowset:" << it->second->rowset_id()
<< ", version:" << it->second->version().first << "-"
<< it->second->version().second;
diff --git a/be/src/olap/tablet.cpp b/be/src/olap/tablet.cpp
index e50b188e5a..62d8ceae60 100644
--- a/be/src/olap/tablet.cpp
+++ b/be/src/olap/tablet.cpp
@@ -194,81 +194,32 @@ void Tablet::save_meta() {
<< ", root=" << _data_dir->path();
}
-Status Tablet::revise_tablet_meta(const std::vector<RowsetMetaSharedPtr>&
rowsets_to_clone,
- const std::vector<Version>&
versions_to_delete) {
- LOG(INFO) << "begin to revise tablet. tablet=" << full_name()
- << ", rowsets_to_clone=" << rowsets_to_clone.size()
- << ", versions_to_delete=" << versions_to_delete.size();
- Status res = Status::OK();
- RowsetVector rs_to_delete, rs_to_add;
-
- for (auto& version : versions_to_delete) {
- auto it = _rs_version_map.find(version);
- DCHECK(it != _rs_version_map.end());
- StorageEngine::instance()->add_unused_rowset(it->second);
- rs_to_delete.push_back(it->second);
- _rs_version_map.erase(it);
- }
-
- for (auto& rs_meta : rowsets_to_clone) {
- Version version = {rs_meta->start_version(), rs_meta->end_version()};
- RowsetSharedPtr rowset;
- res = RowsetFactory::create_rowset(_schema, _tablet_path, rs_meta,
&rowset);
- if (!res.ok()) {
- LOG(WARNING) << "fail to init rowset. version=" << version;
- return res;
- }
- rs_to_add.push_back(rowset);
- _rs_version_map[version] = std::move(rowset);
- }
-
+Status Tablet::revise_tablet_meta(const std::vector<RowsetSharedPtr>& to_add,
+ const std::vector<RowsetSharedPtr>&
to_delete) {
+ LOG(INFO) << "begin to revise tablet. tablet_id=" << tablet_id();
+ delete_rowsets(to_delete, false);
+ add_rowsets(to_add);
+ // FIXME: How to reclaim delete bitmap of deleted rowsets and stale
rowsets?
if (keys_type() == UNIQUE_KEYS && enable_unique_key_merge_on_write()) {
auto new_rowset_tree = std::make_unique<RowsetTree>();
- ModifyRowSetTree(*_rowset_tree, rs_to_delete, rs_to_add,
new_rowset_tree.get());
+ ModifyRowSetTree(*_rowset_tree, to_delete, to_add,
new_rowset_tree.get());
_rowset_tree = std::move(new_rowset_tree);
- for (auto rowset_ptr : rs_to_add) {
- RETURN_IF_ERROR(update_delete_bitmap_without_lock(rowset_ptr));
+ for (auto& rs : to_add) {
+ RETURN_IF_ERROR(update_delete_bitmap_without_lock(rs));
}
}
-
- do {
- // load new local tablet_meta to operate on
- TabletMetaSharedPtr new_tablet_meta(new (nothrow)
TabletMeta(*_tablet_meta));
-
- // delete versions from new local tablet_meta
- for (const Version& version : versions_to_delete) {
- new_tablet_meta->delete_rs_meta_by_version(version, nullptr);
- LOG(INFO) << "delete version from new local tablet_meta when
clone. [table="
- << full_name() << ", version=" << version << "]";
- }
-
- // add new cloned rowset
- for (auto& rs_meta : rowsets_to_clone) {
- new_tablet_meta->add_rs_meta(rs_meta);
- }
- VLOG_NOTICE << "load rowsets successfully when clone. tablet=" <<
full_name()
- << ", added rowset size=" << rowsets_to_clone.size();
- // save and reload tablet_meta
- res = new_tablet_meta->save_meta(_data_dir);
- if (!res.ok()) {
- LOG(WARNING) << "failed to save new local tablet_meta when clone.
res:" << res;
- break;
- }
- _tablet_meta = new_tablet_meta;
- } while (0);
-
// reconstruct from tablet meta
_timestamped_version_tracker.construct_versioned_tracker(_tablet_meta->all_rs_metas());
// clear stale rowset
- for (auto& it : _stale_rs_version_map) {
- StorageEngine::instance()->add_unused_rowset(it.second);
+ for (auto& [v, rs] : _stale_rs_version_map) {
+ StorageEngine::instance()->add_unused_rowset(rs);
}
_stale_rs_version_map.clear();
_tablet_meta->clear_stale_rowset();
+ save_meta();
- LOG(INFO) << "finish to revise tablet. res=" << res << ", "
- << "table=" << full_name();
- return res;
+ LOG(INFO) << "finish to revise tablet. tablet_id=" << tablet_id();
+ return Status::OK();
}
RowsetSharedPtr Tablet::get_rowset(const RowsetId& rowset_id) {
@@ -421,6 +372,7 @@ Status Tablet::modify_rowsets(std::vector<RowsetSharedPtr>&
to_add,
}
void Tablet::add_rowsets(const std::vector<RowsetSharedPtr>& to_add) {
+ if (to_add.empty()) return;
std::vector<RowsetMetaSharedPtr> rs_metas;
rs_metas.reserve(to_add.size());
for (auto& rs : to_add) {
@@ -432,6 +384,7 @@ void Tablet::add_rowsets(const
std::vector<RowsetSharedPtr>& to_add) {
}
void Tablet::delete_rowsets(const std::vector<RowsetSharedPtr>& to_delete,
bool move_to_stale) {
+ if (to_delete.empty()) return;
std::vector<RowsetMetaSharedPtr> rs_metas;
rs_metas.reserve(to_delete.size());
for (auto& rs : to_delete) {
@@ -1688,7 +1641,7 @@ void
Tablet::_init_context_common_fields(RowsetWriterContext& context) {
context.enable_unique_key_merge_on_write =
enable_unique_key_merge_on_write();
}
-Status Tablet::create_rowset(RowsetMetaSharedPtr rowset_meta, RowsetSharedPtr*
rowset) {
+Status Tablet::create_rowset(const RowsetMetaSharedPtr& rowset_meta,
RowsetSharedPtr* rowset) {
return RowsetFactory::create_rowset(tablet_schema(), tablet_path(),
rowset_meta, rowset);
}
diff --git a/be/src/olap/tablet.h b/be/src/olap/tablet.h
index e59e5cae30..a4114d2ca5 100644
--- a/be/src/olap/tablet.h
+++ b/be/src/olap/tablet.h
@@ -81,8 +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);
+ Status revise_tablet_meta(const std::vector<RowsetSharedPtr>& to_add,
+ const std::vector<RowsetSharedPtr>& to_delete);
int64_t cumulative_layer_point() const;
void set_cumulative_layer_point(int64_t new_point);
@@ -293,13 +293,18 @@ public:
Status create_vertical_rowset_writer(RowsetWriterContext& context,
std::unique_ptr<RowsetWriter>*
rowset_writer);
- Status create_rowset(RowsetMetaSharedPtr rowset_meta, RowsetSharedPtr*
rowset);
+ Status create_rowset(const RowsetMetaSharedPtr& rowset_meta,
RowsetSharedPtr* rowset);
// MUST hold EXCLUSIVE `_meta_lock`
void add_rowsets(const std::vector<RowsetSharedPtr>& to_add);
// MUST hold EXCLUSIVE `_meta_lock`
void delete_rowsets(const std::vector<RowsetSharedPtr>& to_delete, bool
move_to_stale);
+ // MUST hold SHARED `_meta_lock`
+ const auto& rowset_map() const { return _rs_version_map; }
+ // MUST hold SHARED `_meta_lock`
+ const auto& stale_rowset_map() const { return _stale_rs_version_map; }
+
////////////////////////////////////////////////////////////////////////////
// begin cooldown functions
////////////////////////////////////////////////////////////////////////////
@@ -397,9 +402,6 @@ public:
for (auto& [v, rs] : _rs_version_map) {
visitor(rs);
}
- for (auto& [v, rs] : _stale_rs_version_map) {
- visitor(rs);
- }
}
inline void increase_io_error_times() { ++_io_error_times; }
diff --git a/be/src/olap/tablet_manager.cpp b/be/src/olap/tablet_manager.cpp
index 129f1046cc..9758356f59 100644
--- a/be/src/olap/tablet_manager.cpp
+++ b/be/src/olap/tablet_manager.cpp
@@ -91,12 +91,6 @@ TabletManager::~TabletManager() {
DEREGISTER_HOOK_METRIC(tablet_meta_mem_consumption);
}
-void TabletManager::add_tablet(const TabletSharedPtr& tablet) {
- auto& tablet_map = _get_tablet_map(tablet->tablet_id());
- std::lock_guard wlock(_get_tablets_shard_lock(tablet->tablet_id()));
- tablet_map[tablet->tablet_id()] = tablet;
-}
-
Status TabletManager::_add_tablet_unlocked(TTabletId tablet_id, const
TabletSharedPtr& tablet,
bool update_meta, bool force) {
Status res = Status::OK();
diff --git a/be/src/olap/tablet_manager.h b/be/src/olap/tablet_manager.h
index 0cda4b6edf..1b7e9cf89b 100644
--- a/be/src/olap/tablet_manager.h
+++ b/be/src/olap/tablet_manager.h
@@ -61,8 +61,6 @@ public:
// task to be fail, even if there is enough space on other disks
Status create_tablet(const TCreateTabletReq& request,
std::vector<DataDir*> stores);
- void add_tablet(const TabletSharedPtr& tablet);
-
// Drop a tablet by description.
// If `is_drop_table_or_partition` is true, we need to remove all remote
rowsets in this tablet.
Status drop_tablet(TTabletId tablet_id, TReplicaId replica_id, bool
is_drop_table_or_partition);
diff --git a/be/src/olap/tablet_meta.cpp b/be/src/olap/tablet_meta.cpp
index d2116b40bd..becf2c5c03 100644
--- a/be/src/olap/tablet_meta.cpp
+++ b/be/src/olap/tablet_meta.cpp
@@ -261,6 +261,7 @@ TabletMeta::TabletMeta(const TabletMeta& b)
_in_restore_mode(b._in_restore_mode),
_preferred_rowset_type(b._preferred_rowset_type),
_storage_policy_id(b._storage_policy_id),
+ _cooldown_meta_id(b._cooldown_meta_id),
_enable_unique_key_merge_on_write(b._enable_unique_key_merge_on_write),
_delete_bitmap(b._delete_bitmap) {};
diff --git a/be/src/olap/tablet_meta.h b/be/src/olap/tablet_meta.h
index c0a00d6fa5..0c9ed40136 100644
--- a/be/src/olap/tablet_meta.h
+++ b/be/src/olap/tablet_meta.h
@@ -121,7 +121,6 @@ public:
int64_t partition_id() const;
int64_t tablet_id() const;
int64_t replica_id() const;
- void set_replica_id(int64_t replica_id);
int32_t schema_hash() const;
int16_t shard_id() const;
void set_shard_id(int32_t shard_id);
@@ -440,10 +439,6 @@ inline int64_t TabletMeta::replica_id() const {
return _replica_id;
}
-inline void TabletMeta::set_replica_id(int64_t replica_id) {
- _replica_id = replica_id;
-}
-
inline int32_t TabletMeta::schema_hash() const {
return _schema_hash;
}
diff --git a/be/src/olap/task/engine_clone_task.cpp
b/be/src/olap/task/engine_clone_task.cpp
index 464a1433ef..76b5690559 100644
--- a/be/src/olap/task/engine_clone_task.cpp
+++ b/be/src/olap/task/engine_clone_task.cpp
@@ -308,6 +308,7 @@ Status EngineCloneTask::_make_snapshot(const std::string&
ip, int port, TTableId
request.__set_tablet_id(tablet_id);
request.__set_schema_hash(schema_hash);
request.__set_preferred_snapshot_version(g_Types_constants.TPREFER_SNAPSHOT_REQ_VERSION);
+ request.__set_version(_clone_req.committed_version);
// TODO: missing version composed of singleton delta.
// if not, this place should be rewrote.
request.__isset.missing_version = (!missed_versions.empty());
@@ -563,39 +564,22 @@ Status EngineCloneTask::_finish_incremental_clone(Tablet*
tablet,
<< ", missed_versions_size=" << missed_versions.size();
// check missing versions exist in clone src
- std::vector<RowsetMetaSharedPtr> rowsets_to_clone;
+ std::vector<RowsetSharedPtr> rowsets_to_clone;
for (Version version : missed_versions) {
- RowsetMetaSharedPtr rs_meta =
cloned_tablet_meta->acquire_rs_meta_by_version(version);
+ auto rs_meta = cloned_tablet_meta->acquire_rs_meta_by_version(version);
if (rs_meta == nullptr) {
return Status::InternalError("missed version {} is not found in
cloned tablet meta",
version.to_string());
}
- rowsets_to_clone.push_back(rs_meta);
+ RowsetSharedPtr rs;
+ RETURN_IF_ERROR(tablet->create_rowset(rs_meta, &rs));
+ rowsets_to_clone.push_back(std::move(rs));
}
/// clone_data to 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);
-}
-
-// replace `origin_tablet` with Tablet created by `cloned_tablet_meta`.
-static Status full_clone(Tablet* origin_tablet, const TabletMetaSharedPtr&
cloned_tablet_meta) {
- // keep origin `replica_id` and `tablet_uid`
- cloned_tablet_meta->set_replica_id(origin_tablet->replica_id());
- cloned_tablet_meta->set_tablet_uid(origin_tablet->tablet_uid());
- auto tablet = Tablet::create_tablet_from_meta(cloned_tablet_meta,
origin_tablet->data_dir());
- RETURN_IF_ERROR(tablet->init());
- tablet->save_meta();
- StorageEngine::instance()->tablet_manager()->add_tablet(tablet);
- // reclaim local rowsets in origin tablet
- tablet->traverse_rowsets([](auto& rs) {
- if (rs->is_local()) {
- StorageEngine::instance()->add_unused_rowset(rs);
- }
- });
- return Status::OK();
+ return tablet->revise_tablet_meta(rowsets_to_clone, {});
}
/// This method will do:
@@ -611,103 +595,45 @@ Status EngineCloneTask::_finish_full_clone(Tablet*
tablet,
// For example:
// clone version is 8
//
- // local tablet: [0-1] [2-5] [6-6] [7-7]
+ // local tablet: [0-1] [2-5] [6-6] [7-7] [9-10]
// clone tablet: [0-1] [2-4] [5-6] [7-8]
//
// 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]
-
- // All versions deleted from local tablet will be saved in
versions_to_delete
- // And these versions file will be deleted finally.
- std::vector<Version> versions_to_delete;
- std::vector<RowsetMetaSharedPtr> rs_metas_found_in_src;
- for (auto& rs_meta : tablet->tablet_meta()->all_rs_metas()) {
- Version local_version(rs_meta->start_version(),
rs_meta->end_version());
- LOG(INFO) << "check local delta when full clone."
- << "tablet=" << tablet->full_name() << ", local_version=" <<
local_version;
+ // 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]
+ std::vector<RowsetSharedPtr> to_delete;
+ std::vector<RowsetSharedPtr> to_add;
+ for (auto& [v, rs] : tablet->rowset_map()) {
// if local version cross src latest, clone failed
// if local version is : 0-0, 1-1, 2-10, 12-14, 15-15,16-16
// cloned max version is 13-13, this clone is failed, because could not
// fill local data by using cloned data.
// It should not happen because if there is a hole, the following
delta will not
// do compaction.
- if (local_version.first <= cloned_max_version.second &&
- local_version.second > cloned_max_version.second) {
+ if (v.first <= cloned_max_version.second && v.second >
cloned_max_version.second) {
return Status::InternalError(
"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;
- }
+ cloned_max_version.second, v.to_string());
}
- }
- std::vector<RowsetMetaSharedPtr> rowsets_to_clone;
- for (auto& rs_meta : cloned_tablet_meta->all_rs_metas()) {
- if (!rs_meta->is_local()) {
- // MUST clone all cooldowned rowset if there is any cooldowned
rowset to clone to ensure
- // `cooldown_meta_id` is consistent with the cooldowned rowsets
after clone.
- LOG(INFO) << "clone cooldowned rowsets, tablet_id=" <<
tablet->tablet_id();
- RETURN_IF_ERROR(full_clone(tablet, cloned_tablet_meta));
+ if (v.second <= cloned_max_version.second) {
+ to_delete.push_back(rs);
+ } else {
+ // cooldowned rowsets MUST be continuous, so rowsets whose version
> missed version MUST be local rowset
+ DCHECK(rs->is_local());
}
- rowsets_to_clone.push_back(rs_meta);
- LOG(INFO) << "version to be cloned from clone tablet to local tablet: "
- << tablet->full_name() << ", version=" << rs_meta->version();
}
- // 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;
- }
+ to_add.reserve(cloned_tablet_meta->all_rs_metas().size());
+ for (auto& rs_meta : cloned_tablet_meta->all_rs_metas()) {
+ RowsetSharedPtr rs;
+ RETURN_IF_ERROR(tablet->create_rowset(rs_meta, &rs));
+ to_add.push_back(std::move(rs));
}
- return clone_res;
+
tablet->tablet_meta()->set_cooldown_meta_id(cloned_tablet_meta->cooldown_meta_id());
+ return tablet->revise_tablet_meta(to_add, to_delete);
+ // TODO(plat1ko): write cooldown meta to remote if this replica is
cooldown replica
}
} // namespace doris
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]