You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by li...@apache.org on 2020/02/06 01:57:21 UTC
[incubator-doris] branch master updated: Fix removing tablet bug
from partition_map in TabletManager (#2842)
This is an automated email from the ASF dual-hosted git repository.
lingbin pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-doris.git
The following commit(s) were added to refs/heads/master by this push:
new 14c7720 Fix removing tablet bug from partition_map in TabletManager (#2842)
14c7720 is described below
commit 14c772013b66e4e2b7360eed3a3199f8f6351a73
Author: LingBin <li...@gmail.com>
AuthorDate: Thu Feb 6 09:57:12 2020 +0800
Fix removing tablet bug from partition_map in TabletManager (#2842)
When using an iterator of _tablet_map.tablet_arr(`std::list`) to remove
a tablet, we should first remove tablet from _partition_map to avoid
the iterator becoming invalid.
---
be/src/olap/tablet.cpp | 2 +-
be/src/olap/tablet.h | 2 +-
be/src/olap/tablet_manager.cpp | 22 +++++++++++++---------
be/src/olap/tablet_manager.h | 2 ++
4 files changed, 17 insertions(+), 11 deletions(-)
diff --git a/be/src/olap/tablet.cpp b/be/src/olap/tablet.cpp
index aa1ae61..dafcdfc 100644
--- a/be/src/olap/tablet.cpp
+++ b/be/src/olap/tablet.cpp
@@ -931,7 +931,7 @@ OLAPStatus Tablet::set_partition_id(int64_t partition_id) {
return _tablet_meta->set_partition_id(partition_id);
}
-TabletInfo Tablet::get_tablet_info() {
+TabletInfo Tablet::get_tablet_info() const {
return TabletInfo(tablet_id(), schema_hash(), tablet_uid());
}
diff --git a/be/src/olap/tablet.h b/be/src/olap/tablet.h
index e32075b..9f94637 100644
--- a/be/src/olap/tablet.h
+++ b/be/src/olap/tablet.h
@@ -223,7 +223,7 @@ public:
OLAPStatus set_partition_id(int64_t partition_id);
- TabletInfo get_tablet_info();
+ TabletInfo get_tablet_info() const;
void pick_candicate_rowsets_to_cumulative_compaction(std::vector<RowsetSharedPtr>* candidate_rowsets);
void pick_candicate_rowsets_to_base_compaction(std::vector<RowsetSharedPtr>* candidate_rowsets);
diff --git a/be/src/olap/tablet_manager.cpp b/be/src/olap/tablet_manager.cpp
index 18d9ca0..41caa0a 100644
--- a/be/src/olap/tablet_manager.cpp
+++ b/be/src/olap/tablet_manager.cpp
@@ -569,11 +569,10 @@ OLAPStatus TabletManager::drop_tablets_on_error_root_path(
for (list<TabletSharedPtr>::iterator it = _tablet_map[tablet_id].table_arr.begin();
it != _tablet_map[tablet_id].table_arr.end();) {
if ((*it)->equal(tablet_id, schema_hash)) {
+ // We should first remove tablet from partition_map to avoid iterator
+ // becoming invalid.
+ _remove_tablet_from_partition_unlocked(*(*it));
it = _tablet_map[tablet_id].table_arr.erase(it);
- _partition_tablet_map[(*it)->partition_id()].erase((*it)->get_tablet_info());
- if (_partition_tablet_map[(*it)->partition_id()].empty()) {
- _partition_tablet_map.erase((*it)->partition_id());
- }
} else {
++it;
}
@@ -1110,7 +1109,8 @@ void TabletManager::update_root_path_info(std::map<std::string, DataDirInfo>* pa
}
} // update_root_path_info
-void TabletManager::get_partition_related_tablets(int64_t partition_id, std::set<TabletInfo>* tablet_infos) {
+void TabletManager::get_partition_related_tablets(int64_t partition_id,
+ std::set<TabletInfo>* tablet_infos) {
ReadLock rlock(&_tablet_map_lock);
if (_partition_tablet_map.find(partition_id) != _partition_tablet_map.end()) {
for (auto& tablet_info : _partition_tablet_map[partition_id]) {
@@ -1332,10 +1332,7 @@ OLAPStatus TabletManager::_drop_tablet_directly_unlocked(
it != _tablet_map[tablet_id].table_arr.end();) {
if ((*it)->equal(tablet_id, schema_hash)) {
TabletSharedPtr tablet = *it;
- _partition_tablet_map[(*it)->partition_id()].erase((*it)->get_tablet_info());
- if (_partition_tablet_map[(*it)->partition_id()].empty()) {
- _partition_tablet_map.erase((*it)->partition_id());
- }
+ _remove_tablet_from_partition_unlocked(*(*it));
it = _tablet_map[tablet_id].table_arr.erase(it);
if (!keep_files) {
// drop tablet will update tablet meta, should lock
@@ -1395,4 +1392,11 @@ TabletSharedPtr TabletManager::_get_tablet_unlocked(TTabletId tablet_id, SchemaH
return tablet;
}
+void TabletManager::_remove_tablet_from_partition_unlocked(const Tablet& tablet) {
+ _partition_tablet_map[tablet.partition_id()].erase(tablet.get_tablet_info());
+ if (_partition_tablet_map[tablet.partition_id()].empty()) {
+ _partition_tablet_map.erase(tablet.partition_id());
+ }
+}
+
} // doris
diff --git a/be/src/olap/tablet_manager.h b/be/src/olap/tablet_manager.h
index 38d7e42..ac5c3d7 100644
--- a/be/src/olap/tablet_manager.h
+++ b/be/src/olap/tablet_manager.h
@@ -169,6 +169,8 @@ private:
void _build_tablet_stat();
+ void _remove_tablet_from_partition_unlocked(const Tablet& tablet);
+
private:
// TODO(lingbin): should be TabletInstances?
// should be removed after schema_hash be removed
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org