Sanity check on Open

Summary:
Everytime a client opens a DB, we do a sanity check that:
* checks the existance of all the necessary files
* verifies that file sizes are correct

Some of the code was stolen from https://reviews.facebook.net/D16935

Test Plan: added a unit test

Reviewers: dhruba, haobo, sdong

Reviewed By: dhruba

CC: leveldb

Differential Revision: https://reviews.facebook.net/D17097
This commit is contained in:
Igor Canadi
2014-03-20 14:18:29 -07:00
parent 7981a43274
commit e67241f0b9
7 changed files with 73 additions and 54 deletions

View File

@@ -99,46 +99,4 @@ Status DB::OpenForReadOnly(const Options& options, const std::string& dbname,
return s;
}
Status DB::CheckConsistency(const Options& options,
const std::string& name) {
DB *db = nullptr;
Status st;
st = DB::OpenForReadOnly(options, name, &db);
if (!st.ok()) {
return st;
}
std::vector<LiveFileMetaData> metadata;
db->GetLiveFilesMetaData(&metadata);
for (const auto& md : metadata) {
std::string file_path = name + md.name;
if (!db->GetEnv()->FileExists(file_path)) {
st = Status::Corruption("sst file " + md.name + " doesn't exist");
break;
}
uint64_t fsize = 0;
st = db->GetEnv()->GetFileSize(file_path, &fsize);
if (!st.ok()) {
st = Status::Corruption(
"Failed to determine the actual size of file " + md.name +
": " + st.ToString());
break;
}
if (fsize != md.size) {
st = Status::Corruption(
"sst file size mismatch: " + md.name +
". Size recorded in manifest " + std::to_string(md.size) +
", actual size " + std::to_string(fsize));
break;
}
}
delete db;
return st;
}
} // namespace rocksdb