You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pegasus.apache.org by yu...@apache.org on 2020/09/14 06:46:30 UTC

[incubator-pegasus] 03/05: fix: fix db is not nullptr when release_db (#594)

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 <37...@qq.com>
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: commits-unsubscribe@pegasus.apache.org
For additional commands, e-mail: commits-help@pegasus.apache.org