From 22cdb050b93f34ad4457146c9d6214c91f206b38 Mon Sep 17 00:00:00 2001 From: guoyi Date: Sun, 9 Jun 2024 22:41:24 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=8C=89=E9=9C=80?= =?UTF-8?q?=E5=90=8C=E6=AD=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: guoyi --- .../persistenceadapter/kvadapter/kv_adapter.h | 3 -- .../kvadapter/kv_adapter.cpp | 37 +++++++++++-------- 2 files changed, 22 insertions(+), 18 deletions(-) diff --git a/services/core/include/persistenceadapter/kvadapter/kv_adapter.h b/services/core/include/persistenceadapter/kvadapter/kv_adapter.h index c72296f5..c7ff0b7f 100644 --- a/services/core/include/persistenceadapter/kvadapter/kv_adapter.h +++ b/services/core/include/persistenceadapter/kvadapter/kv_adapter.h @@ -16,7 +16,6 @@ #ifndef OHOS_DP_KV_ADAPTER_H #define OHOS_DP_KV_ADAPTER_H -#include #include #include #include @@ -80,8 +79,6 @@ private: std::shared_ptr syncCompletedListener_ = nullptr; std::shared_ptr deathRecipient_ = nullptr; std::mutex kvAdapterMutex_; - std::mutex syncOnDemandMtx_; - std::condition_variable syncOnDemandCond_; std::mutex syncOnDemandUdidSetMtx_; std::unordered_set syncOnDemandUdidSet_; }; diff --git a/services/core/src/persistenceadapter/kvadapter/kv_adapter.cpp b/services/core/src/persistenceadapter/kvadapter/kv_adapter.cpp index 6e6bcdae..e1d39461 100644 --- a/services/core/src/persistenceadapter/kvadapter/kv_adapter.cpp +++ b/services/core/src/persistenceadapter/kvadapter/kv_adapter.cpp @@ -15,6 +15,7 @@ #include "kv_adapter.h" #include +#include #include #include "datetime_ex.h" @@ -34,9 +35,7 @@ namespace { constexpr int32_t INIT_RETRY_SLEEP_INTERVAL = 200 * 1000; // 500ms const std::string DATABASE_DIR = "/data/service/el1/public/database/distributed_device_profile_service"; const std::string TAG = "KVAdapter"; - constexpr uint8_t ASYNC_GET_WAIT_SECONDS = 3; - constexpr bool ASYNC_GET_FINISHED = true; - constexpr bool ASYNC_GET_NO_FINISHED = false; + constexpr int32_t ASYNC_GET_WAIT_MS = 2000; } KVAdapter::KVAdapter(const std::string &appId, const std::string &storeId, @@ -502,9 +501,9 @@ int32_t KVAdapter::SyncOnDemand(const std::string& udid, const std::string& keyP return DP_GET_NETWORKID_BY_UDID_FAIL; } HILOGI("networkId: %{public}s", ProfileUtils::GetAnonyString(networkId).c_str()); - int32_t ret = DP_GET_KV_DB_FAIL; - bool isExeced = ASYNC_GET_NO_FINISHED; - auto call = [this, udid, &isExeced, &ret, &values] (DistributedKv::Status status, + std::promise statusSignal; + std::vector entries; + auto call = [this, udid, &statusSignal, &entries] (DistributedKv::Status status, std::vector&& allEntries) { HILOGI("async GetEntries callback, storeId:%{public}s, udid:%{public}s, status:%{public}d, size:%{public}zu", storeId_.storeId.c_str(), ProfileUtils::GetAnonyString(udid).c_str(), status, allEntries.size()); @@ -512,14 +511,10 @@ int32_t KVAdapter::SyncOnDemand(const std::string& udid, const std::string& keyP std::unique_lock lck(syncOnDemandUdidSetMtx_); syncOnDemandUdidSet_.erase(udid); } - isExeced = ASYNC_GET_FINISHED; if (status == DistributedKv::Status::SUCCESS) { - ret = DP_SUCCESS; - } else { - HILOGE("async GetEntries failed"); + std::copy(allEntries.begin(), allEntries.end(), std::back_inserter(entries)); } - std::unique_lock lck(syncOnDemandMtx_); - syncOnDemandCond_.notify_one(); + statusSignal.set_value(status); }; DistributedKv::Key kvKeyPrefix(keyPrefix); { @@ -532,9 +527,21 @@ int32_t KVAdapter::SyncOnDemand(const std::string& udid, const std::string& keyP storeId_.storeId.c_str(), ProfileUtils::GetAnonyString(udid).c_str()); kvStorePtr_->GetEntries(kvKeyPrefix, networkId, call); } - std::unique_lock lck(syncOnDemandMtx_); - syncOnDemandCond_.wait_for(lck, std::chrono::seconds(ASYNC_GET_WAIT_SECONDS), [& isExeced] {return isExeced;}); - return ret; + DistributedKv::Status status = DistributedKv::Status::SUCCESS; + auto future = statusSignal.get_future(); + if(future.wait_for(std::chrono::milliseconds(ASYNC_GET_WAIT_MS)) == std::future_status::ready) { + status = future.get(); + } + if (status != DistributedKv::Status::SUCCESS) { + HILOGE("async GetEntries error : %{public}d", status); + return DP_GET_KV_DB_FAIL; + } + if (!entries.empty()) { + for (const auto& item : entries) { + values[item.key.ToString()] = item.value.ToString(); + } + } + return DP_SUCCESS; } int32_t KVAdapter::Get(const std::string& udid, const std::string& key, std::string& value) -- Gitee From 48afdbb6e3c454c54d4ed0a61f01fd55b349559e Mon Sep 17 00:00:00 2001 From: guoyi Date: Sun, 9 Jun 2024 22:53:32 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=8C=89=E9=9C=80?= =?UTF-8?q?=E5=90=8C=E6=AD=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: guoyi --- .../persistenceadapter/kvadapter/kv_adapter.h | 2 +- .../kvadapter/kv_adapter.cpp | 65 ++++++++++++------- 2 files changed, 44 insertions(+), 23 deletions(-) diff --git a/services/core/include/persistenceadapter/kvadapter/kv_adapter.h b/services/core/include/persistenceadapter/kvadapter/kv_adapter.h index c7ff0b7f..c3165956 100644 --- a/services/core/include/persistenceadapter/kvadapter/kv_adapter.h +++ b/services/core/include/persistenceadapter/kvadapter/kv_adapter.h @@ -67,7 +67,7 @@ private: int32_t UnRegisterDeathListener(); int32_t DeleteDeathListener(); int32_t SyncOnDemand(const std::string& udid, const std::string& keyPrefix, - std::map& values); + std::vector& entries); private: DistributedKv::AppId appId_; diff --git a/services/core/src/persistenceadapter/kvadapter/kv_adapter.cpp b/services/core/src/persistenceadapter/kvadapter/kv_adapter.cpp index e1d39461..178bd483 100644 --- a/services/core/src/persistenceadapter/kvadapter/kv_adapter.cpp +++ b/services/core/src/persistenceadapter/kvadapter/kv_adapter.cpp @@ -484,16 +484,31 @@ int32_t KVAdapter::GetByPrefix(const std::string& udid, const std::string& keyPr } syncOnDemandUdidSet_.insert(udid); } - int32_t ret = SyncOnDemand(udid, keyPrefix, values); + std::vector entries; + int32_t ret = SyncOnDemand(udid, keyPrefix, entries); + { + std::unique_lock lck(syncOnDemandUdidSetMtx_); + syncOnDemandUdidSet_.erase(udid); + } if (ret != DP_SUCCESS) { HILOGE("SyncOnDemand fail, ret: %{public}d", ret); return ret; } - return GetByPrefix(keyPrefix, values); + if (!entries.empty()) { + for (const auto& item : entries) { + std::string dbKey = item.key.ToString(); + std::string dbValue = item.value.ToString(); + if (dbKey.find(udid) == std::string::npos) { + continue; + } + values[dbKey] = dbValue; + } + } + return DP_SUCCESS; } int32_t KVAdapter::SyncOnDemand(const std::string& udid, const std::string& keyPrefix, - std::map& values) + std::vector& entries) { std::string networkId = ""; if (ProfileCache::GetInstance().GetNetWorkIdByUdid(udid, networkId) != DP_SUCCESS) { @@ -501,16 +516,12 @@ int32_t KVAdapter::SyncOnDemand(const std::string& udid, const std::string& keyP return DP_GET_NETWORKID_BY_UDID_FAIL; } HILOGI("networkId: %{public}s", ProfileUtils::GetAnonyString(networkId).c_str()); - std::promise statusSignal; - std::vector entries; - auto call = [this, udid, &statusSignal, &entries] (DistributedKv::Status status, + std::promise statusSignal; + auto storeId = storeId_.storeId; + auto call = [storeId, udid, &statusSignal, &entries] (DistributedKv::Status status, std::vector&& allEntries) { HILOGI("async GetEntries callback, storeId:%{public}s, udid:%{public}s, status:%{public}d, size:%{public}zu", - storeId_.storeId.c_str(), ProfileUtils::GetAnonyString(udid).c_str(), status, allEntries.size()); - { - std::unique_lock lck(syncOnDemandUdidSetMtx_); - syncOnDemandUdidSet_.erase(udid); - } + storeId.c_str(), ProfileUtils::GetAnonyString(udid).c_str(), status, allEntries.size()); if (status == DistributedKv::Status::SUCCESS) { std::copy(allEntries.begin(), allEntries.end(), std::back_inserter(entries)); } @@ -527,20 +538,15 @@ int32_t KVAdapter::SyncOnDemand(const std::string& udid, const std::string& keyP storeId_.storeId.c_str(), ProfileUtils::GetAnonyString(udid).c_str()); kvStorePtr_->GetEntries(kvKeyPrefix, networkId, call); } - DistributedKv::Status status = DistributedKv::Status::SUCCESS; + DistributedKv::Status status = DistributedKv::Status::ERROR; auto future = statusSignal.get_future(); - if(future.wait_for(std::chrono::milliseconds(ASYNC_GET_WAIT_MS)) == std::future_status::ready) { + if (future.wait_for(std::chrono::milliseconds(ASYNC_GET_WAIT_MS)) == std::future_status::ready) { status = future.get(); } if (status != DistributedKv::Status::SUCCESS) { - HILOGE("async GetEntries error : %{public}d", status); + HILOGE("async GetEntries error: %{public}d", status); return DP_GET_KV_DB_FAIL; } - if (!entries.empty()) { - for (const auto& item : entries) { - values[item.key.ToString()] = item.value.ToString(); - } - } return DP_SUCCESS; } @@ -561,13 +567,28 @@ int32_t KVAdapter::Get(const std::string& udid, const std::string& key, std::str } syncOnDemandUdidSet_.insert(udid); } - std::map values; - int32_t ret = SyncOnDemand(udid, key, values); + std::vector entries; + int32_t ret = SyncOnDemand(udid, key, entries); + { + std::unique_lock lck(syncOnDemandUdidSetMtx_); + syncOnDemandUdidSet_.erase(udid); + } if (ret != DP_SUCCESS) { HILOGE("SyncOnDemand fail, ret: %{public}d", ret); return ret; } - return Get(key, value); + if (!entries.empty()) { + for (const auto& item : entries) { + std::string dbKey = item.key.ToString(); + std::string dbValue = item.value.ToString(); + if (dbKey.find(udid) == std::string::npos) { + continue; + } + value = dbValue; + break; + } + } + return DP_SUCCESS; } } // namespace DeviceProfile } // namespace OHOS -- Gitee