From 9b71255ba5815e815a35cfe8ce54027515f5610e Mon Sep 17 00:00:00 2001 From: jiangminsen Date: Thu, 11 Jul 2024 21:35:01 +0800 Subject: [PATCH] =?UTF-8?q?db=E5=BC=82=E6=AD=A5=E9=9C=80=E8=A6=81=E7=9B=91?= =?UTF-8?q?=E5=90=AC=E5=9B=9E=E8=B0=83=E7=BB=93=E6=9E=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: jiangminsen --- services/dbms/include/dbms_device_manager.h | 1 + services/dbms/include/distributed_bms.h | 1 + .../dbms/include/distributed_data_storage.h | 21 +++- services/dbms/src/dbms_device_manager.cpp | 14 +++ services/dbms/src/distributed_bms.cpp | 9 ++ .../dbms/src/distributed_data_storage.cpp | 109 +++++++++++++++--- 6 files changed, 138 insertions(+), 17 deletions(-) diff --git a/services/dbms/include/dbms_device_manager.h b/services/dbms/include/dbms_device_manager.h index b0fb715..086d233 100644 --- a/services/dbms/include/dbms_device_manager.h +++ b/services/dbms/include/dbms_device_manager.h @@ -29,6 +29,7 @@ class DbmsDeviceManager { public: DbmsDeviceManager(); int32_t GetUdidByNetworkId(const std::string &netWorkId, std::string &udid); + int32_t GetUuidByNetworkId(const std::string &netWorkId, std::string &uuid); private: bool InitDeviceManager(); diff --git a/services/dbms/include/distributed_bms.h b/services/dbms/include/distributed_bms.h index ac3d23b..145c18c 100644 --- a/services/dbms/include/distributed_bms.h +++ b/services/dbms/include/distributed_bms.h @@ -126,6 +126,7 @@ public: std::string &bundleName) override; int32_t GetUdidByNetworkId(const std::string &networkId, std::string &udid); + int32_t GetUuidByNetworkId(const std::string &netWorkId, std::string &uuid); /** * @brief Start the bundle manager service. diff --git a/services/dbms/include/distributed_data_storage.h b/services/dbms/include/distributed_data_storage.h index 0e18d5d..760b519 100644 --- a/services/dbms/include/distributed_data_storage.h +++ b/services/dbms/include/distributed_data_storage.h @@ -23,6 +23,7 @@ #include "bundle_constants.h" #include "bundle_info.h" #include "distributed_kv_data_manager.h" +#include namespace OHOS { namespace AppExecFwk { @@ -31,6 +32,21 @@ namespace { static const char* APP_ID = "bundle_manager_service"; static const char* DISTRIBUTE_DATA_STORE_ID = "distribute_bundle_datas"; } + +class DistributedDataStorageCallback : public OHOS::DistributedKv::KvStoreSyncCallback { +public: + DistributedDataStorageCallback(); + virtual ~DistributedDataStorageCallback(); + void SyncCompleted(const std::map &result) override; + void setUuid(const std::string udid); + DistributedKv::Status GetResultCode(); +private: + std::promise resultStatusSignal_; + bool isSetValue_ = false; + std::mutex setVauleMutex_; + std::string uuid_; +}; + class DistributedDataStorage { public: DistributedDataStorage(); @@ -44,6 +60,7 @@ public: int32_t GetDistributedBundleName(const std::string &networkId, uint32_t accessTokenId, std::string &bundleName); void UpdateDistributedData(int32_t userId); + static std::string AnonymizeUdid(const std::string& udid); private: std::string DeviceAndNameToKey(const std::string &udid, const std::string &bundleName) const; @@ -53,11 +70,11 @@ private: bool GetLocalUdid(std::string &udid); DistributedBundleInfo ConvertToDistributedBundleInfo(const BundleInfo &bundleInfo); int32_t GetUdidByNetworkId(const std::string &networkId, std::string &udid); + int32_t GetUuidByNetworkId(const std::string &netWorkId, std::string &uuid); bool InnerSaveStorageDistributeInfo(const DistributedBundleInfo &distributedBundleInfo); std::map GetAllOldDistributionBundleInfo( const std::vector &bundleNames); - static std::string AnonymizeUdid(const std::string& udid); - void Sync(const std::string &udid); + bool SyncAndCompleted(const std::string &udid, const std::string &networkId); private: static std::mutex mutex_; static std::shared_ptr instance_; diff --git a/services/dbms/src/dbms_device_manager.cpp b/services/dbms/src/dbms_device_manager.cpp index 5ec3e85..4a31474 100644 --- a/services/dbms/src/dbms_device_manager.cpp +++ b/services/dbms/src/dbms_device_manager.cpp @@ -67,5 +67,19 @@ int32_t DbmsDeviceManager::GetUdidByNetworkId(const std::string &netWorkId, std: return DistributedHardware::DeviceManager::GetInstance().GetUdidByNetworkId( DISTRIBUTED_BUNDLE_NAME, netWorkId, udid); } + +int32_t DbmsDeviceManager::GetUuidByNetworkId(const std::string &netWorkId, std::string &uuid) +{ + APP_LOGI("GetUuidByNetworkId"); + if (!InitDeviceManager()) { + return -1; + } + int32_t errCode = DistributedHardware::DeviceManager::GetInstance() + .GetUuidByNetworkId(DISTRIBUTED_BUNDLE_NAME, netWorkId, uuid); + if (errCode != ERR_OK) { + APP_LOGE("GetUuidByNetworkId errCode = %{public}d", errCode); + } + return errCode; +} } } \ No newline at end of file diff --git a/services/dbms/src/distributed_bms.cpp b/services/dbms/src/distributed_bms.cpp index f7dd7f0..1b11085 100644 --- a/services/dbms/src/distributed_bms.cpp +++ b/services/dbms/src/distributed_bms.cpp @@ -203,6 +203,15 @@ int32_t DistributedBms::GetUdidByNetworkId(const std::string &networkId, std::st return dbmsDeviceManager_->GetUdidByNetworkId(networkId, udid); } +int32_t DistributedBms::GetUuidByNetworkId(const std::string &networkId, std::string &uuid) +{ + if (dbmsDeviceManager_ == nullptr) { + APP_LOGI("deviceManager_ is nullptr"); + InitDeviceManager(); + } + return dbmsDeviceManager_->GetUuidByNetworkId(networkId, uuid); +} + static OHOS::sptr GetDistributedBundleMgr(const std::string &deviceId) { auto samgr = OHOS::SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager(); diff --git a/services/dbms/src/distributed_data_storage.cpp b/services/dbms/src/distributed_data_storage.cpp index 2a38fa8..bbb411f 100644 --- a/services/dbms/src/distributed_data_storage.cpp +++ b/services/dbms/src/distributed_data_storage.cpp @@ -31,8 +31,8 @@ namespace { const std::string BMS_KV_BASE_DIR = "/data/service/el1/public/database/"; const int32_t EL1 = 1; const int32_t START_INDEX = 0; +const int32_t MINIMUM_WAITING_TIME = 180; //3 mins const int32_t MAX_TIMES = 600; // 1min -const int32_t UDID_LENGTH = 64; // the length of udid const int32_t PRINTF_LENGTH = 8; // print length of udid const int32_t SLEEP_INTERVAL = 100 * 1000; // 100ms const int32_t FLAGS = BundleFlag::GET_BUNDLE_WITH_ABILITIES | @@ -180,7 +180,11 @@ bool DistributedDataStorage::GetStorageDistributeInfo(const std::string &network APP_LOGI("can not get udid by networkId error:%{public}d", ret); return false; } - Sync(udid); + bool resBool = SyncAndCompleted(udid, networkId); + if (!resBool) { + APP_LOGE("SyncAndCompleted failed"); + return false; + } std::string keyOfData = DeviceAndNameToKey(udid, bundleName); APP_LOGI("keyOfData: [%{public}s]", AnonymizeUdid(keyOfData).c_str()); Key key(keyOfData); @@ -222,7 +226,11 @@ int32_t DistributedDataStorage::GetDistributedBundleName(const std::string &netw APP_LOGE("get udid is Empty"); return ERR_BUNDLE_MANAGER_INTERNAL_ERROR; } - Sync(udid); + bool resBool = SyncAndCompleted(udid, networkId); + if (!resBool) { + APP_LOGE("SyncAndCompleted failed"); + return ERR_BUNDLE_MANAGER_INTERNAL_ERROR; + } Key allEntryKeyPrefix(""); std::vector allEntries; Status status = kvStorePtr_->GetEntries(allEntryKeyPrefix, allEntries); @@ -230,13 +238,9 @@ int32_t DistributedDataStorage::GetDistributedBundleName(const std::string &netw APP_LOGE("dataManager_ GetEntries error: %{public}d", status); return ERR_BUNDLE_MANAGER_INTERNAL_ERROR; } - std::set udidSet; for (auto entry : allEntries) { std::string key = entry.key.ToString(); std::string value = entry.value.ToString(); - if (key.length() > UDID_LENGTH) { - udidSet.insert(key.substr(START_INDEX, UDID_LENGTH)); - } if (key.find(udid) == std::string::npos) { continue; } @@ -248,9 +252,6 @@ int32_t DistributedDataStorage::GetDistributedBundleName(const std::string &netw } APP_LOGE("get distributed bundleName no matching data: %{private}s %{private}s %{private}d", networkId.c_str(), udid.c_str(), accessTokenId); - for (std::string udidItem : udidSet) { - APP_LOGW("dbms db has keyItem :%{public}s", AnonymizeUdid(udidItem).c_str()); - } return ERR_BUNDLE_MANAGER_BUNDLE_NOT_EXIST; } @@ -289,25 +290,46 @@ bool DistributedDataStorage::CheckKvStore() return kvStorePtr_ != nullptr; } -void DistributedDataStorage::Sync(const std::string &udid) +bool DistributedDataStorage::SyncAndCompleted(const std::string &udid, const std::string &networkId) { std::string localUdid; bool ret = GetLocalUdid(localUdid); if (!ret) { APP_LOGE("GetLocalUdid error"); - return; + return false; } if (udid == localUdid) { APP_LOGE("query db of local udid"); - return; + return false; + } + std::string uuid; + int32_t result = GetUuidByNetworkId(networkId, uuid); + if (result != 0) { + APP_LOGE("can not get uuid by networkId error:%{public}d", ret); + return false; } + if (udid.size() == 0) { + APP_LOGE("get uuid is Empty"); + return false; + } + DistributedKv::DataQuery dataQuery; + dataQuery.KeyPrefix(udid); std::vector networkIdList = {udid}; - Status status = kvStorePtr_->Sync(networkIdList, DistributedKv::SyncMode::PUSH_PULL); + std::shared_ptr syncCallback = std::make_shared(); + syncCallback->setUuid(uuid); + Status status = kvStorePtr_->Sync(networkIdList, DistributedKv::SyncMode::PUSH_PULL, dataQuery, syncCallback); if (status != Status::SUCCESS) { APP_LOGE("distribute database start sync data: %{public}d", status); - return ; + return false; } APP_LOGI("distribute database start sync data success"); + Status statusResult = syncCallback->GetResultCode(); + if (statusResult != Status::SUCCESS) { + APP_LOGE("distribute database syncCompleted status: %{public}d", statusResult); + return false; + } + APP_LOGI("distribute database start sync data syncCompleted success"); + return true; } Status DistributedDataStorage::GetKvStore() @@ -361,6 +383,16 @@ int32_t DistributedDataStorage::GetUdidByNetworkId(const std::string &networkId, return dbms->GetUdidByNetworkId(networkId, udid); } +int32_t DistributedDataStorage::GetUuidByNetworkId(const std::string &networkId, std::string &uuid) +{ + auto dbms = DelayedSingleton::GetInstance(); + if (dbms == nullptr) { + APP_LOGE("dbms is null"); + return Constants::INVALID_UDID; + } + return dbms->GetUuidByNetworkId(networkId, uuid); +} + DistributedBundleInfo DistributedDataStorage::ConvertToDistributedBundleInfo(const BundleInfo &bundleInfo) { DistributedBundleInfo distributedBundleInfo; @@ -479,5 +511,52 @@ std::map DistributedDataStorage::GetAllOldDi } return oldDistributedBundleInfos; } + +DistributedDataStorageCallback::DistributedDataStorageCallback() +{ + APP_LOGD("create dbms callback instance"); +} + +DistributedDataStorageCallback::~DistributedDataStorageCallback() +{ + APP_LOGD("destroy dbms callback instance"); +} + +void DistributedDataStorageCallback::SyncCompleted(const std::map &result) +{ + APP_LOGD("kvstore sync completed."); + if (result.find(uuid_) == result.end()) { + APP_LOGW("SyncCompleted uuid %{public}s no result", + OHOS::AppExecFwk::DistributedDataStorage::AnonymizeUdid(uuid_).c_str()); + return; + } + DistributedKv::Status status = result.at(uuid_); + APP_LOGI("SyncCompleted uuid %{public}s result %{public}d", + OHOS::AppExecFwk::DistributedDataStorage::AnonymizeUdid(uuid_).c_str(), status); + std::lock_guard lock(setVauleMutex_); + if (!isSetValue_) { + isSetValue_ = true; + resultStatusSignal_.set_value(status); + } else { + APP_LOGW("resultStatusSignal_ is set"); + } +} + +void DistributedDataStorageCallback::setUuid(const std::string uuid) +{ + uuid_ = uuid; +} + +DistributedKv::Status DistributedDataStorageCallback::GetResultCode() +{ + auto future = resultStatusSignal_.get_future(); + if (future.wait_for(std::chrono::seconds(MINIMUM_WAITING_TIME)) == std::future_status::ready) { + DistributedKv::Status status = future.get(); + APP_LOGI("GetResultCode status %{public}d", status); + return status; + } + APP_LOGW("GetResultCode time out"); + return Status::TIME_OUT; +} } // namespace AppExecFwk } // namespace OHOS \ No newline at end of file -- Gitee