This is an automated email from the ASF dual-hosted git repository.
yiguolei 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 7ffcd73301 [bugfix] Recycle the fds when remove stale rowset or drop
table (#24115)
7ffcd73301 is described below
commit 7ffcd733016195124cd8f184e8561086bdc3dc88
Author: Lightman <[email protected]>
AuthorDate: Sat Sep 9 01:00:56 2023 +0800
[bugfix] Recycle the fds when remove stale rowset or drop table (#24115)
Associated with #23081
---
be/src/olap/olap_server.cpp | 3 +--
be/src/olap/rowset/beta_rowset.cpp | 2 ++
be/src/olap/segment_loader.cpp | 4 ++++
be/src/olap/segment_loader.h | 2 ++
be/src/olap/tablet.h | 6 ++++++
be/src/olap/tablet_manager.cpp | 13 +++++++++++++
6 files changed, 28 insertions(+), 2 deletions(-)
diff --git a/be/src/olap/olap_server.cpp b/be/src/olap/olap_server.cpp
index 848539d513..6ce4dec3a6 100644
--- a/be/src/olap/olap_server.cpp
+++ b/be/src/olap/olap_server.cpp
@@ -170,9 +170,8 @@ void StorageEngine::_fd_cache_clean_callback() {
#ifdef GOOGLE_PROFILER
ProfilerRegisterThread();
#endif
- int32_t interval = 600;
+ int32_t interval = config::cache_clean_interval;
while
(!_stop_background_threads_latch.wait_for(std::chrono::seconds(interval))) {
- interval = config::cache_clean_interval;
if (interval <= 0) {
LOG(WARNING) << "config of file descriptor clean interval is
illegal: [" << interval
<< "], force set to 3600 ";
diff --git a/be/src/olap/rowset/beta_rowset.cpp
b/be/src/olap/rowset/beta_rowset.cpp
index 8f0bda1bc6..1811e9627f 100644
--- a/be/src/olap/rowset/beta_rowset.cpp
+++ b/be/src/olap/rowset/beta_rowset.cpp
@@ -192,6 +192,8 @@ Status BetaRowset::remove() {
if (!fs) {
return Status::Error<INIT_FAILED>();
}
+ // If the rowset was removed, it need to remove the fds in segment cache
directly
+
SegmentLoader::instance()->erase_segments(SegmentLoader::CacheKey(rowset_id()));
bool success = true;
Status st;
for (int i = 0; i < num_segments(); ++i) {
diff --git a/be/src/olap/segment_loader.cpp b/be/src/olap/segment_loader.cpp
index fa1e6c8751..5c7a81ed44 100644
--- a/be/src/olap/segment_loader.cpp
+++ b/be/src/olap/segment_loader.cpp
@@ -104,4 +104,8 @@ Status SegmentLoader::prune() {
return Status::OK();
}
+void SegmentLoader::erase_segments(const SegmentLoader::CacheKey& key) {
+ _cache->erase(key.encode());
+}
+
} // namespace doris
diff --git a/be/src/olap/segment_loader.h b/be/src/olap/segment_loader.h
index 03a54acf55..c0ece39a65 100644
--- a/be/src/olap/segment_loader.h
+++ b/be/src/olap/segment_loader.h
@@ -96,6 +96,8 @@ public:
: ((double)_cache->get_usage() /
_cache->get_total_capacity());
}
+ void erase_segments(const SegmentLoader::CacheKey& key);
+
private:
SegmentLoader();
diff --git a/be/src/olap/tablet.h b/be/src/olap/tablet.h
index e81f1212e7..ce7bb1cc44 100644
--- a/be/src/olap/tablet.h
+++ b/be/src/olap/tablet.h
@@ -385,6 +385,12 @@ public:
int64_t get_table_id() { return _tablet_meta->table_id(); }
+ // 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; }
+
private:
Status _init_once_action();
void _print_missed_versions(const std::vector<Version>& missed_versions)
const;
diff --git a/be/src/olap/tablet_manager.cpp b/be/src/olap/tablet_manager.cpp
index 5f2bd1b5c0..a523ec620d 100644
--- a/be/src/olap/tablet_manager.cpp
+++ b/be/src/olap/tablet_manager.cpp
@@ -42,6 +42,7 @@
#include "olap/reader.h"
#include "olap/rowset/rowset_id_generator.h"
#include "olap/schema_change.h"
+#include "olap/segment_loader.h"
#include "olap/tablet.h"
#include "olap/tablet_meta.h"
#include "olap/tablet_meta_manager.h"
@@ -470,6 +471,18 @@ Status TabletManager::_drop_tablet_unlocked(TTabletId
tablet_id, TReplicaId repl
_remove_tablet_from_partition(to_drop_tablet);
tablet_map_t& tablet_map = _get_tablet_map(tablet_id);
tablet_map.erase(tablet_id);
+ {
+ std::shared_lock rlock(to_drop_tablet->get_header_lock());
+ static auto recycle_segment_cache = [](const auto& rowset_map) {
+ for (auto& [_, rowset] : rowset_map) {
+ // If the tablet was deleted, it need to remove all rowsets
fds directly
+ SegmentLoader::instance()->erase_segments(
+ SegmentLoader::CacheKey(rowset->rowset_id()));
+ }
+ };
+ recycle_segment_cache(to_drop_tablet->rowset_map());
+ recycle_segment_cache(to_drop_tablet->stale_rowset_map());
+ }
if (!keep_files) {
// drop tablet will update tablet meta, should lock
std::lock_guard<std::shared_mutex>
wrlock(to_drop_tablet->get_header_lock());
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]