Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion file/filename.cc
Original file line number Diff line number Diff line change
Expand Up @@ -471,6 +471,7 @@ IOStatus SyncManifest(const ImmutableDBOptions* db_options,

Status GetInfoLogFiles(const std::shared_ptr<FileSystem>& fs,
const std::string& db_log_dir, const std::string& dbname,
const std::string& db_absolute_path,
std::string* parent_dir,
std::vector<std::string>* info_log_list) {
assert(parent_dir != nullptr);
Expand All @@ -484,7 +485,7 @@ Status GetInfoLogFiles(const std::shared_ptr<FileSystem>& fs,
*parent_dir = dbname;
}

InfoLogPrefix info_log_prefix(!db_log_dir.empty(), dbname);
InfoLogPrefix info_log_prefix(!db_log_dir.empty(), db_absolute_path);

std::vector<std::string> file_names;
Status s = fs->GetChildren(*parent_dir, IOOptions(), &file_names, nullptr);
Expand Down
3 changes: 3 additions & 0 deletions file/filename.h
Original file line number Diff line number Diff line change
Expand Up @@ -178,9 +178,12 @@ extern IOStatus SyncManifest(const ImmutableDBOptions* db_options,
// The list only contains file name. The parent directory name is stored
// in `parent_dir`.
// `db_log_dir` should be the one as in options.db_log_dir
// `db_absolute_path` is the absolute path of dbname, used for generating
// the correct log file prefix when db_log_dir is set.
extern Status GetInfoLogFiles(const std::shared_ptr<FileSystem>& fs,
const std::string& db_log_dir,
const std::string& dbname,
const std::string& db_absolute_path,
std::string* parent_dir,
std::vector<std::string>* file_names);

Expand Down
3 changes: 2 additions & 1 deletion logging/auto_roll_logger.cc
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,8 @@ void AutoRollLogger::GetExistingFiles() {
std::string parent_dir;
std::vector<std::string> info_log_files;
Status s =
GetInfoLogFiles(fs_, db_log_dir_, dbname_, &parent_dir, &info_log_files);
GetInfoLogFiles(fs_, db_log_dir_, dbname_, db_absolute_path_,
&parent_dir, &info_log_files);
if (status_.ok()) {
status_ = s;
}
Expand Down
43 changes: 43 additions & 0 deletions logging/auto_roll_logger_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -721,6 +721,49 @@ TEST_F(AutoRollLoggerTest, RenameError) {
}
}

TEST_F(AutoRollLoggerTest, GetInfoLogFilesPrefixMismatch) {

InitTestDb();
const size_t kFileNum = 3;
const size_t kMaxFileSize = 512;


std::string relative_dbname = "test_relative_db";
std::string db_log_dir = kTestDir;


ASSERT_OK(default_env->CreateDirIfMissing(relative_dbname));


{
AutoRollLogger logger(FileSystem::Default(), SystemClock::Default(),
relative_dbname, db_log_dir, kMaxFileSize, 0, kFileNum);

RollNTimesBySize(&logger, kFileNum + 2, kMaxFileSize);
}
std::vector<std::string> files = GetLogFiles();
ASSERT_EQ(kFileNum, files.size())
<< "Log files should be created";

{
AutoRollLogger logger(FileSystem::Default(), SystemClock::Default(),
relative_dbname, db_log_dir, kMaxFileSize, 0, kFileNum);

RollNTimesBySize(&logger, 1, kMaxFileSize);
}


files = GetLogFiles();

ASSERT_EQ(kFileNum, files.size())
<< "Log files exceed keep_log_file_num limit. "
<< "Bug: GetInfoLogFiles uses wrong prefix when db_log_dir is set. "
<< "Expected: " << kFileNum << ", Actual: " << files.size();

default_env->DeleteDir(relative_dbname).PermitUncheckedError();
CleanupLogFiles();
}

} // namespace ROCKSDB_NAMESPACE

int main(int argc, char** argv) {
Expand Down
12 changes: 11 additions & 1 deletion utilities/convenience/info_log_finder.cc
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,17 @@ Status GetInfoLogList(DB* db, std::vector<std::string>* info_log_list) {
}
std::string parent_path;
const Options& options = db->GetOptions();
std::string dbname = db->GetName();

std::string db_absolute_path;
Status s = options.env->GetAbsolutePath(dbname, &db_absolute_path);
if (s.IsNotSupported()) {
db_absolute_path = dbname;
} else if (!s.ok()) {
return s;
}

return GetInfoLogFiles(options.env->GetFileSystem(), options.db_log_dir,
db->GetName(), &parent_path, info_log_list);
dbname, db_absolute_path, &parent_path, info_log_list);
}
} // namespace ROCKSDB_NAMESPACE
Loading