From 37167d5bbfe9cf78b6e8373f83385d87680d480b Mon Sep 17 00:00:00 2001 From: jiangminsen Date: Tue, 7 May 2024 19:07:51 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=86=E5=B8=83=E5=BC=8Fdb=E8=B0=83=E6=95=B4?= =?UTF-8?q?db=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: jiangminsen --- .../dbms/include/distributed_data_storage.h | 6 +++ .../dbms/src/distributed_data_storage.cpp | 45 ++++++++++++++++--- 2 files changed, 44 insertions(+), 7 deletions(-) diff --git a/services/dbms/include/distributed_data_storage.h b/services/dbms/include/distributed_data_storage.h index cae44d8..083a80c 100644 --- a/services/dbms/include/distributed_data_storage.h +++ b/services/dbms/include/distributed_data_storage.h @@ -16,6 +16,7 @@ #ifndef FOUNDATION_APPEXECFWK_SERVICES_DBMS_INCLUDE_DISTRIBUTED_DATA_STORAGE_H #define FOUNDATION_APPEXECFWK_SERVICES_DBMS_INCLUDE_DISTRIBUTED_DATA_STORAGE_H +#include #include #include "distributed_bundle_info.h" @@ -56,6 +57,10 @@ private: std::map GetAllOldDistributionBundleInfo( const std::vector &bundleNames); static std::string AnonymizeUdid(const std::string& udid); + void GetEntries(const std::string &networkId, const OHOS::DistributedKv::Key &allEntryKeyPrefix, + std::promise &resultStatusSignal, + std::vector &allEntries); + OHOS::DistributedKv::Status GetResultSatus(std::promise &resultStatusSignal); private: static std::mutex mutex_; static std::shared_ptr instance_; @@ -65,6 +70,7 @@ private: DistributedKv::DistributedKvDataManager dataManager_; std::shared_ptr kvStorePtr_; mutable std::mutex kvStorePtrMutex_; + int32_t waittingTime_ = 180; // 3 mins }; } // namespace AppExecFwk } // namespace OHOS diff --git a/services/dbms/src/distributed_data_storage.cpp b/services/dbms/src/distributed_data_storage.cpp index 7c3379d..0dc4890 100644 --- a/services/dbms/src/distributed_data_storage.cpp +++ b/services/dbms/src/distributed_data_storage.cpp @@ -184,12 +184,18 @@ bool DistributedDataStorage::GetStorageDistributeInfo(const std::string &network APP_LOGI("keyOfData: [%{public}s]", AnonymizeUdid(keyOfData).c_str()); Key key(keyOfData); Value value; - Status status = kvStorePtr_->Get(key, value); - if (status == Status::IPC_ERROR) { - status = kvStorePtr_->Get(key, value); - APP_LOGW("distribute database ipc error and try to call again, result = %{public}d", status); - } + std::promise resultStatusSignal; + kvStorePtr_->Get(key, networkId, + [&value, &resultStatusSignal](Status innerStatus, Value innerValue) { + APP_LOGI("distribute database Get, result = %{public}d", innerStatus); + if (innerStatus == Status::SUCCESS) { + value = innerValue; + } + resultStatusSignal.set_value(innerStatus); + }); + Status status = GetResultSatus(resultStatusSignal); if (status == Status::SUCCESS) { + APP_LOGI("distribute database Get, result = %{public}d", status); if (!info.FromJsonString(value.ToString())) { APP_LOGE("it's an error value"); kvStorePtr_->Delete(key); @@ -201,6 +207,29 @@ bool DistributedDataStorage::GetStorageDistributeInfo(const std::string &network return false; } +Status DistributedDataStorage::GetResultSatus(std::promise &resultStatusSignal) +{ + auto future = resultStatusSignal.get_future(); + if (future.wait_for(std::chrono::seconds(waittingTime_)) == std::future_status::ready) { + Status status = future.get(); + return status; + } + return Status::ERROR; +} + +void DistributedDataStorage::GetEntries(const std::string &networkId, const Key &allEntryKeyPrefix, + std::promise &resultStatusSignal, std::vector &allEntries) +{ + kvStorePtr_->GetEntries(allEntryKeyPrefix, networkId, + [&resultStatusSignal, &allEntries](Status innerStatus, std::vector innerAllEntries) { + APP_LOGI("distribute database GetEntries, result = %{public}d", innerStatus); + if (innerStatus == Status::SUCCESS) { + std::copy(innerAllEntries.begin(), innerAllEntries.end(), std::back_inserter(allEntries)); + } + resultStatusSignal.set_value(innerStatus); + }); +} + int32_t DistributedDataStorage::GetDistributedBundleName(const std::string &networkId, uint32_t accessTokenId, std::string &bundleName) { @@ -223,7 +252,9 @@ int32_t DistributedDataStorage::GetDistributedBundleName(const std::string &netw } Key allEntryKeyPrefix(""); std::vector allEntries; - Status status = kvStorePtr_->GetEntries(allEntryKeyPrefix, allEntries); + std::promise resultStatusSignal; + GetEntries(networkId, allEntryKeyPrefix, resultStatusSignal, allEntries); + Status status = GetResultSatus(resultStatusSignal); if (status != Status::SUCCESS) { APP_LOGE("dataManager_ GetEntries error: %{public}d", status); return ERR_BUNDLE_MANAGER_INTERNAL_ERROR; @@ -292,7 +323,7 @@ Status DistributedDataStorage::GetKvStore() Options options = { .createIfMissing = true, .encrypt = false, - .autoSync = true, + .autoSync = false, .securityLevel = SecurityLevel::S1, .area = EL1, .kvStoreType = KvStoreType::SINGLE_VERSION, -- Gitee