From 3de34d383108bf03589194658963af11848a7291 Mon Sep 17 00:00:00 2001 From: Zhiru Zhu Date: Mon, 16 Mar 2020 19:33:28 +0800 Subject: [PATCH] #1619 (#1620) * update Signed-off-by: Zhiru Zhu * update Signed-off-by: Zhiru Zhu * update Signed-off-by: Zhiru Zhu --- CHANGELOG.md | 2 +- core/src/codecs/DeletedDocsFormat.h | 3 ++ .../default/DefaultDeletedDocsFormat.cpp | 30 +++++++++++++++++++ .../codecs/default/DefaultDeletedDocsFormat.h | 3 ++ core/src/db/DBImpl.cpp | 10 +++---- core/src/segment/SegmentReader.cpp | 13 ++++++++ core/src/segment/SegmentReader.h | 3 ++ 7 files changed, 57 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 61e425d2b8..1272ed2847 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,10 +20,10 @@ Please mark all change in change log and use the issue from GitHub - \#1547 Rename storage/file to storage/disk and rename classes - \#1548 Move store/Directory to storage/Operation and add FSHandler - \#1649 Fix Milvus crash on old CPU +- \#1619 Improve compact performance ## Task - # Milvus 0.7.0 (2020-03-11) ## Bug diff --git a/core/src/codecs/DeletedDocsFormat.h b/core/src/codecs/DeletedDocsFormat.h index 431a9a437a..0c519420cb 100644 --- a/core/src/codecs/DeletedDocsFormat.h +++ b/core/src/codecs/DeletedDocsFormat.h @@ -32,6 +32,9 @@ class DeletedDocsFormat { virtual void write(const storage::FSHandlerPtr& fs_ptr, const segment::DeletedDocsPtr& deleted_docs) = 0; + + virtual void + readSize(const storage::FSHandlerPtr& fs_ptr, size_t& size) = 0; }; using DeletedDocsFormatPtr = std::shared_ptr; diff --git a/core/src/codecs/default/DefaultDeletedDocsFormat.cpp b/core/src/codecs/default/DefaultDeletedDocsFormat.cpp index 128b682543..c499e40fe0 100644 --- a/core/src/codecs/default/DefaultDeletedDocsFormat.cpp +++ b/core/src/codecs/default/DefaultDeletedDocsFormat.cpp @@ -146,5 +146,35 @@ DefaultDeletedDocsFormat::write(const storage::FSHandlerPtr& fs_ptr, const segme boost::filesystem::rename(temp_path, del_file_path); } +void +DefaultDeletedDocsFormat::readSize(const storage::FSHandlerPtr& fs_ptr, size_t& size) { + const std::lock_guard lock(mutex_); + + std::string dir_path = fs_ptr->operation_ptr_->GetDirectory(); + const std::string del_file_path = dir_path + "/" + deleted_docs_filename_; + + int del_fd = open(del_file_path.c_str(), O_RDONLY, 00664); + if (del_fd == -1) { + std::string err_msg = "Failed to open file: " + del_file_path + ", error: " + std::strerror(errno); + ENGINE_LOG_ERROR << err_msg; + throw Exception(SERVER_CANNOT_CREATE_FILE, err_msg); + } + + size_t num_bytes; + if (::read(del_fd, &num_bytes, sizeof(size_t)) == -1) { + std::string err_msg = "Failed to read from file: " + del_file_path + ", error: " + std::strerror(errno); + ENGINE_LOG_ERROR << err_msg; + throw Exception(SERVER_WRITE_ERROR, err_msg); + } + + size = num_bytes / sizeof(segment::offset_t); + + if (::close(del_fd) == -1) { + std::string err_msg = "Failed to close file: " + del_file_path + ", error: " + std::strerror(errno); + ENGINE_LOG_ERROR << err_msg; + throw Exception(SERVER_WRITE_ERROR, err_msg); + } +} + } // namespace codec } // namespace milvus diff --git a/core/src/codecs/default/DefaultDeletedDocsFormat.h b/core/src/codecs/default/DefaultDeletedDocsFormat.h index d755245a84..06aff4c563 100644 --- a/core/src/codecs/default/DefaultDeletedDocsFormat.h +++ b/core/src/codecs/default/DefaultDeletedDocsFormat.h @@ -35,6 +35,9 @@ class DefaultDeletedDocsFormat : public DeletedDocsFormat { void write(const storage::FSHandlerPtr& fs_ptr, const segment::DeletedDocsPtr& deleted_docs) override; + void + readSize(const storage::FSHandlerPtr& fs_ptr, size_t& size) override; + // No copy and move DefaultDeletedDocsFormat(const DefaultDeletedDocsFormat&) = delete; DefaultDeletedDocsFormat(DefaultDeletedDocsFormat&&) = delete; diff --git a/core/src/db/DBImpl.cpp b/core/src/db/DBImpl.cpp index 3a165ff360..a4062720c2 100644 --- a/core/src/db/DBImpl.cpp +++ b/core/src/db/DBImpl.cpp @@ -688,7 +688,7 @@ DBImpl::Compact(const std::string& table_id) { OngoingFileChecker::GetInstance().MarkOngoingFiles(files_to_compact); Status compact_status; - for (meta::TableFilesSchema::iterator iter = files_to_compact.begin(); iter != files_to_compact.end();) { + for (auto iter = files_to_compact.begin(); iter != files_to_compact.end();) { meta::TableFileSchema file = *iter; iter = files_to_compact.erase(iter); @@ -697,17 +697,15 @@ DBImpl::Compact(const std::string& table_id) { utils::GetParentPath(file.location_, segment_dir); segment::SegmentReader segment_reader(segment_dir); - segment::DeletedDocsPtr deleted_docs; - status = segment_reader.LoadDeletedDocs(deleted_docs); + size_t deleted_docs_size; + status = segment_reader.ReadDeletedDocsSize(deleted_docs_size); if (!status.ok()) { - std::string msg = "Failed to load deleted_docs from " + segment_dir; - ENGINE_LOG_ERROR << msg; OngoingFileChecker::GetInstance().UnmarkOngoingFile(file); continue; // skip this file and try compact next one } meta::TableFilesSchema files_to_update; - if (deleted_docs->GetSize() != 0) { + if (deleted_docs_size != 0) { compact_status = CompactFile(table_id, file, files_to_update); if (!compact_status.ok()) { diff --git a/core/src/segment/SegmentReader.cpp b/core/src/segment/SegmentReader.cpp index 757ed21c56..7a311a1307 100644 --- a/core/src/segment/SegmentReader.cpp +++ b/core/src/segment/SegmentReader.cpp @@ -119,5 +119,18 @@ SegmentReader::LoadDeletedDocs(segment::DeletedDocsPtr& deleted_docs_ptr) { return Status::OK(); } +Status +SegmentReader::ReadDeletedDocsSize(size_t& size) { + codec::DefaultCodec default_codec; + try { + fs_ptr_->operation_ptr_->CreateDirectory(); + default_codec.GetDeletedDocsFormat()->readSize(fs_ptr_, size); + } catch (std::exception& e) { + std::string err_msg = "Failed to read deleted docs size: " + std::string(e.what()); + ENGINE_LOG_ERROR << err_msg; + return Status(DB_ERROR, err_msg); + } + return Status::OK(); +} } // namespace segment } // namespace milvus diff --git a/core/src/segment/SegmentReader.h b/core/src/segment/SegmentReader.h index 48247e5deb..949c714852 100644 --- a/core/src/segment/SegmentReader.h +++ b/core/src/segment/SegmentReader.h @@ -54,6 +54,9 @@ class SegmentReader { Status GetSegment(SegmentPtr& segment_ptr); + Status + ReadDeletedDocsSize(size_t& size); + private: storage::FSHandlerPtr fs_ptr_; SegmentPtr segment_ptr_;