Fix flaky error_handler_fs_test.MultiDBCompactionError (#7896)

Summary:
The error recovery thread may out-live DBImpl object, which causing
access released DBImpl.mutex. Close SstFileManager before closing DB.

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

Test Plan:
the issue can be reproduced by adding sleep in recovery code.
Pass the tests with sleep.

Reviewed By: zhichao-cao

Differential Revision: D26076655

Pulled By: jay-zhuang

fbshipit-source-id: 0d9cc5639c12fcfc001427015e75a9736f33cd96
This commit is contained in:
Jay Zhuang 2021-01-26 10:58:31 -08:00 committed by Facebook GitHub Bot
parent f9a30e0a5a
commit 9425acacce

View File

@ -9,9 +9,9 @@
#ifndef ROCKSDB_LITE #ifndef ROCKSDB_LITE
#include "db/db_test_util.h" #include "db/db_test_util.h"
#include "file/sst_file_manager_impl.h"
#include "port/stack_trace.h" #include "port/stack_trace.h"
#include "rocksdb/io_status.h" #include "rocksdb/io_status.h"
#include "rocksdb/perf_context.h"
#include "rocksdb/sst_file_manager.h" #include "rocksdb/sst_file_manager.h"
#if !defined(ROCKSDB_LITE) #if !defined(ROCKSDB_LITE)
#include "test_util/sync_point.h" #include "test_util/sync_point.h"
@ -1391,6 +1391,10 @@ TEST_F(DBErrorHandlingFSTest, MultiDBCompactionError) {
EXPECT_EQ(atoi(prop.c_str()), 1); EXPECT_EQ(atoi(prop.c_str()), 1);
} }
SstFileManagerImpl* sfmImpl =
static_cast_with_check<SstFileManagerImpl>(sfm.get());
sfmImpl->Close();
for (auto i = 0; i < kNumDbInstances; ++i) { for (auto i = 0; i < kNumDbInstances; ++i) {
char buf[16]; char buf[16];
snprintf(buf, sizeof(buf), "_%d", i); snprintf(buf, sizeof(buf), "_%d", i);
@ -1524,6 +1528,10 @@ TEST_F(DBErrorHandlingFSTest, MultiDBVariousErrors) {
EXPECT_EQ(atoi(prop.c_str()), 1); EXPECT_EQ(atoi(prop.c_str()), 1);
} }
SstFileManagerImpl* sfmImpl =
static_cast_with_check<SstFileManagerImpl>(sfm.get());
sfmImpl->Close();
for (auto i = 0; i < kNumDbInstances; ++i) { for (auto i = 0; i < kNumDbInstances; ++i) {
char buf[16]; char buf[16];
snprintf(buf, sizeof(buf), "_%d", i); snprintf(buf, sizeof(buf), "_%d", i);