From af274ebfed15a23cbb442de08088709fb2000285 Mon Sep 17 00:00:00 2001 From: lvchao_2580 Date: Thu, 28 Aug 2025 15:11:20 +0800 Subject: [PATCH] =?UTF-8?q?fix:=E5=85=A8=E5=B1=80=E5=8F=98=E9=87=8F?= =?UTF-8?q?=E6=9E=B7=E9=94=81=E4=BF=9D=E6=8A=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: lvchao_2580 --- .../service/object/include/object_manager.h | 3 ++ .../service/object/src/object_manager.cpp | 49 ++++++++++++++++--- .../service/test/object_manager_test.cpp | 22 +++++++++ 3 files changed, 66 insertions(+), 8 deletions(-) diff --git a/services/distributeddataservice/service/object/include/object_manager.h b/services/distributeddataservice/service/object/include/object_manager.h index 85dd81349..04993d41b 100644 --- a/services/distributeddataservice/service/object/include/object_manager.h +++ b/services/distributeddataservice/service/object/include/object_manager.h @@ -199,6 +199,8 @@ private: bool& hasAsset); void CloseAfterMinute(); int32_t Open(); + std::shared_ptr GetKvStoreDelegateManager(); + void InitKvStoreDelegateManager(const std::string &userId); inline std::string GetPropertyPrefix(const std::string &appId, const std::string &sessionId) { return appId + SEPERATOR + sessionId + SEPERATOR + DmAdaper::GetInstance().GetLocalDevice().udid + SEPERATOR; @@ -219,6 +221,7 @@ private: + DmAdaper::GetInstance().GetLocalDevice().udid; }; mutable std::shared_timed_mutex rwMutex_; + mutable std::shared_timed_mutex rwKvStoreMutex_; std::shared_ptr kvStoreDelegateManager_ = nullptr; DistributedDB::KvStoreNbDelegate *delegate_ = nullptr; ObjectDataListener objectDataListener_; diff --git a/services/distributeddataservice/service/object/src/object_manager.cpp b/services/distributeddataservice/service/object/src/object_manager.cpp index 66d35fd0c..7d419e11b 100644 --- a/services/distributeddataservice/service/object/src/object_manager.cpp +++ b/services/distributeddataservice/service/object/src/object_manager.cpp @@ -71,7 +71,12 @@ DistributedDB::KvStoreNbDelegate *ObjectStoreManager::OpenObjectKvStore() option.syncDualTupleMode = true; option.secOption = { DistributedDB::S1, DistributedDB::ECE }; ZLOGD("start GetKvStore"); - kvStoreDelegateManager_->GetKvStore(ObjectCommon::OBJECTSTORE_DB_STOREID, option, + auto kvStoreDelegateManager = GetKvStoreDelegateManager(); + if (kvStoreDelegateManager == nullptr) { + ZLOGE("Kvstore delegate manager is nullptr."); + return store; + } + kvStoreDelegateManager->GetKvStore(ObjectCommon::OBJECTSTORE_DB_STOREID, option, [&store, this](DistributedDB::DBStatus dbStatus, DistributedDB::KvStoreNbDelegate *kvStoreNbDelegate) { if (dbStatus != DistributedDB::DBStatus::OK) { ZLOGE("GetKvStore fail %{public}d", dbStatus); @@ -910,10 +915,14 @@ void ObjectStoreManager::DoNotifyWaitAssetTimeout(const std::string &objectKey) void ObjectStoreManager::SetData(const std::string &dataDir, const std::string &userId) { ZLOGI("enter, user: %{public}s", userId.c_str()); - kvStoreDelegateManager_ = std::make_shared - (DistributedData::Bootstrap::GetInstance().GetProcessLabel(), userId); + InitKvStoreDelegateManager(userId); DistributedDB::KvStoreConfig kvStoreConfig { dataDir }; - auto status = kvStoreDelegateManager_->SetKvStoreConfig(kvStoreConfig); + auto kvStoreDelegateManager = GetKvStoreDelegateManager(); + if (kvStoreDelegateManager == nullptr) { + ZLOGE("Kvstore delegate manager is nullptr."); + return; + } + auto status = kvStoreDelegateManager->SetKvStoreConfig(kvStoreConfig); if (status != DistributedDB::OK) { ZLOGE("Set kvstore config failed, status: %{public}d", status); return; @@ -923,8 +932,9 @@ void ObjectStoreManager::SetData(const std::string &dataDir, const std::string & int32_t ObjectStoreManager::Open() { - if (kvStoreDelegateManager_ == nullptr) { - ZLOGE("Kvstore delegate manager not init"); + auto kvStoreDelegateManager = GetKvStoreDelegateManager(); + if (kvStoreDelegateManager == nullptr) { + ZLOGE("Kvstore delegate manager is not init"); return OBJECT_INNER_ERROR; } std::unique_lock lock(rwMutex_); @@ -945,11 +955,16 @@ int32_t ObjectStoreManager::Open() void ObjectStoreManager::ForceClose() { + auto kvStoreDelegateManager = GetKvStoreDelegateManager(); + if (kvStoreDelegateManager == nullptr) { + ZLOGE("Kvstore delegate manager is nullptr."); + return; + } std::unique_lock lock(rwMutex_, std::chrono::seconds(LOCK_TIMEOUT)); if (delegate_ == nullptr) { return; } - auto status = kvStoreDelegateManager_->CloseKvStore(delegate_); + auto status = kvStoreDelegateManager->CloseKvStore(delegate_); if (status != DistributedDB::DBStatus::OK) { ZLOGE("CloseKvStore fail %{public}d", status); return; @@ -1007,10 +1022,15 @@ void ObjectStoreManager::FlushClosedStore() ZLOGE("executors_ is nullptr"); return; } + auto kvStoreDelegateManager = GetKvStoreDelegateManager(); + if (kvStoreDelegateManager == nullptr) { + ZLOGE("Kvstore delegate manager nullptr"); + return; + } std::unique_lock lock(rwMutex_); if (!isSyncing_ && syncCount_ == 0 && delegate_ != nullptr) { ZLOGD("close store"); - auto status = kvStoreDelegateManager_->CloseKvStore(delegate_); + auto status = kvStoreDelegateManager->CloseKvStore(delegate_); if (status != DistributedDB::DBStatus::OK) { int timeOut = 1000; executors_->Schedule(std::chrono::milliseconds(timeOut), [this]() { @@ -1565,5 +1585,18 @@ int32_t ObjectStoreManager::AutoLaunchStore() ZLOGI("Auto launch, close after a minute"); return OBJECT_SUCCESS; } + +std::shared_ptr ObjectStoreManager::GetKvStoreDelegateManager() +{ + std::shared_lock lock(rwKvStoreMutex_); + return kvStoreDelegateManager_; +} + +void ObjectStoreManager::InitKvStoreDelegateManager(const std::string &userId) +{ + std::unique_lock lock(rwKvStoreMutex_); + kvStoreDelegateManager_ = std::make_shared( + DistributedData::Bootstrap::GetInstance().GetProcessLabel(), userId); +} } // namespace DistributedObject } // namespace OHOS diff --git a/services/distributeddataservice/service/test/object_manager_test.cpp b/services/distributeddataservice/service/test/object_manager_test.cpp index 17183561d..a7364119f 100644 --- a/services/distributeddataservice/service/test/object_manager_test.cpp +++ b/services/distributeddataservice/service/test/object_manager_test.cpp @@ -686,6 +686,10 @@ HWTEST_F(ObjectManagerTest, FlushClosedStore001, TestSize.Level0) manager.FlushClosedStore(); manager.delegate_ = manager.OpenObjectKvStore(); ASSERT_NE(manager.delegate_, nullptr); + manager.kvStoreDelegateManager_ = nullptr; + manager.FlushClosedStore(); + ASSERT_NE(manager.delegate_, nullptr); + manager.InitKvStoreDelegateManager(userId_); manager.FlushClosedStore(); ASSERT_EQ(manager.delegate_, nullptr); } @@ -703,6 +707,8 @@ HWTEST_F(ObjectManagerTest, Close001, TestSize.Level0) manager.syncCount_ = 1; // test syncCount_ manager.Close(); ASSERT_EQ(manager.syncCount_, 1); // 1 is for testing + std::string dataDir = "/data/app/el2/100/database"; + manager.SetData(dataDir, userId_); manager.delegate_ = manager.OpenObjectKvStore(); manager.Close(); ASSERT_EQ(manager.syncCount_, 0); // 0 is for testing @@ -822,6 +828,8 @@ HWTEST_F(ObjectManagerTest, SplitEntryKey002, TestSize.Level0) HWTEST_F(ObjectManagerTest, ProcessOldEntry001, TestSize.Level0) { auto &manager = ObjectStoreManager::GetInstance(); + std::string dataDir = "/data/app/el2/100/database"; + manager.SetData(dataDir, userId_); manager.delegate_ = manager.OpenObjectKvStore(); std::vector entries; auto status = manager.delegate_->GetEntries(std::vector(appId_.begin(), appId_.end()), entries); @@ -1474,4 +1482,18 @@ HWTEST_F(ObjectManagerTest, GetSnapShots001, TestSize.Level1) EXPECT_EQ(ptr1, ptr2); EXPECT_EQ((*ptr2)["snap1"], snapshot); } + +/** +* @tc.name: SetData001 +* @tc.desc: SetData test. +* @tc.type: FUNC +*/ +HWTEST_F(ObjectManagerTest, SetData001, TestSize.Level1) +{ + auto &manager = ObjectStoreManager::GetInstance(); + std::string dataDir = "/data/app/el2/100/database"; + manager.userId_ = "1000"; + manager.SetData(dataDir, userId_); + EXPECT_EQ(manager.userId_, userId_); +} } // namespace OHOS::Test -- Gitee