This is an automated email from the ASF dual-hosted git repository.
yiguolei 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 a3aceab72b [Fix](inverted index) fix inverted index bkd reader memory
leak problem (#16885)
a3aceab72b is described below
commit a3aceab72b8bff33deaf146b537982e47b456d4f
Author: airborne12 <[email protected]>
AuthorDate: Mon Feb 20 15:39:04 2023 +0800
[Fix](inverted index) fix inverted index bkd reader memory leak problem
(#16885)
Original implementation of get_bkd_reader's raw pointer usage may cause
memory leak problem, use shared_ptr to avoid that.
---
.../olap/rowset/segment_v2/inverted_index_reader.cpp | 20 +++++++-------------
.../olap/rowset/segment_v2/inverted_index_reader.h | 4 ++--
2 files changed, 9 insertions(+), 15 deletions(-)
diff --git a/be/src/olap/rowset/segment_v2/inverted_index_reader.cpp
b/be/src/olap/rowset/segment_v2/inverted_index_reader.cpp
index 5ed46c6ec4..849733f4c8 100644
--- a/be/src/olap/rowset/segment_v2/inverted_index_reader.cpp
+++ b/be/src/olap/rowset/segment_v2/inverted_index_reader.cpp
@@ -369,16 +369,14 @@ Status BkdIndexReader::new_iterator(const TabletIndex*
index_meta, OlapReaderSta
Status BkdIndexReader::bkd_query(OlapReaderStatistics* stats, const
std::string& column_name,
const void* query_value,
InvertedIndexQueryType query_type,
-
std::shared_ptr<lucene::util::bkd::bkd_reader>&& r,
+
std::shared_ptr<lucene::util::bkd::bkd_reader>& r,
InvertedIndexVisitor* visitor) {
- lucene::util::bkd::bkd_reader* tmp_reader;
- auto status = get_bkd_reader(tmp_reader);
+ auto status = get_bkd_reader(r);
if (!status.ok()) {
LOG(WARNING) << "get bkd reader for column " << column_name
<< " failed: " << status.code_as_string();
return status;
}
- r.reset(tmp_reader);
char tmp[r->bytes_per_dim_];
switch (query_type) {
case InvertedIndexQueryType::EQUAL_QUERY: {
@@ -415,8 +413,7 @@ Status BkdIndexReader::try_query(OlapReaderStatistics*
stats, const std::string&
auto visitor = std::make_unique<InvertedIndexVisitor>(nullptr, query_type,
true);
std::shared_ptr<lucene::util::bkd::bkd_reader> r;
try {
- RETURN_IF_ERROR(bkd_query(stats, column_name, query_value, query_type,
std::move(r),
- visitor.get()));
+ RETURN_IF_ERROR(bkd_query(stats, column_name, query_value, query_type,
r, visitor.get()));
*count = r->estimate_point_count(visitor.get());
} catch (const CLuceneError& e) {
LOG(WARNING) << "BKD Query CLuceneError Occurred, error msg: " <<
e.what();
@@ -458,8 +455,7 @@ Status BkdIndexReader::query(OlapReaderStatistics* stats,
const std::string& col
std::shared_ptr<lucene::util::bkd::bkd_reader> r;
try {
SCOPED_RAW_TIMER(&stats->inverted_index_searcher_search_timer);
- RETURN_IF_ERROR(bkd_query(stats, column_name, query_value, query_type,
std::move(r),
- visitor.get()));
+ RETURN_IF_ERROR(bkd_query(stats, column_name, query_value, query_type,
r, visitor.get()));
r->intersect(visitor.get());
} catch (const CLuceneError& e) {
LOG(WARNING) << "BKD Query CLuceneError Occurred, error msg: " <<
e.what();
@@ -477,7 +473,7 @@ Status BkdIndexReader::query(OlapReaderStatistics* stats,
const std::string& col
return Status::OK();
}
-Status BkdIndexReader::get_bkd_reader(lucene::util::bkd::bkd_reader*&
bkdReader) {
+Status
BkdIndexReader::get_bkd_reader(std::shared_ptr<lucene::util::bkd::bkd_reader>&
bkdReader) {
// bkd file reader
if (compoundReader == nullptr) {
LOG(WARNING) << "bkd index input file not found";
@@ -501,7 +497,7 @@ Status
BkdIndexReader::get_bkd_reader(lucene::util::bkd::bkd_reader*& bkdReader)
return Status::Error<ErrorCode::INVERTED_INDEX_FILE_NOT_FOUND>();
}
- bkdReader = new lucene::util::bkd::bkd_reader(data_in);
+ bkdReader = std::make_shared<lucene::util::bkd::bkd_reader>(data_in);
if (0 == bkdReader->read_meta(meta_in)) {
return Status::EndOfFile("bkd index file is empty");
}
@@ -510,9 +506,7 @@ Status
BkdIndexReader::get_bkd_reader(lucene::util::bkd::bkd_reader*& bkdReader)
_type_info = get_scalar_type_info((FieldType)bkdReader->type);
if (_type_info == nullptr) {
- auto type = bkdReader->type;
- delete bkdReader;
- LOG(WARNING) << "unsupported typeinfo, type=" << type;
+ LOG(WARNING) << "unsupported typeinfo, type=" << bkdReader->type;
return Status::Error<ErrorCode::INVERTED_INDEX_NOT_SUPPORTED>();
}
_value_key_coder = get_key_coder(_type_info->type());
diff --git a/be/src/olap/rowset/segment_v2/inverted_index_reader.h
b/be/src/olap/rowset/segment_v2/inverted_index_reader.h
index c8bdba41e9..583c092c18 100644
--- a/be/src/olap/rowset/segment_v2/inverted_index_reader.h
+++ b/be/src/olap/rowset/segment_v2/inverted_index_reader.h
@@ -192,11 +192,11 @@ public:
InvertedIndexParserType analyser_type, uint32_t* count)
override;
Status bkd_query(OlapReaderStatistics* stats, const std::string&
column_name,
const void* query_value, InvertedIndexQueryType
query_type,
- std::shared_ptr<lucene::util::bkd::bkd_reader>&& r,
+ std::shared_ptr<lucene::util::bkd::bkd_reader>& r,
InvertedIndexVisitor* visitor);
InvertedIndexReaderType type() override;
- Status get_bkd_reader(lucene::util::bkd::bkd_reader*& reader);
+ Status get_bkd_reader(std::shared_ptr<lucene::util::bkd::bkd_reader>&
reader);
private:
const TypeInfo* _type_info {};
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]