From bfc0c049d9f0a6dc5ee3208aab70ec41cf470e09 Mon Sep 17 00:00:00 2001 From: lobty Date: Sat, 23 Aug 2025 17:01:19 +0800 Subject: [PATCH] =?UTF-8?q?observerMap=E5=B9=B6=E5=8F=91=E4=BF=9D=E6=8A=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: lobty --- .../src/kv_store_nb_delegate_impl.cpp | 4 +- ...stributeddb_interfaces_nb_publish_test.cpp | 55 +++++++++++++++++++ 2 files changed, 57 insertions(+), 2 deletions(-) diff --git a/frameworks/libs/distributeddb/interfaces/src/kv_store_nb_delegate_impl.cpp b/frameworks/libs/distributeddb/interfaces/src/kv_store_nb_delegate_impl.cpp index b24958fb948..1fdf381d191 100644 --- a/frameworks/libs/distributeddb/interfaces/src/kv_store_nb_delegate_impl.cpp +++ b/frameworks/libs/distributeddb/interfaces/src/kv_store_nb_delegate_impl.cpp @@ -398,7 +398,6 @@ DBStatus KvStoreNbDelegateImpl::CheckDeviceObserver(const Key &key, unsigned int return INVALID_ARGS; } - std::lock_guard lockGuard(observerMapLock_); if (observerMap_.size() >= DBConstant::MAX_OBSERVER_COUNT) { LOGE("[KvStoreNbDelegate][CheckDeviceObserver] The number of kv observers has been over limit, storeId[%.3s]", storeId_.c_str()); @@ -417,6 +416,7 @@ DBStatus KvStoreNbDelegateImpl::RegisterDeviceObserver(const Key &key, unsigned LOGE("[KvStoreNbDelegate][RegisterDeviceObserver] Transaction unfinished"); return BUSY; } + std::lock_guard lockGuard(observerMapLock_); DBStatus status = CheckDeviceObserver(key, mode, observer); if (status != OK) { LOGE("[KvStoreNbDelegate][RegisterDeviceObserver] Observer map cannot be registered, status:%d", status); @@ -446,7 +446,6 @@ DBStatus KvStoreNbDelegateImpl::RegisterDeviceObserver(const Key &key, unsigned DBStatus KvStoreNbDelegateImpl::CheckCloudObserver(KvStoreObserver *observer) { - std::lock_guard lockGuard(observerMapLock_); if (cloudObserverMap_.size() >= DBConstant::MAX_OBSERVER_COUNT) { LOGE("[KvStoreNbDelegate][CheckCloudObserver] The number of kv cloud observers over limit, storeId[%.3s]", storeId_.c_str()); @@ -461,6 +460,7 @@ DBStatus KvStoreNbDelegateImpl::CheckCloudObserver(KvStoreObserver *observer) DBStatus KvStoreNbDelegateImpl::RegisterCloudObserver(const Key &key, unsigned int mode, KvStoreObserver *observer) { + std::lock_guard lockGuard(observerMapLock_); DBStatus status = CheckCloudObserver(observer); if (status != OK) { LOGE("[KvStoreNbDelegate][RegisterCloudObserver] Cloud observer map cannot be registered, status:%d", status); diff --git a/frameworks/libs/distributeddb/test/unittest/common/interfaces/distributeddb_interfaces_nb_publish_test.cpp b/frameworks/libs/distributeddb/test/unittest/common/interfaces/distributeddb_interfaces_nb_publish_test.cpp index f0e9bcfd514..cd691a24876 100644 --- a/frameworks/libs/distributeddb/test/unittest/common/interfaces/distributeddb_interfaces_nb_publish_test.cpp +++ b/frameworks/libs/distributeddb/test/unittest/common/interfaces/distributeddb_interfaces_nb_publish_test.cpp @@ -829,3 +829,58 @@ HWTEST_F(DistributedDBInterfacesNBPublishTest, SingleVerPublishKey012, TestSize. EXPECT_EQ(g_mgr.DeleteKvStore("distributed_nb_publish_SingleVerPublishKey012"), OK); g_kvNbDelegatePtr = nullptr; } + +/** + * @tc.name: SingleVerPublishKey013 + * @tc.desc: Test concurrent registrer and unRegistrer + * @tc.type: FUNC + * @tc.require: + * @tc.author: bty + */ +HWTEST_F(DistributedDBInterfacesNBPublishTest, SingleVerPublishKey013, TestSize.Level1) +{ + const KvStoreNbDelegate::Option option = {true, false}; + g_mgr.GetKvStore("distributed_nb_publish_SingleVerPublishKey013", option, g_kvNbDelegateCallback); + ASSERT_TRUE(g_kvNbDelegatePtr != nullptr); + EXPECT_TRUE(g_kvDelegateStatus == OK); + + std::vector> obList; + std::function obReleaser = [](KvStoreObserverUnitTest *obj) { + if (obj == nullptr) { + return; + } + g_kvNbDelegatePtr->UnRegisterObserver(obj); + delete obj; + }; + size_t maxCnt = 1000; + obList.resize(maxCnt); + std::mutex listMutex; + std::thread t1([maxCnt, &obList, obReleaser, &listMutex] { + for (size_t i = 0; i < maxCnt; i++) { + std::shared_ptr ob1 = { new (std::nothrow) KvStoreObserverUnitTest(), obReleaser}; + EXPECT_TRUE(ob1 != nullptr); + g_kvNbDelegatePtr->RegisterObserver(NULL_KEY, OBSERVER_CHANGES_NATIVE, ob1.get()); + std::lock_guard lock(listMutex); + obList[i] = ob1; + } + }); + std::thread t2([maxCnt] { + for (size_t i = 0; i < maxCnt; i++) { + EXPECT_EQ(g_kvNbDelegatePtr->Put(KEY_2, VALUE_2), OK); + } + }); + + for (size_t i = 0; i < maxCnt; i++) { + std::lock_guard lock(listMutex); + obList[i] = nullptr; + } + t1.join(); + t2.join(); + for (size_t i = 0; i < maxCnt; i++) { + std::lock_guard lock(listMutex); + obList[i] = nullptr; + } + EXPECT_EQ(g_mgr.CloseKvStore(g_kvNbDelegatePtr), OK); + EXPECT_EQ(g_mgr.DeleteKvStore("distributed_nb_publish_SingleVerPublishKey013"), OK); + g_kvNbDelegatePtr = nullptr; +} \ No newline at end of file -- Gitee