Rename function for handling WAL write error

Summary:
It was misnamed. It actually updates `bg_error_` if `PreprocessWrite()` or `WriteToWAL()` fail, not related to the user callback.
Closes https://github.com/facebook/rocksdb/pull/3485

Differential Revision: D6955787

Pulled By: ajkr

fbshipit-source-id: bd7afc3fdb7a52830c021cbfc25fcbc3ab7d5e10
This commit is contained in:
Andrew Kryczka 2018-03-22 15:56:52 -07:00 committed by Facebook Github Bot
parent 118058ba69
commit 4d51feab0b
3 changed files with 21 additions and 5 deletions

View File

@ -875,7 +875,7 @@ class DBImpl : public DB {
size_t seq_inc); size_t seq_inc);
// Used by WriteImpl to update bg_error_ if paranoid check is enabled. // Used by WriteImpl to update bg_error_ if paranoid check is enabled.
void WriteCallbackStatusCheck(const Status& status); void WriteStatusCheck(const Status& status);
// Used by WriteImpl to update bg_error_ in case of memtable insert error. // Used by WriteImpl to update bg_error_ in case of memtable insert error.
void MemTableInsertStatusCheck(const Status& memtable_insert_status); void MemTableInsertStatusCheck(const Status& memtable_insert_status);

View File

@ -340,7 +340,7 @@ Status DBImpl::WriteImpl(const WriteOptions& write_options,
PERF_TIMER_START(write_pre_and_post_process_time); PERF_TIMER_START(write_pre_and_post_process_time);
if (!w.CallbackFailed()) { if (!w.CallbackFailed()) {
WriteCallbackStatusCheck(status); WriteStatusCheck(status);
} }
if (need_log_sync) { if (need_log_sync) {
@ -464,7 +464,7 @@ Status DBImpl::PipelinedWriteImpl(const WriteOptions& write_options,
} }
if (!w.CallbackFailed()) { if (!w.CallbackFailed()) {
WriteCallbackStatusCheck(w.status); WriteStatusCheck(w.status);
} }
if (need_log_sync) { if (need_log_sync) {
@ -625,7 +625,7 @@ Status DBImpl::WriteImplWALOnly(const WriteOptions& write_options,
PERF_TIMER_START(write_pre_and_post_process_time); PERF_TIMER_START(write_pre_and_post_process_time);
if (!w.CallbackFailed()) { if (!w.CallbackFailed()) {
WriteCallbackStatusCheck(status); WriteStatusCheck(status);
} }
if (status.ok()) { if (status.ok()) {
for (auto* writer : write_group) { for (auto* writer : write_group) {
@ -651,7 +651,7 @@ Status DBImpl::WriteImplWALOnly(const WriteOptions& write_options,
return status; return status;
} }
void DBImpl::WriteCallbackStatusCheck(const Status& status) { void DBImpl::WriteStatusCheck(const Status& status) {
// Is setting bg_error_ enough here? This will at least stop // Is setting bg_error_ enough here? This will at least stop
// compaction and fail any further writes. // compaction and fail any further writes.
if (immutable_db_options_.paranoid_checks && !status.ok() && if (immutable_db_options_.paranoid_checks && !status.ok() &&

View File

@ -80,6 +80,22 @@ TEST_P(DBWriteTest, IOErrorOnWALWritePropagateToWriteThreadFollower) {
Close(); Close();
} }
TEST_P(DBWriteTest, IOErrorOnWALWriteTriggersReadOnlyMode) {
std::unique_ptr<FaultInjectionTestEnv> mock_env(
new FaultInjectionTestEnv(Env::Default()));
Options options = GetOptions();
options.env = mock_env.get();
Reopen(options);
for (int i = 0; i < 2; i++) {
// Forcibly fail WAL write for the first Put only. Subsequent Puts should
// fail due to read-only mode
mock_env->SetFilesystemActive(i != 0);
ASSERT_FALSE(Put("key" + ToString(i), "value").ok());
}
// Close before mock_env destruct.
Close();
}
INSTANTIATE_TEST_CASE_P(DBWriteTestInstance, DBWriteTest, INSTANTIATE_TEST_CASE_P(DBWriteTestInstance, DBWriteTest,
testing::Values(DBTestBase::kDefault, testing::Values(DBTestBase::kDefault,
DBTestBase::kConcurrentWALWrites, DBTestBase::kConcurrentWALWrites,