Slightly expand converage to file consistency check failure (#6800)

Summary:
Current DBCompactionTest.ConsistencyFailTest checks DB fails after L0 inconsitency is found. Add slightly more coverage by introducing DBCompactionTest.ConsistencyFailTest2 which checks non-L0 files too.
Pull Request resolved: https://github.com/facebook/rocksdb/pull/6800

Test Plan: Run the new test.

Reviewed By: riversand963

Differential Revision: D21384806

fbshipit-source-id: 36db7b657eed42115283fe2f6afa4c3a31a3b510
This commit is contained in:
sdong 2020-05-05 18:29:50 -07:00 committed by Facebook GitHub Bot
parent 394f2bbd13
commit c21c459771
2 changed files with 52 additions and 5 deletions

View File

@ -5024,10 +5024,11 @@ TEST_P(DBCompactionTestWithParam, FixFileIngestionCompactionDeadlock) {
TEST_F(DBCompactionTest, ConsistencyFailTest) { TEST_F(DBCompactionTest, ConsistencyFailTest) {
Options options = CurrentOptions(); Options options = CurrentOptions();
options.force_consistency_checks = true;
DestroyAndReopen(options); DestroyAndReopen(options);
ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack( ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
"VersionBuilder::CheckConsistency", [&](void* arg) { "VersionBuilder::CheckConsistency0", [&](void* arg) {
auto p = auto p =
reinterpret_cast<std::pair<FileMetaData**, FileMetaData**>*>(arg); reinterpret_cast<std::pair<FileMetaData**, FileMetaData**>*>(arg);
// just swap the two FileMetaData so that we hit error // just swap the two FileMetaData so that we hit error
@ -5046,6 +5047,48 @@ TEST_F(DBCompactionTest, ConsistencyFailTest) {
ASSERT_NOK(Put("foo", "bar")); ASSERT_NOK(Put("foo", "bar"));
ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing(); ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
SyncPoint::GetInstance()->ClearAllCallBacks();
}
TEST_F(DBCompactionTest, ConsistencyFailTest2) {
Options options = CurrentOptions();
options.force_consistency_checks = true;
options.target_file_size_base = 1000;
options.level0_file_num_compaction_trigger = 2;
BlockBasedTableOptions bbto;
bbto.block_size = 400; // small block size
options.table_factory.reset(new BlockBasedTableFactory(bbto));
DestroyAndReopen(options);
ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->SetCallBack(
"VersionBuilder::CheckConsistency1", [&](void* arg) {
auto p =
reinterpret_cast<std::pair<FileMetaData**, FileMetaData**>*>(arg);
// just swap the two FileMetaData so that we hit error
// in CheckConsistency funcion
FileMetaData* temp = *(p->first);
*(p->first) = *(p->second);
*(p->second) = temp;
});
ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->EnableProcessing();
Random rnd(301);
std::string value = RandomString(&rnd, 1000);
ASSERT_OK(Put("foo1", value));
ASSERT_OK(Put("z", ""));
Flush();
ASSERT_OK(Put("foo2", value));
ASSERT_OK(Put("z", ""));
Flush();
// This probably returns non-OK, but we rely on the next Put()
// to determine the DB is frozen.
dbfull()->TEST_WaitForCompact();
ASSERT_NOK(Put("foo", "bar"));
ROCKSDB_NAMESPACE::SyncPoint::GetInstance()->DisableProcessing();
SyncPoint::GetInstance()->ClearAllCallBacks();
} }
void IngestOneKeyValue(DBImpl* db, const std::string& key, void IngestOneKeyValue(DBImpl* db, const std::string& key,

View File

@ -236,11 +236,11 @@ class VersionBuilder::Rep {
auto f1 = level_files[i - 1]; auto f1 = level_files[i - 1];
auto f2 = level_files[i]; auto f2 = level_files[i];
if (level == 0) {
#ifndef NDEBUG #ifndef NDEBUG
auto pair = std::make_pair(&f1, &f2); auto pair = std::make_pair(&f1, &f2);
TEST_SYNC_POINT_CALLBACK("VersionBuilder::CheckConsistency", &pair); TEST_SYNC_POINT_CALLBACK("VersionBuilder::CheckConsistency0", &pair);
#endif #endif
if (level == 0) {
if (!level_zero_cmp_(f1, f2)) { if (!level_zero_cmp_(f1, f2)) {
fprintf(stderr, "L0 files are not sorted properly"); fprintf(stderr, "L0 files are not sorted properly");
return Status::Corruption("L0 files are not sorted properly"); return Status::Corruption("L0 files are not sorted properly");
@ -279,6 +279,10 @@ class VersionBuilder::Rep {
NumberToString(f2->fd.GetNumber())); NumberToString(f2->fd.GetNumber()));
} }
} else { } else {
#ifndef NDEBUG
auto pair = std::make_pair(&f1, &f2);
TEST_SYNC_POINT_CALLBACK("VersionBuilder::CheckConsistency1", &pair);
#endif
if (!level_nonzero_cmp_(f1, f2)) { if (!level_nonzero_cmp_(f1, f2)) {
fprintf(stderr, "L%d files are not sorted properly", level); fprintf(stderr, "L%d files are not sorted properly", level);
return Status::Corruption("L" + NumberToString(level) + return Status::Corruption("L" + NumberToString(level) +