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:
Yanqin Jin 2020-11-16 22:07:29 -08:00 committed by Facebook GitHub Bot
parent 9627e342c8
commit 869f0538dd

View File

@ -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