Fix build caused by DeleteFile not tolerating / at the beginning

Summary: db->DeleteFile calls ParseFileName to check name that was returned for sst file. Now, sst filename is returned using TableFileName which uses MakeFileName. This puts a / at the front of the name and ParseFileName doesn't like that. Changed ParseFileName to tolerate /s at the beginning. The test delet_file_test used to pass earlier because this behaviour of MakeFileName had been changed a while back to not return a / during which delete_file_test was checked in. But MakeFileName had to be reverted to add / at the front because GetLiveFiles used at many places outside rocksdb used the previous behaviour of MakeFileName.

Test Plan: make;./delete_filetest;make all check

Reviewers: dhruba, haobo, vamsi

Reviewed By: dhruba

CC: leveldb

Differential Revision: https://reviews.facebook.net/D12663
main
Mayank Agarwal 11 years ago
parent f121c4f504
commit ab5c5c28fe
  1. 3
      db/db_impl.cc
  2. 2
      db/deletefile_test.cc
  3. 4
      db/filename.cc
  4. 8
      db/version_set.cc

@ -3042,8 +3042,7 @@ Status DBImpl::DeleteFile(std::string name) {
return status; return status;
} }
void DBImpl::GetLiveFilesMetaData( void DBImpl::GetLiveFilesMetaData(std::vector<LiveFileMetaData> *metadata) {
std::vector<LiveFileMetaData> *metadata) {
MutexLock l(&mutex_); MutexLock l(&mutex_);
return versions_->GetLiveFilesMetaData(metadata); return versions_->GetLiveFilesMetaData(metadata);
} }

@ -167,7 +167,7 @@ TEST(DeleteFileTest, DeleteFileWithIterator) {
} }
Status status = db_->DeleteFile(level2file); Status status = db_->DeleteFile(level2file);
fprintf(stderr, "Deletion status %s: %s\n", fprintf(stdout, "Deletion status %s: %s\n",
level2file.c_str(), status.ToString().c_str()); level2file.c_str(), status.ToString().c_str());
ASSERT_TRUE(status.ok()); ASSERT_TRUE(status.ok());
it->SeekToFirst(); it->SeekToFirst();

@ -130,10 +130,14 @@ std::string MetaDatabaseName(const std::string& dbname, uint64_t number) {
// dbname/MANIFEST-[0-9]+ // dbname/MANIFEST-[0-9]+
// dbname/[0-9]+.(log|sst) // dbname/[0-9]+.(log|sst)
// dbname/METADB-[0-9]+ // dbname/METADB-[0-9]+
// Disregards / at the beginning
bool ParseFileName(const std::string& fname, bool ParseFileName(const std::string& fname,
uint64_t* number, uint64_t* number,
FileType* type) { FileType* type) {
Slice rest(fname); Slice rest(fname);
if (fname.length() > 1 && fname[0] == '/') {
rest.remove_prefix(1);
}
if (rest == "CURRENT") { if (rest == "CURRENT") {
*number = 0; *number = 0;
*type = kCurrentFile; *type = kCurrentFile;

@ -2674,9 +2674,9 @@ void VersionSet::SetupOtherInputs(Compaction* c) {
} }
Status VersionSet::GetMetadataForFile( Status VersionSet::GetMetadataForFile(
uint64_t number, uint64_t number,
int *filelevel, int *filelevel,
FileMetaData *meta) { FileMetaData *meta) {
for (int level = 0; level < NumberLevels(); level++) { for (int level = 0; level < NumberLevels(); level++) {
const std::vector<FileMetaData*>& files = current_->files_[level]; const std::vector<FileMetaData*>& files = current_->files_[level];
for (size_t i = 0; i < files.size(); i++) { for (size_t i = 0; i < files.size(); i++) {
@ -2691,7 +2691,7 @@ Status VersionSet::GetMetadataForFile(
} }
void VersionSet::GetLiveFilesMetaData( void VersionSet::GetLiveFilesMetaData(
std::vector<LiveFileMetaData> * metadata) { std::vector<LiveFileMetaData> * metadata) {
for (int level = 0; level < NumberLevels(); level++) { for (int level = 0; level < NumberLevels(); level++) {
const std::vector<FileMetaData*>& files = current_->files_[level]; const std::vector<FileMetaData*>& files = current_->files_[level];
for (size_t i = 0; i < files.size(); i++) { for (size_t i = 0; i < files.size(); i++) {

Loading…
Cancel
Save