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:
parent
118058ba69
commit
4d51feab0b
@ -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);
|
||||||
|
@ -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() &&
|
||||||
|
@ -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,
|
||||||
|
Loading…
Reference in New Issue
Block a user