fix swallowed error for file deletion consistency check (#6809)

Summary: Pull Request resolved: https://github.com/facebook/rocksdb/pull/6809

Reviewed By: pdillinger

Differential Revision: D21411971

Pulled By: ajkr

fbshipit-source-id: 900b6b0370b76e9a3e5e03f968e2ac1bbaab73b8
This commit is contained in:
Andrew Kryczka 2020-05-05 14:52:18 -07:00
parent ecf1499609
commit 33087a2881
3 changed files with 35 additions and 1 deletions

View File

@ -2,6 +2,7 @@
## 6.9.4 (04/30/2020) ## 6.9.4 (04/30/2020)
### Bug Fixes ### Bug Fixes
* Fix a bug caused by overwrite the status with io status in block based table builder when writing data blocks. If status stores the error message (e.g., failure of verify block compression), the bug will make the io status overwrite the status. * Fix a bug caused by overwrite the status with io status in block based table builder when writing data blocks. If status stores the error message (e.g., failure of verify block compression), the bug will make the io status overwrite the status.
* Fix `force_consistency_checks=true` use cases to not swallow errors returned by `CheckConsistencyForDeletes()`, which can expose internal bugs like multiple compactions involving a single file.
## 6.9.3 (04/28/2020) ## 6.9.3 (04/28/2020)
### Bug Fixes ### Bug Fixes

View File

@ -441,7 +441,10 @@ class VersionBuilder::Rep {
const auto number = del_file.second; const auto number = del_file.second;
if (level < num_levels_) { if (level < num_levels_) {
levels_[level].deleted_files.insert(number); levels_[level].deleted_files.insert(number);
CheckConsistencyForDeletes(edit, number, level); s = CheckConsistencyForDeletes(edit, number, level);
if (!s.ok()) {
return s;
}
auto exising = levels_[level].added_files.find(number); auto exising = levels_[level].added_files.find(number);
if (exising != levels_[level].added_files.end()) { if (exising != levels_[level].added_files.end()) {

View File

@ -792,6 +792,36 @@ TEST_F(VersionBuilderTest, CheckConsistencyForBlobFilesAllGarbage) {
UnrefFilesInVersion(&new_vstorage); UnrefFilesInVersion(&new_vstorage);
} }
TEST_F(VersionBuilderTest, CheckConsistencyForFileDeletedTwice) {
Add(0, 1U, "150", "200", 100U);
UpdateVersionStorageInfo();
VersionEdit version_edit;
version_edit.DeleteFile(0, 1U);
EnvOptions env_options;
constexpr TableCache* table_cache = nullptr;
constexpr VersionSet* version_set = nullptr;
VersionBuilder version_builder(env_options, &ioptions_, table_cache,
&vstorage_, version_set);
VersionStorageInfo new_vstorage(&icmp_, ucmp_, options_.num_levels,
kCompactionStyleLevel, nullptr,
true /* force_consistency_checks */);
ASSERT_OK(version_builder.Apply(&version_edit));
ASSERT_OK(version_builder.SaveTo(&new_vstorage));
VersionBuilder version_builder2(env_options, &ioptions_, table_cache,
&new_vstorage, version_set);
VersionStorageInfo new_vstorage2(&icmp_, ucmp_, options_.num_levels,
kCompactionStyleLevel, nullptr,
true /* force_consistency_checks */);
ASSERT_NOK(version_builder2.Apply(&version_edit));
UnrefFilesInVersion(&new_vstorage);
UnrefFilesInVersion(&new_vstorage2);
}
TEST_F(VersionBuilderTest, EstimatedActiveKeys) { TEST_F(VersionBuilderTest, EstimatedActiveKeys) {
const uint32_t kTotalSamples = 20; const uint32_t kTotalSamples = 20;
const uint32_t kNumLevels = 5; const uint32_t kNumLevels = 5;