This is an automated email from the ASF dual-hosted git repository.
dataroaring pushed a commit to branch branch-3.0
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/branch-3.0 by this push:
new d7e7c8040e5 [improve](tablet_lock) do not hold tablet lock when
clearing cache (#39040)
d7e7c8040e5 is described below
commit d7e7c8040e5955d2631a1104bfc83901f6ea4ea7
Author: Yongqiang YANG <[email protected]>
AuthorDate: Wed Aug 7 21:28:28 2024 +0800
[improve](tablet_lock) do not hold tablet lock when clearing cache (#39040)
We found that clearing cache sometimes consums a lot time, so do not
hold lock when clearing cache and trace time-consuming cache clearing.
---
be/src/olap/rowset/rowset.cpp | 11 +++++++++--
be/src/olap/tablet.cpp | 22 ++++++++++++++--------
2 files changed, 23 insertions(+), 10 deletions(-)
diff --git a/be/src/olap/rowset/rowset.cpp b/be/src/olap/rowset/rowset.cpp
index 8a4a25c2158..256f4d35313 100644
--- a/be/src/olap/rowset/rowset.cpp
+++ b/be/src/olap/rowset/rowset.cpp
@@ -23,6 +23,7 @@
#include "olap/segment_loader.h"
#include "olap/tablet_schema.h"
#include "util/time.h"
+#include "util/trace.h"
namespace doris {
@@ -118,8 +119,14 @@ std::string Rowset::get_rowset_info_str() {
}
void Rowset::clear_cache() {
- SegmentLoader::instance()->erase_segments(rowset_id(), num_segments());
- clear_inverted_index_cache();
+ {
+ SCOPED_SIMPLE_TRACE_IF_TIMEOUT(std::chrono::seconds(1));
+ SegmentLoader::instance()->erase_segments(rowset_id(), num_segments());
+ }
+ {
+ SCOPED_SIMPLE_TRACE_IF_TIMEOUT(std::chrono::seconds(1));
+ clear_inverted_index_cache();
+ }
}
Result<std::string> Rowset::segment_path(int64_t seg_id) {
diff --git a/be/src/olap/tablet.cpp b/be/src/olap/tablet.cpp
index 5018c70be11..f159dc6f576 100644
--- a/be/src/olap/tablet.cpp
+++ b/be/src/olap/tablet.cpp
@@ -2641,15 +2641,21 @@ Status Tablet::ingest_binlog_metas(RowsetBinlogMetasPB*
metas_pb) {
}
void Tablet::clear_cache() {
- std::shared_lock rlock(get_header_lock());
- SCOPED_SIMPLE_TRACE_IF_TIMEOUT(TRACE_TABLET_LOCK_THRESHOLD);
- static auto recycle_segment_cache = [](const auto& rowset_map) {
- for (auto& [_, rowset] : rowset_map) {
- rowset->clear_cache();
+ std::vector<RowsetSharedPtr> rowsets;
+ {
+ std::shared_lock rlock(get_header_lock());
+ SCOPED_SIMPLE_TRACE_IF_TIMEOUT(TRACE_TABLET_LOCK_THRESHOLD);
+
+ for (auto& [_, rowset] : rowset_map()) {
+ rowsets.push_back(rowset);
}
- };
- recycle_segment_cache(rowset_map());
- recycle_segment_cache(stale_rowset_map());
+ for (auto& [_, rowset] : stale_rowset_map()) {
+ rowsets.push_back(rowset);
+ }
+ }
+ for (auto& rowset : rowsets) {
+ rowset->clear_cache();
+ }
}
} // namespace doris
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]