From 82089d59c3e262c020ba2446b4b7d6fac9ac3bd8 Mon Sep 17 00:00:00 2001 From: Siying Dong Date: Thu, 31 May 2018 12:53:43 -0700 Subject: [PATCH] DBImpl::FindObsoleteFiles() not to call GetChildren() on the same path Summary: DBImpl::FindObsoleteFiles() may call GetChildren() multiple times if different CFs are on the same path. Fix it. Closes https://github.com/facebook/rocksdb/pull/3885 Differential Revision: D8084634 Pulled By: siying fbshipit-source-id: b471fbc251f6a05e9243304dc14c0831060cc0b0 --- db/db_impl_files.cc | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/db/db_impl_files.cc b/db/db_impl_files.cc index 6d3b4b996..fa079dc25 100644 --- a/db/db_impl_files.cc +++ b/db/db_impl_files.cc @@ -12,6 +12,7 @@ #define __STDC_FORMAT_MACROS #endif #include +#include #include #include "db/event_helpers.h" #include "db/memtable_list.h" @@ -99,10 +100,10 @@ void DBImpl::FindObsoleteFiles(JobContext* job_context, bool force, if (doing_the_full_scan) { InfoLogPrefix info_log_prefix(!immutable_db_options_.db_log_dir.empty(), dbname_); - std::vector paths; + std::set paths; for (size_t path_id = 0; path_id < immutable_db_options_.db_paths.size(); path_id++) { - paths.emplace_back(immutable_db_options_.db_paths[path_id].path); + paths.insert(immutable_db_options_.db_paths[path_id].path); } // Note that if cf_paths is not specified in the ColumnFamilyOptions @@ -113,7 +114,11 @@ void DBImpl::FindObsoleteFiles(JobContext* job_context, bool force, for (auto cfd : *versions_->GetColumnFamilySet()) { for (size_t path_id = 0; path_id < cfd->ioptions()->cf_paths.size(); path_id++) { - paths.emplace_back(cfd->ioptions()->cf_paths[path_id].path); + auto& path = cfd->ioptions()->cf_paths[path_id].path; + + if (paths.find(path) == paths.end()) { + paths.insert(path); + } } }