Clean up after two test failures in db_basic_test (#7682)
Summary: In db_basic_test.cc, there are two tests that rely on the underlying system's `LockFile` support to function correctly: DBBasicTest.OpenWhenOpen and DBBasicTest.CheckLock. In both tests, re-opening a db using `DB::Open` is expected to fail because the second open cannot lock the LOCK file. Some distributed file systems, e.g. HDFS do not support the POSIX-style file lock. Therefore, these unit tests will cause assertion failure and the second `Open` will create a db instance. Currently, these db instances are not closed after the assertion failure. Since these db instances are registered with some process-wide, static data structures, e.g. `PeriodicWorkScheduler::Default()`, they can still be accessed after the unit tests. However, the `Env` object created for this db instance is destroyed when the test finishes in `~DBTestBase()`. Consequently, it causes illegal memory access. Pull Request resolved: https://github.com/facebook/rocksdb/pull/7682 Test Plan: Run the following on a distrubited file system: ``` make check ``` Reviewed By: anand1976 Differential Revision: D25004215 Pulled By: riversand963 fbshipit-source-id: f4327d7716c0e72b13bb43737ec9a5d156da4d52
This commit is contained in:
parent
9627e342c8
commit
869f0538dd
@ -38,7 +38,10 @@ TEST_F(DBBasicTest, OpenWhenOpen) {
|
|||||||
options.env = env_;
|
options.env = env_;
|
||||||
DB* db2 = nullptr;
|
DB* db2 = nullptr;
|
||||||
Status s = DB::Open(options, dbname_, &db2);
|
Status s = DB::Open(options, dbname_, &db2);
|
||||||
ASSERT_NOK(s);
|
ASSERT_NOK(s) << [db2]() {
|
||||||
|
delete db2;
|
||||||
|
return "db2 open: ok";
|
||||||
|
}();
|
||||||
ASSERT_EQ(Status::Code::kIOError, s.code());
|
ASSERT_EQ(Status::Code::kIOError, s.code());
|
||||||
ASSERT_EQ(Status::SubCode::kNone, s.subcode());
|
ASSERT_EQ(Status::SubCode::kNone, s.subcode());
|
||||||
ASSERT_TRUE(strstr(s.getState(), "lock ") != nullptr);
|
ASSERT_TRUE(strstr(s.getState(), "lock ") != nullptr);
|
||||||
@ -402,13 +405,16 @@ TEST_F(DBBasicTest, GetSnapshot) {
|
|||||||
|
|
||||||
TEST_F(DBBasicTest, CheckLock) {
|
TEST_F(DBBasicTest, CheckLock) {
|
||||||
do {
|
do {
|
||||||
DB* localdb;
|
DB* localdb = nullptr;
|
||||||
Options options = CurrentOptions();
|
Options options = CurrentOptions();
|
||||||
ASSERT_OK(TryReopen(options));
|
ASSERT_OK(TryReopen(options));
|
||||||
|
|
||||||
// second open should fail
|
// second open should fail
|
||||||
Status s = DB::Open(options, dbname_, &localdb);
|
Status s = DB::Open(options, dbname_, &localdb);
|
||||||
ASSERT_NOK(s);
|
ASSERT_NOK(s) << [localdb]() {
|
||||||
|
delete localdb;
|
||||||
|
return "localdb open: ok";
|
||||||
|
}();
|
||||||
#ifdef OS_LINUX
|
#ifdef OS_LINUX
|
||||||
ASSERT_TRUE(s.ToString().find("lock ") != std::string::npos);
|
ASSERT_TRUE(s.ToString().find("lock ") != std::string::npos);
|
||||||
#endif // OS_LINUX
|
#endif // OS_LINUX
|
||||||
|
Loading…
Reference in New Issue
Block a user