This is an automated email from the ASF dual-hosted git repository. yuchenhe pushed a commit to branch v2.1 in repository https://gitbox.apache.org/repos/asf/incubator-pegasus.git
commit 4276c2cede6a4f65f86790f987568a8dcfe3655f Author: HeYuchen <[email protected]> AuthorDate: Tue Sep 8 18:11:36 2020 +0800 fix: fix db is not nullptr when release_db (#594) --- src/server/pegasus_server_impl.cpp | 32 +++++++++++++++++----------- src/server/pegasus_server_impl.h | 2 +- src/server/test/pegasus_server_impl_test.cpp | 16 ++++++++++++++ 3 files changed, 36 insertions(+), 14 deletions(-) diff --git a/src/server/pegasus_server_impl.cpp b/src/server/pegasus_server_impl.cpp index 1889e98..577c907 100644 --- a/src/server/pegasus_server_impl.cpp +++ b/src/server/pegasus_server_impl.cpp @@ -1813,7 +1813,16 @@ private: if (remove_checkpoint && !::dsn::utils::filesystem::remove_path(checkpoint_dir)) { derror_replica("remove checkpoint directory {} failed", checkpoint_dir); } - release_db(snapshot_db, handles_opened); + if (snapshot_db) { + for (auto handle : handles_opened) { + if (handle) { + snapshot_db->DestroyColumnFamilyHandle(handle); + handle = nullptr; + } + } + delete snapshot_db; + snapshot_db = nullptr; + } }; // Because of RocksDB's restriction, we have to to open default column family even though @@ -2716,19 +2725,16 @@ void pegasus_server_impl::set_partition_version(int32_t partition_version) return ::dsn::ERR_OK; } -void pegasus_server_impl::release_db() { release_db(_db, {_data_cf, _meta_cf}); } - -void pegasus_server_impl::release_db(rocksdb::DB *db, - const std::vector<rocksdb::ColumnFamilyHandle *> &handles) +void pegasus_server_impl::release_db() { - if (db) { - for (auto handle : handles) { - dassert_replica(handle != nullptr, ""); - db->DestroyColumnFamilyHandle(handle); - handle = nullptr; - } - delete db; - db = nullptr; + if (_db) { + dassert_replica(_data_cf != nullptr && _meta_cf != nullptr, ""); + _db->DestroyColumnFamilyHandle(_data_cf); + _data_cf = nullptr; + _db->DestroyColumnFamilyHandle(_meta_cf); + _meta_cf = nullptr; + delete _db; + _db = nullptr; } } diff --git a/src/server/pegasus_server_impl.h b/src/server/pegasus_server_impl.h index 009f97f..1db2077 100644 --- a/src/server/pegasus_server_impl.h +++ b/src/server/pegasus_server_impl.h @@ -168,6 +168,7 @@ private: FRIEND_TEST(pegasus_server_impl_test, default_data_version); FRIEND_TEST(pegasus_server_impl_test, test_open_db_with_latest_options); FRIEND_TEST(pegasus_server_impl_test, test_open_db_with_app_envs); + FRIEND_TEST(pegasus_server_impl_test, test_stop_db_twice); friend class pegasus_manual_compact_service; friend class pegasus_write_service; @@ -314,7 +315,6 @@ private: check_column_families(const std::string &path, bool *missing_meta_cf, bool *miss_data_cf); void release_db(); - void release_db(rocksdb::DB *db, const std::vector<rocksdb::ColumnFamilyHandle *> &handles); ::dsn::error_code flush_all_family_columns(bool wait); diff --git a/src/server/test/pegasus_server_impl_test.cpp b/src/server/test/pegasus_server_impl_test.cpp index d9d161a..0302d8f 100644 --- a/src/server/test/pegasus_server_impl_test.cpp +++ b/src/server/test/pegasus_server_impl_test.cpp @@ -99,5 +99,21 @@ TEST_F(pegasus_server_impl_test, test_open_db_with_app_envs) ASSERT_EQ(ROCKSDB_ENV_USAGE_SCENARIO_BULK_LOAD, _server->_usage_scenario); } +TEST_F(pegasus_server_impl_test, test_stop_db_twice) +{ + start(); + ASSERT_TRUE(_server->_is_open); + ASSERT_TRUE(_server->_db != nullptr); + + _server->stop(false); + ASSERT_FALSE(_server->_is_open); + ASSERT_TRUE(_server->_db == nullptr); + + // stop again + _server->stop(false); + ASSERT_FALSE(_server->_is_open); + ASSERT_TRUE(_server->_db == nullptr); +} + } // namespace server } // namespace pegasus --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
