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 <31928846+lchangli...@users.noreply.github.com>
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: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to