diff --git a/services/distributeddataservice/app/src/installer/installer_impl.cpp b/services/distributeddataservice/app/src/installer/installer_impl.cpp index 6977b3ab9b2e3d74a184795f674f179edab58c39..25345a519d3632d61b9c9c852e710222de34c443 100644 --- a/services/distributeddataservice/app/src/installer/installer_impl.cpp +++ b/services/distributeddataservice/app/src/installer/installer_impl.cpp @@ -83,9 +83,9 @@ void InstallEventSubscriber::OnUninstall(const std::string &bundleName, int32_t } for (auto &meta : storeMetaData) { if (meta.instanceId == appIndex && !meta.appId.empty() && !meta.storeId.empty()) { - ZLOGI("uninstalled bundleName:%{public}s storeId:%{public}s, userId:%{public}d, appIndex:%{public}d", - bundleName.c_str(), Anonymous::Change(meta.storeId).c_str(), userId, appIndex); - MetaDataManager::GetInstance().DelMeta(meta.GetKey()); + ZLOGI("storeMetaData uninstalled bundleName:%{public}s storeId:%{public}s, userId:%{public}d, " + "appIndex:%{public}d", bundleName.c_str(), Anonymous::Change(meta.storeId).c_str(), userId, appIndex); + MetaDataManager::GetInstance().DelMeta(meta.GetKeyWithoutPath()); MetaDataManager::GetInstance().DelMeta(meta.GetKey(), true); MetaDataManager::GetInstance().DelMeta(meta.GetKeyLocal(), true); MetaDataManager::GetInstance().DelMeta(meta.GetSecretKey(), true); @@ -99,6 +99,24 @@ void InstallEventSubscriber::OnUninstall(const std::string &bundleName, int32_t PermitDelegate::GetInstance().DelCache(meta.GetKey()); } } + + // 删除映射表 + prefix = StoreMetaMapping::GetPrefix( + { DeviceManagerAdapter::GetInstance().GetLocalDevice().uuid, std::to_string(userId), "default", bundleName }); + std::vector storeMetaMapping; + if (!MetaDataManager::GetInstance().LoadMeta(prefix, storeMetaMapping, true)) { + ZLOGE("load meta failed! bundleName:%{public}s, userId:%{public}d, appIndex:%{public}d", bundleName.c_str(), + userId, appIndex); + return; + } + for (auto &meta : storeMetaMapping) { + if (meta.instanceId == appIndex && !meta.appId.empty() && !meta.storeId.empty()) { + ZLOGI("StoreMetaMappinguninstalled bundleName:%{public}s storeId:%{public}s, userId:%{public}d, " + "appIndex:%{public}d", + bundleName.c_str(), Anonymous::Change(meta.storeId).c_str(), userId, appIndex); + MetaDataManager::GetInstance().DelMeta(meta.GetKey(), true); + } + } } void InstallEventSubscriber::OnUpdate(const std::string &bundleName, int32_t userId, int32_t appIndex) diff --git a/services/distributeddataservice/app/src/kvstore_data_service.cpp b/services/distributeddataservice/app/src/kvstore_data_service.cpp index 2a7af16e452e06c11abdff714a2232e3be48902b..5ba40e7da6d5d8df6dbae76cb92623f1a3f984f4 100644 --- a/services/distributeddataservice/app/src/kvstore_data_service.cpp +++ b/services/distributeddataservice/app/src/kvstore_data_service.cpp @@ -12,6 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +#include "metadata/store_meta_data.h" #define LOG_TAG "KvStoreDataService" #include "kvstore_data_service.h" @@ -145,7 +146,7 @@ void KvStoreDataService::Initialize() meta.storeId = info.storeId; meta.user = info.userId; meta.deviceId = DmAdapter::GetInstance().GetLocalDevice().uuid; - MetaDataManager::GetInstance().LoadMeta(meta.GetKey(), meta, true); + MetaDataManager::GetInstance().LoadMeta(meta.GetKeyLocalWithoutPath(), meta, true); std::string uuid; if (OHOS::Security::AccessToken::AccessTokenKit::GetTokenTypeFlag(meta.tokenId) == OHOS::Security::AccessToken::TOKEN_HAP) { @@ -910,8 +911,9 @@ void KvStoreDataService::AccountEventChanged(const AccountEventInfo &eventInfo) if (meta.user != eventInfo.userId) { continue; } - ZLOGI("bundleName:%{public}s, user:%{public}s", meta.bundleName.c_str(), meta.user.c_str()); - MetaDataManager::GetInstance().DelMeta(meta.GetKey()); + ZLOGI("StoreMetaData bundleName:%{public}s, user:%{public}s", meta.bundleName.c_str(), + meta.user.c_str()); + MetaDataManager::GetInstance().DelMeta(meta.GetKeyWithoutPath()); MetaDataManager::GetInstance().DelMeta(meta.GetKey(), true); MetaDataManager::GetInstance().DelMeta(meta.GetKeyLocal(), true); MetaDataManager::GetInstance().DelMeta(meta.GetSecretKey(), true); @@ -924,6 +926,16 @@ void KvStoreDataService::AccountEventChanged(const AccountEventInfo &eventInfo) MetaDataManager::GetInstance().DelMeta(meta.GetCloneSecretKey(), true); PermitDelegate::GetInstance().DelCache(meta.GetKey()); } + std::vector metaMapping; + MetaDataManager::GetInstance().LoadMeta(StoreMetaMapping::GetPrefix({""}), metaMapping, true); + for (const auto &meta : metaMapping) { + if (meta.user != eventInfo.userId) { + continue; + } + ZLOGI("StoreMetaMapping bundleName:%{public}s, user:%{public}s", meta.bundleName.c_str(), + meta.user.c_str()); + MetaDataManager::GetInstance().DelMeta(meta.GetKey(), true); + } g_kvStoreAccountEventStatus = 0; break; } @@ -1110,8 +1122,8 @@ int32_t KvStoreDataService::ClearAppStorage(const std::string &bundleName, int32 for (auto &meta : metaData) { if (meta.instanceId == appIndex && !meta.appId.empty() && !meta.storeId.empty()) { - ZLOGI("data cleared bundleName:%{public}s, stordId:%{public}s, appIndex:%{public}d", bundleName.c_str(), - Anonymous::Change(meta.storeId).c_str(), appIndex); + ZLOGI("StoreMetaData data cleared bundleName:%{public}s, stordId:%{public}s, appIndex:%{public}d", + bundleName.c_str(), Anonymous::Change(meta.storeId).c_str(), appIndex); MetaDataManager::GetInstance().DelMeta(meta.GetKey()); MetaDataManager::GetInstance().DelMeta(meta.GetKey(), true); MetaDataManager::GetInstance().DelMeta(meta.GetKeyLocal(), true); @@ -1125,6 +1137,22 @@ int32_t KvStoreDataService::ClearAppStorage(const std::string &bundleName, int32 PermitDelegate::GetInstance().DelCache(meta.GetKey()); } } + std::vector storeMetaMapping; + prefix = StoreMetaMapping::GetPrefix( + { DeviceManagerAdapter::GetInstance().GetLocalDevice().uuid, std::to_string(userId), "default", bundleName }); + if (!MetaDataManager::GetInstance().LoadMeta(prefix, storeMetaMapping, true)) { + ZLOGE("Clear data load meta failed, bundleName:%{public}s, user:%{public}d, appIndex:%{public}d", + bundleName.c_str(), userId, appIndex); + return ERROR; + } + + for (auto &meta : storeMetaMapping) { + if (meta.instanceId == appIndex && !meta.appId.empty() && !meta.storeId.empty()) { + ZLOGI("StoreMetaMapping data cleared bundleName:%{public}s, stordId:%{public}s, appIndex:%{public}d", + bundleName.c_str(), Anonymous::Change(meta.storeId).c_str(), appIndex); + MetaDataManager::GetInstance().DelMeta(meta.GetKey(), true); + } + } return SUCCESS; } diff --git a/services/distributeddataservice/app/src/kvstore_meta_manager.cpp b/services/distributeddataservice/app/src/kvstore_meta_manager.cpp index 9c8013f8b7cf3fb41283ff9553fdd1619269b1ff..8a2bb612fc52571db460da308b5ec9c3e24fb3ef 100644 --- a/services/distributeddataservice/app/src/kvstore_meta_manager.cpp +++ b/services/distributeddataservice/app/src/kvstore_meta_manager.cpp @@ -143,7 +143,6 @@ void KvStoreMetaManager::InitMetaData() return; } - CheckMetaDeviceId(); auto uid = getuid(); auto tokenId = IPCSkeleton::GetCallingTokenID(); auto userId = AccountDelegate::GetInstance()->GetUserByToken(tokenId); @@ -175,36 +174,96 @@ void KvStoreMetaManager::InitMetaData() localData.dataDir = metaDBDirectory_; localData.schema = ""; localData.isPublic = true; - if (!(MetaDataManager::GetInstance().SaveMeta(data.GetKey(), data) && + if (!(MetaDataManager::GetInstance().SaveMeta(data.GetKeyLocalWithoutPath(), data) && MetaDataManager::GetInstance().SaveMeta(data.GetKey(), data, true) && MetaDataManager::GetInstance().SaveMeta(data.GetKeyLocal(), localData, true))) { ZLOGE("save meta fail"); } - UpdateMetaData(); + std::string localUuid; + DeviceMetaData deviceMeta; + if (MetaDataManager::GetInstance().LoadMeta(deviceMeta.GetKey(), deviceMeta, true)) { + localUuid = deviceMeta.uuid; + } else { + localUuid = DmAdapter::GetInstance().GetLocalDevice().uuid; + } + if (localUuid.empty()) { + ZLOGE("get uuid failed"); + return; + } + UpdateMetaData(localUuid); + CheckMetaDeviceId(); SetCloudSyncer(); ZLOGI("end."); } -void KvStoreMetaManager::UpdateMetaData() +void KvStoreMetaManager::UpdateMetaData(const std::string &uuid) { VersionMetaData versionMeta; - if (!MetaDataManager::GetInstance().LoadMeta(versionMeta.GetKey(), versionMeta, true) - || versionMeta.version < META_VERSION) { + bool isExist = MetaDataManager::GetInstance().LoadMeta(versionMeta.GetKey(), versionMeta, true); + if (isExist && versionMeta.version == VersionMetaData::CURRENT_VERSION) { + return; + } + bool syncMetaUpdateNeeded = !isExist || versionMeta.version < VersionMetaData::UPDATE_SYNC_META_VERSION; + bool storeMetaUpdateNeeded = !isExist || versionMeta.version < VersionMetaData::UPDATE_STORE_META_KEY_VERSION; + if (syncMetaUpdateNeeded) { std::vector metaDataList; - std::string prefix = StoreMetaData::GetPrefix({ DmAdapter::GetInstance().GetLocalDevice().uuid }); + std::string prefix = StoreMetaData::GetPrefix({ uuid }); MetaDataManager::GetInstance().LoadMeta(prefix, metaDataList); - for (auto metaData : metaDataList) { + std::vector keys; + for (const auto &metaData : metaDataList) { MetaDataManager::GetInstance().SaveMeta(metaData.GetKey(), metaData, true); if (CheckerManager::GetInstance().IsDistrust(Converter::ConvertToStoreInfo(metaData)) || - (metaData.storeType >= StoreMetaData::StoreType::STORE_RELATIONAL_BEGIN - && metaData.storeType <= StoreMetaData::StoreType::STORE_RELATIONAL_END)) { - MetaDataManager::GetInstance().DelMeta(metaData.GetKey()); + (metaData.storeType >= StoreMetaData::StoreType::STORE_RELATIONAL_BEGIN && + metaData.storeType <= StoreMetaData::StoreType::STORE_RELATIONAL_END)) { + keys.push_back(metaData.GetKey()); } } + MetaDataManager::GetInstance().DelMeta(keys); + } + if (storeMetaUpdateNeeded) { + UpdateStoreMeta(); + } + + versionMeta.version = VersionMetaData::CURRENT_VERSION; + MetaDataManager::GetInstance().SaveMeta(versionMeta.GetKey(), versionMeta, true); +} + +void KvStoreMetaManager::UpdateStoreMeta() const +{ + std::vector metaDataList; + std::vector entries; + std::vector deleteKeys; + std::vector metaMetaList; + std::string prefix = StoreMetaData::GetPrefix({ DmAdapter::GetInstance().GetLocalDevice().uuid }); + MetaDataManager::GetInstance().LoadMeta(prefix, metaDataList, true); + std::vector localMetaList; + localMetaList.reserve(metaDataList.size()); + std::vector secretKeyMetaList; + secretKeyMetaList.reserve(metaDataList.size()); + for (const auto &meta : metaDataList) { + StoreMetaDataLocal localMeta; + bool isExist = MetaDataManager::GetInstance().LoadMeta(meta.GetKeyLocalWithoutPath(), localMeta, true); + if (isExist) { + localMetaList.push_back(std::move(localMeta)); + deleteKeys.push_back(meta.GetKeyLocalWithoutPath()); + entries.push_back({ meta.GetKeyLocal(), localMetaList[localMetaList.size() - 1] }); + } + + SecretKeyMetaData secretKeyMetaData; + isExist = MetaDataManager::GetInstance().LoadMeta(meta.GetSecretKeyWithoutPath(), secretKeyMetaData, true); + if (isExist) { + secretKeyMetaList.push_back(std::move(secretKeyMetaData)); + deleteKeys.push_back(meta.GetSecretKeyWithoutPath()); + entries.push_back({ meta.GetSecretKey(), secretKeyMetaList[secretKeyMetaList.size() - 1] }); + } + StoreMetaMapping storeMetaMapping(meta); + auto key = storeMetaMapping.GetKey(); + metaMetaList.push_back(std::move(storeMetaMapping)); + entries.push_back({ std::move(key), metaMetaList[metaMetaList.size() - 1] }); + entries.push_back({ meta.GetKey(), meta }); } - if (versionMeta.version != VersionMetaData::CURRENT_VERSION) { - versionMeta.version = VersionMetaData::CURRENT_VERSION; - MetaDataManager::GetInstance().SaveMeta(versionMeta.GetKey(), versionMeta, true); + if (MetaDataManager::GetInstance().SaveMeta(entries, true)) { + MetaDataManager::GetInstance().DelMeta(deleteKeys, true); } } @@ -573,18 +632,17 @@ void KvStoreMetaManager::CheckMetaDeviceId() return; } if (!MetaDataManager::GetInstance().LoadMeta(deviceMeta.GetKey(), deviceMeta, true)) { - deviceMeta.newUuid = localUuid; + deviceMeta.uuid = localUuid; MetaDataManager::GetInstance().SaveMeta(deviceMeta.GetKey(), deviceMeta, true); return; } - if (deviceMeta.newUuid != localUuid) { - UpdateStoreMetaData(localUuid, deviceMeta.newUuid); - UpdateMetaDatas(localUuid, deviceMeta.newUuid); - deviceMeta.oldUuid = deviceMeta.newUuid; - deviceMeta.newUuid = localUuid; + if (deviceMeta.uuid != localUuid) { + UpdateStoreMetaData(localUuid, deviceMeta.uuid); + UpdateMetaDatas(localUuid, deviceMeta.uuid); + ZLOGI("meta changed! cur uuid:%{public}s, old uuid:%{public}s", Anonymous::Change(localUuid).c_str(), + Anonymous::Change(deviceMeta.uuid).c_str()); + deviceMeta.uuid = localUuid; MetaDataManager::GetInstance().SaveMeta(deviceMeta.GetKey(), deviceMeta, true); - ZLOGI("meta changed! curruuid:%{public}s, olduuid:%{public}s", Anonymous::Change(deviceMeta.newUuid).c_str(), - Anonymous::Change(deviceMeta.oldUuid).c_str()); } } @@ -600,10 +658,10 @@ void KvStoreMetaManager::UpdateStoreMetaData(const std::string &newUuid, const s MetaDataManager::GetInstance().DelMeta(oldMeta.GetKey(), true); StoreMetaData syncStoreMeta; - if (MetaDataManager::GetInstance().LoadMeta(oldMeta.GetKey(), syncStoreMeta)) { + if (MetaDataManager::GetInstance().LoadMeta(oldMeta.GetKeyWithoutPath(), syncStoreMeta)) { syncStoreMeta.deviceId = newUuid; - MetaDataManager::GetInstance().SaveMeta(storeMeta.GetKey(), syncStoreMeta); - MetaDataManager::GetInstance().DelMeta(oldMeta.GetKey()); + MetaDataManager::GetInstance().SaveMeta(storeMeta.GetKeyWithoutPath(), syncStoreMeta); + MetaDataManager::GetInstance().DelMeta(oldMeta.GetKeyWithoutPath()); } StrategyMeta strategyMeta; @@ -634,6 +692,16 @@ void KvStoreMetaManager::UpdateStoreMetaData(const std::string &newUuid, const s MetaDataManager::GetInstance().DelMeta(storeMeta.GetSecretKey(), true); MetaDataManager::GetInstance().DelMeta(storeMeta.GetCloneSecretKey(), true); } + MetaDataManager::GetInstance().DelMeta(oldMeta.GetDebugInfoKey(), true); + MetaDataManager::GetInstance().DelMeta(oldMeta.GetDfxInfoKey(), true); + } + std::vector storeMetaMappings; + MetaDataManager::GetInstance().LoadMeta(StoreMetaMapping::GetPrefix({ oldUuid }), storeMetaMappings, true); + for (auto &meta : storeMetaMappings) { + auto oldKey = meta.GetKey(); + meta.deviceId = newUuid; + MetaDataManager::GetInstance().SaveMeta(meta.GetKey(), meta, true); + MetaDataManager::GetInstance().DelMeta(oldKey); } } diff --git a/services/distributeddataservice/app/src/kvstore_meta_manager.h b/services/distributeddataservice/app/src/kvstore_meta_manager.h index f7b28e1cd2a2a29dbccdb8d170800c051ba829c2..3f57bf5ddefc1de541ebb6fb6b6ad832589b41af 100644 --- a/services/distributeddataservice/app/src/kvstore_meta_manager.h +++ b/services/distributeddataservice/app/src/kvstore_meta_manager.h @@ -75,7 +75,7 @@ private: void InitMetaData(); - void UpdateMetaData(); + void UpdateMetaData(const std::string &uuid); void SubscribeMetaKvStore(); @@ -137,8 +137,8 @@ private: std::mutex mutex_; std::shared_ptr executors_; TaskId delaySyncTaskId_ = ExecutorPool::INVALID_TASK_ID; - static constexpr int32_t META_VERSION = 4; static constexpr int32_t MAX_TASK_COUNT = 1; + void UpdateStoreMeta() const; }; } // namespace DistributedKv } // namespace OHOS diff --git a/services/distributeddataservice/app/src/session_manager/route_head_handler_impl.cpp b/services/distributeddataservice/app/src/session_manager/route_head_handler_impl.cpp index 9437ee8ac0aef5baf9bc0ff78cc3c48e206e0fa7..746a5cc71d5132fd1279e243c5d095c8ed82f0ec 100644 --- a/services/distributeddataservice/app/src/session_manager/route_head_handler_impl.cpp +++ b/services/distributeddataservice/app/src/session_manager/route_head_handler_impl.cpp @@ -69,7 +69,7 @@ void RouteHeadHandlerImpl::Init() metaData.user = DEFAULT_USERID; metaData.bundleName = appId_; metaData.storeId = storeId_; - if (MetaDataManager::GetInstance().LoadMeta(metaData.GetKey(), metaData)) { + if (MetaDataManager::GetInstance().LoadMeta(metaData.GetKeyWithoutPath(), metaData)) { userId_ = DEFAULT_USERID; } } @@ -320,7 +320,7 @@ bool RouteHeadHandlerImpl::ParseHeadDataUser(const uint8_t *data, uint32_t total metaData.user = DEFAULT_USERID; metaData.bundleName = session_.appId; metaData.storeId = std::move(storeId); - if (!MetaDataManager::GetInstance().LoadMeta(metaData.GetKey(), metaData)) { + if (!MetaDataManager::GetInstance().LoadMeta(metaData.GetKeyWithoutPath(), metaData)) { int foregroundUserId = 0; AccountDelegate::GetInstance()->QueryForegroundUserId(foregroundUserId); UserInfo userInfo = { .receiveUser = std::to_string(foregroundUserId) }; diff --git a/services/distributeddataservice/app/test/unittest/kvstore_data_service_test.cpp b/services/distributeddataservice/app/test/unittest/kvstore_data_service_test.cpp index 8e761fdcb58b4ecc93fef43a2e10c17500fa77bd..3e7e4109a80a0323a933c40d134f61e66488e1c0 100644 --- a/services/distributeddataservice/app/test/unittest/kvstore_data_service_test.cpp +++ b/services/distributeddataservice/app/test/unittest/kvstore_data_service_test.cpp @@ -1002,8 +1002,8 @@ HWTEST_F(KvStoreDataServiceTest, OnExtensionBackup008, TestSize.Level0) { testSecret.sKey = CryptoManager::GetInstance().Encrypt(sKey, testMeta.area, testMeta.user); testSecret.storeType = 10; testSecret.time = std::vector{233, 39, 137, 103, 0, 0, 0, 0}; - EXPECT_EQ(MetaDataManager::GetInstance().SaveMeta(testMeta.GetKey(), testMeta, true), true); - EXPECT_EQ(MetaDataManager::GetInstance().SaveMeta(testMeta.GetSecretKey(), testSecret, true), true); + EXPECT_EQ(MetaDataManager::GetInstance().SaveMeta(testMeta.GetKeyWithoutPath(), testMeta, true), true); + EXPECT_EQ(MetaDataManager::GetInstance().SaveMeta(testMeta.GetSecretKeyWithoutPath(), testSecret, true), true); std::string cloneInfoStr = "[{\"type\":\"encryption_info\",\"detail\":{\"encryption_symkey\":\"27," diff --git a/services/distributeddataservice/app/test/unittest/session_manager_test.cpp b/services/distributeddataservice/app/test/unittest/session_manager_test.cpp index a6452ce4d287c3a8e7d7132d49dcadf0df1ce108..cbfcc85c040c342c5d6179335d9185ca751556f3 100644 --- a/services/distributeddataservice/app/test/unittest/session_manager_test.cpp +++ b/services/distributeddataservice/app/test/unittest/session_manager_test.cpp @@ -143,7 +143,7 @@ public: metaData.tokenId = AccessTokenKit::GetHapTokenID(PEER_USER_ID2, "ohos.test.demo", 0); metaData.uid = METADATA_UID; metaData.storeType = 1; - MetaDataManager::GetInstance().SaveMeta(metaData.GetKey(), metaData); + MetaDataManager::GetInstance().SaveMeta(metaData.GetKeyWithoutPath(), metaData); GrantPermissionNative(); deviceManagerAdapterMock = std::make_shared(); BDeviceManagerAdapter::deviceManagerAdapter = deviceManagerAdapterMock; @@ -169,7 +169,7 @@ public: metaData.tokenId = AccessTokenKit::GetHapTokenID(PEER_USER_ID2, "ohos.test.demo", 0); metaData.uid = METADATA_UID; metaData.storeType = 1; - MetaDataManager::GetInstance().DelMeta(metaData.GetKey()); + MetaDataManager::GetInstance().DelMeta(metaData.GetKeyWithoutPath()); deviceManagerAdapterMock = nullptr; BDeviceManagerAdapter::deviceManagerAdapter = nullptr; metaDataManagerMock = nullptr; diff --git a/services/distributeddataservice/framework/include/metadata/device_meta_data.h b/services/distributeddataservice/framework/include/metadata/device_meta_data.h index 7df8c5564c90f2f750cf90cdd569522bf1dc1d7a..e8af51098a3762f8e2b64da710e19903038a762c 100644 --- a/services/distributeddataservice/framework/include/metadata/device_meta_data.h +++ b/services/distributeddataservice/framework/include/metadata/device_meta_data.h @@ -27,8 +27,7 @@ public: API_EXPORT bool Unmarshal(const json &node) override; API_EXPORT std::string GetKey() const; - std::string newUuid = ""; - std::string oldUuid = ""; + std::string uuid = ""; }; } // namespace OHOS::DistributedData #endif // OHOS_DISTRIBUTED_DATA_SERVICES_FRAMEWORK_METADATA_DEVICE_META_DATA_H \ No newline at end of file diff --git a/services/distributeddataservice/framework/include/metadata/meta_data_manager.h b/services/distributeddataservice/framework/include/metadata/meta_data_manager.h index 08a2465c419156006a7e546a4fdc5f9e4e4b37af..c30f0e7d1bedd669b177d6347c5c4044416683ae 100644 --- a/services/distributeddataservice/framework/include/metadata/meta_data_manager.h +++ b/services/distributeddataservice/framework/include/metadata/meta_data_manager.h @@ -51,11 +51,16 @@ public: using Backup = std::function &)>; using Bytes = std::vector; using OnComplete = std::function &)>; + struct Entry { + std::string key; + const Serializable &value; + }; API_EXPORT static MetaDataManager &GetInstance(); API_EXPORT void Initialize(std::shared_ptr metaStore, const Backup &backup, const std::string &storeId); API_EXPORT void SetSyncer(const Syncer &syncer); API_EXPORT void SetCloudSyncer(const CloudSyncer &cloudSyncer); API_EXPORT bool SaveMeta(const std::string &key, const Serializable &value, bool isLocal = false); + API_EXPORT bool SaveMeta(const std::vector &values, bool isLocal = false); API_EXPORT bool LoadMeta(const std::string &key, Serializable &value, bool isLocal = false); template API_EXPORT bool LoadMeta(const std::string &prefix, std::vector &values, bool isLocal = false) @@ -75,6 +80,29 @@ public: } API_EXPORT bool DelMeta(const std::string &key, bool isLocal = false); + API_EXPORT bool DelMeta(const std::vector &keys, bool isLocal = false); + + template + API_EXPORT bool UpdateLocalKey(const std::string &prefix, std::function getOldKey, + std::function getNewKey) + { + if (!inited_) { + return false; + } + std::vector metaDataList; + std::vector entries; + std::vector keys; + LoadMeta(prefix, metaDataList, true); + for (auto &meta : metaDataList) { + keys.push_back(getOldKey(meta)); + entries.push_back({ getNewKey(meta), std::move(meta) }); + } + if (MetaDataManager::GetInstance().SaveMeta(entries, true)) { + MetaDataManager::GetInstance().DelMeta(keys, true); + } + return false; + } + API_EXPORT bool Subscribe(std::shared_ptr filter, Observer observer); API_EXPORT bool Subscribe(std::string prefix, Observer observer, bool isLocal = false); API_EXPORT bool Unsubscribe(std::string filter); diff --git a/services/distributeddataservice/framework/include/metadata/store_meta_data.h b/services/distributeddataservice/framework/include/metadata/store_meta_data.h index 2d17763414843203eae334f12a38925ddfec2c59..ca44bb522b7030e7285eafea1c7defcaacc32f6b 100644 --- a/services/distributeddataservice/framework/include/metadata/store_meta_data.h +++ b/services/distributeddataservice/framework/include/metadata/store_meta_data.h @@ -21,7 +21,7 @@ #include "store/store_info.h" namespace OHOS::DistributedData { -struct API_EXPORT StoreMetaData final : public Serializable { +struct API_EXPORT StoreMetaData : public Serializable { // record meta version for compatible, should update when modify store meta data structure. static constexpr uint32_t CURRENT_VERSION = 0x03000006; // UID -> uid, deviceAccountId -> userId, userId -> user @@ -75,24 +75,50 @@ struct API_EXPORT StoreMetaData final : public Serializable { API_EXPORT StoreMetaData(); API_EXPORT StoreMetaData(const std::string &userId, const std::string &appId, const std::string &storeId); API_EXPORT explicit StoreMetaData(const StoreInfo &storeInfo); - API_EXPORT ~StoreMetaData(); + API_EXPORT virtual ~StoreMetaData(); API_EXPORT bool operator==(const StoreMetaData &metaData) const; API_EXPORT bool operator!=(const StoreMetaData &metaData) const; API_EXPORT bool Marshal(json &node) const override; API_EXPORT bool Unmarshal(const json &node) override; - API_EXPORT std::string GetKey() const; - API_EXPORT std::string GetKeyLocal() const; - API_EXPORT std::string GetSecretKey() const; - API_EXPORT std::string GetStrategyKey() const; - API_EXPORT std::string GetBackupSecretKey() const; - API_EXPORT std::string GetAutoLaunchKey() const; - API_EXPORT std::string GetDebugInfoKey() const; - API_EXPORT std::string GetDfxInfoKey() const; - API_EXPORT std::string GetStoreAlias() const; - API_EXPORT StoreInfo GetStoreInfo() const; + API_EXPORT virtual std::string GetKeyWithoutPath() const; + API_EXPORT virtual std::string GetKey() const; + API_EXPORT virtual std::string GetKeyLocalWithoutPath() const; + API_EXPORT virtual std::string GetKeyLocal() const; + API_EXPORT virtual std::string GetSecretKeyWithoutPath() const; + API_EXPORT virtual std::string GetSecretKey() const; + API_EXPORT virtual std::string GetStrategyKey() const; + API_EXPORT virtual std::string GetBackupSecretKey() const; + API_EXPORT virtual std::string GetAutoLaunchKey() const; + API_EXPORT virtual std::string GetDebugInfoKey() const; + API_EXPORT virtual std::string GetDfxInfoKey() const; + API_EXPORT virtual std::string GetStoreAlias() const; + API_EXPORT virtual StoreInfo GetStoreInfo() const; + API_EXPORT virtual std::string GetCloneSecretKey() const; API_EXPORT static std::string GetKey(const std::initializer_list &fields); API_EXPORT static std::string GetPrefix(const std::initializer_list &fields); - API_EXPORT std::string GetCloneSecretKey() const; +}; + +struct API_EXPORT StoreMetaMapping final : public StoreMetaData { + static constexpr const char *KEY_PREFIX = "StoreMetaMapping"; + std::string cloudPath; + std::string devicePath; + std::string searchPath; + + API_EXPORT StoreMetaMapping(); + API_EXPORT StoreMetaMapping(const StoreMetaData &storeMeta); + API_EXPORT explicit StoreMetaMapping(const StoreInfo &storeInfo); + API_EXPORT ~StoreMetaMapping(); + API_EXPORT bool Marshal(json &node) const override; + API_EXPORT bool Unmarshal(const json &node) override; + API_EXPORT std::string GetKey() const override; + API_EXPORT std::string GetCloudStoreMetaKey() const; + API_EXPORT std::string GetDeviceStoreMetaKey() const; + API_EXPORT std::string GetSearchStoreMetaKey() const; + API_EXPORT static std::string GetPrefix(const std::initializer_list &fields); + +private: + static std::string GetKey(const std::initializer_list &fields); + std::string GetStoreMetaKeyWithPath(const std::string &path) const; }; } // namespace OHOS::DistributedData #endif // OHOS_DISTRIBUTED_DATA_SERVICES_FRAMEWORK_METADATA_STORE_META_DATA_H \ No newline at end of file diff --git a/services/distributeddataservice/framework/include/metadata/version_meta_data.h b/services/distributeddataservice/framework/include/metadata/version_meta_data.h index c83522c6724915282044e085fae75be02d2e95e7..0f44814e1f7c1af26d831941ca693173eee2ebd1 100755 --- a/services/distributeddataservice/framework/include/metadata/version_meta_data.h +++ b/services/distributeddataservice/framework/include/metadata/version_meta_data.h @@ -20,7 +20,9 @@ namespace OHOS::DistributedData { class API_EXPORT VersionMetaData final : public Serializable { public: - static constexpr int32_t CURRENT_VERSION = 4; + static constexpr int32_t CURRENT_VERSION = 5; + static constexpr int32_t UPDATE_STORE_META_KEY_VERSION = 5; + static constexpr int32_t UPDATE_SYNC_META_VERSION = 4; static constexpr int32_t INVALID_VERSION = -1; int32_t version = INVALID_VERSION; diff --git a/services/distributeddataservice/framework/include/store/auto_cache.h b/services/distributeddataservice/framework/include/store/auto_cache.h index 1549d0f1ffad71187ab332752b26d7380926b7a6..d6d564f444f84897aad48afb253a6a90d1d58668 100644 --- a/services/distributeddataservice/framework/include/store/auto_cache.h +++ b/services/distributeddataservice/framework/include/store/auto_cache.h @@ -53,23 +53,26 @@ public: API_EXPORT std::pair GetDBStore(const StoreMetaData &meta, const Watchers &watchers); API_EXPORT Stores GetStoresIfPresent(uint32_t tokenId, const std::string &storeName = "", - const std::string &userId = ""); + const std::string &userId = "", const std::string &path = ""); - API_EXPORT void CloseStore(uint32_t tokenId, const std::string &storeId = "", const std::string &userId = ""); + API_EXPORT void CloseStore(uint32_t tokenId, const std::string &storeId = "", const std::string &userId = "", + const std::string &path = ""); API_EXPORT void CloseStore(const Filter &filter); API_EXPORT void SetObserver(uint32_t tokenId, const std::string &storeId, const Watchers &watchers, - const std::string &userId = ""); + const std::string &userId = "", const std::string &path = ""); - API_EXPORT void Enable(uint32_t tokenId, const std::string &storeId = "", const std::string &userId = ""); + API_EXPORT void Enable(uint32_t tokenId, const std::string &storeId = "", const std::string &userId = "", + const std::string &path = ""); - API_EXPORT void Disable(uint32_t tokenId, const std::string &storeId, const std::string &userId = ""); + API_EXPORT void Disable( + uint32_t tokenId, const std::string &storeId, const std::string &userId = "", const std::string &path = ""); private: AutoCache(); ~AutoCache(); - std::string GenerateKey(const std::string &userId, const std::string &storeId) const; + std::string GenerateKey(const std::string &userId, const std::string &storeId, const std::string &path) const; void GarbageCollect(bool isForce); void StartTimer(); struct Delegate : public GeneralWatcher { @@ -103,6 +106,7 @@ private: std::shared_ptr executor_; TaskId taskId_ = Executor::INVALID_TASK_ID; ConcurrentMap> stores_; + // ConcurrentMap> stores_; ConcurrentMap> disables_; Creator creators_[MAX_CREATOR_NUM]; std::set disableStores_; diff --git a/services/distributeddataservice/framework/include/store/store_info.h b/services/distributeddataservice/framework/include/store/store_info.h index 8c5d02b2bd2775da2e3035c68d255aa3a0fce251..3543cca5d78fee5fe4970675bf663860781caa50 100644 --- a/services/distributeddataservice/framework/include/store/store_info.h +++ b/services/distributeddataservice/framework/include/store/store_info.h @@ -27,6 +27,7 @@ struct StoreInfo { int32_t user = 0; std::string deviceId; uint64_t syncId = 0; + std::string path; }; } // namespace OHOS::DistributedData #endif // OHOS_DISTRIBUTED_DATA_SERVICES_FRAMEWORK_STORE_STORE_INFO_H diff --git a/services/distributeddataservice/framework/metadata/device_meta_data.cpp b/services/distributeddataservice/framework/metadata/device_meta_data.cpp index c16c6400f140d94755c3ad0fe9497408e94a9a08..a3a636ebe89573dbe2d754dd15b6d7e0185ea258 100644 --- a/services/distributeddataservice/framework/metadata/device_meta_data.cpp +++ b/services/distributeddataservice/framework/metadata/device_meta_data.cpp @@ -19,15 +19,13 @@ namespace DistributedData { static constexpr const char *KEY_PREFIX = "DeviceMeta"; bool DeviceMetaData::Marshal(json &node) const { - SetValue(node[GET_NAME(newUuid)], newUuid); - SetValue(node[GET_NAME(oldUuid)], oldUuid); + SetValue(node[GET_NAME(uuid)], uuid); return true; } bool DeviceMetaData::Unmarshal(const json &node) { - GetValue(node, GET_NAME(newUuid), newUuid); - GetValue(node, GET_NAME(oldUuid), oldUuid); + GetValue(node, GET_NAME(uuid), uuid); return true; } diff --git a/services/distributeddataservice/framework/metadata/meta_data_manager.cpp b/services/distributeddataservice/framework/metadata/meta_data_manager.cpp index e7ade4b8299d3af1cef37f9c84077930cc5c5995..78513826129289ef364c98ce0f3b8107f9fc2a49 100644 --- a/services/distributeddataservice/framework/metadata/meta_data_manager.cpp +++ b/services/distributeddataservice/framework/metadata/meta_data_manager.cpp @@ -216,6 +216,36 @@ bool MetaDataManager::SaveMeta(const std::string &key, const Serializable &value return status == DistributedDB::DBStatus::OK; } +bool MetaDataManager::SaveMeta(const std::vector &values, bool isLocal) +{ + if (!inited_) { + return false; + } + std::vector entries; + entries.reserve(values.size()); + for (const auto &[key, value] : values) { + auto data = Serializable::Marshall(value); + entries.push_back({ { key.begin(), key.end() }, { data.begin(), data.end() } }); + } + auto status = isLocal ? metaStore_->PutLocalBatch(entries) : metaStore_->PutBatch(entries); + if (status == DistributedDB::DBStatus::INVALID_PASSWD_OR_CORRUPTED_DB) { + ZLOGE("db corrupted! status:%{public}d isLocal:%{public}d, size:%{public}zu", status, isLocal, values.size()); + CorruptReporter::CreateCorruptedFlag(DirectoryManager::GetInstance().GetMetaStorePath(), storeId_); + StopSA(); + return false; + } + if (status == DistributedDB::DBStatus::OK && backup_) { + backup_(metaStore_); + } + if (!isLocal && cloudSyncer_) { + cloudSyncer_(); + } + if (status != DistributedDB::DBStatus::OK) { + ZLOGE("failed! status:%{public}d isLocal:%{public}d, size:%{public}zu", status, isLocal, values.size()); + } + return status == DistributedDB::DBStatus::OK; +} + bool MetaDataManager::LoadMeta(const std::string &key, Serializable &value, bool isLocal) { if (!inited_) { @@ -271,7 +301,6 @@ bool MetaDataManager::DelMeta(const std::string &key, bool isLocal) return false; } - DistributedDB::Value data; auto status = isLocal ? metaStore_->DeleteLocal({ key.begin(), key.end() }) : metaStore_->Delete({ key.begin(), key.end() }); if (status == DistributedDB::DBStatus::INVALID_PASSWD_OR_CORRUPTED_DB) { @@ -290,6 +319,33 @@ bool MetaDataManager::DelMeta(const std::string &key, bool isLocal) return ((status == DistributedDB::DBStatus::OK) || (status == DistributedDB::DBStatus::NOT_FOUND)); } +bool MetaDataManager::DelMeta(const std::vector &keys, bool isLocal) +{ + if (!inited_) { + return false; + } + std::vector dbKeys; + dbKeys.reserve(keys.size()); + for (auto &key : keys) { + dbKeys.emplace_back(key.begin(), key.end()); + } + auto status = isLocal ? metaStore_->DeleteLocalBatch(dbKeys) : metaStore_->DeleteBatch(dbKeys); + if (status == DistributedDB::DBStatus::INVALID_PASSWD_OR_CORRUPTED_DB) { + ZLOGE("db corrupted! status:%{public}d isLocal:%{public}d, key size:%{public}zu", status, isLocal, + dbKeys.size()); + CorruptReporter::CreateCorruptedFlag(DirectoryManager::GetInstance().GetMetaStorePath(), storeId_); + StopSA(); + return false; + } + if (status == DistributedDB::DBStatus::OK && backup_) { + backup_(metaStore_); + } + if (!isLocal && cloudSyncer_) { + cloudSyncer_(); + } + return ((status == DistributedDB::DBStatus::OK) || (status == DistributedDB::DBStatus::NOT_FOUND)); +} + bool MetaDataManager::Sync(const std::vector &devices, OnComplete complete, bool wait) { if (!inited_ || devices.empty()) { diff --git a/services/distributeddataservice/framework/metadata/store_meta_data.cpp b/services/distributeddataservice/framework/metadata/store_meta_data.cpp index 61d6785804a0bcdcc9553cbf4f829d08fd4d5031..84f609b400dbd033053a464268248f8f0808dd81 100644 --- a/services/distributeddataservice/framework/metadata/store_meta_data.cpp +++ b/services/distributeddataservice/framework/metadata/store_meta_data.cpp @@ -113,13 +113,9 @@ bool StoreMetaData::Unmarshal(const json &node) return true; } -StoreMetaData::StoreMetaData() -{ -} +StoreMetaData::StoreMetaData() {} -StoreMetaData::~StoreMetaData() -{ -} +StoreMetaData::~StoreMetaData() {} StoreMetaData::StoreMetaData(const std::string &userId, const std::string &appId, const std::string &storeId) : appId(appId), storeId(storeId), user(userId) @@ -127,8 +123,8 @@ StoreMetaData::StoreMetaData(const std::string &userId, const std::string &appId } StoreMetaData::StoreMetaData(const StoreInfo &storeInfo) - : instanceId(storeInfo.instanceId), bundleName(storeInfo.bundleName), storeId(storeInfo.storeName), - user(std::to_string(storeInfo.user)) + : instanceId(storeInfo.instanceId), bundleName(storeInfo.bundleName), dataDir(storeInfo.path), + storeId(storeInfo.storeName), user(std::to_string(storeInfo.user)) { } @@ -160,25 +156,26 @@ bool StoreMetaData::operator!=(const StoreMetaData &metaData) const std::string StoreMetaData::GetKey() const { if (instanceId == 0) { - return GetKey({ deviceId, user, "default", bundleName, storeId }); + return GetKey({ deviceId, user, "default", bundleName, storeId, dataDir }); } - return GetKey({ deviceId, user, "default", bundleName, storeId, std::to_string(instanceId) }); + return GetKey({ deviceId, user, "default", bundleName, storeId, std::to_string(instanceId), dataDir }); } std::string StoreMetaData::GetKeyLocal() const { if (instanceId == 0) { - return StoreMetaDataLocal::GetKey({ deviceId, user, "default", bundleName, storeId }); + return StoreMetaDataLocal::GetKey({ deviceId, user, "default", bundleName, storeId, dataDir }); } - return StoreMetaDataLocal::GetKey({ deviceId, user, "default", bundleName, storeId, std::to_string(instanceId) }); + return StoreMetaDataLocal::GetKey( + { deviceId, user, "default", bundleName, storeId, std::to_string(instanceId), dataDir }); } std::string StoreMetaData::GetSecretKey() const { if (version < UUID_CHANGED_TAG) { - return SecretKeyMetaData::GetKey({ user, "default", bundleName, storeId }); + return SecretKeyMetaData::GetKey({ user, "default", bundleName, storeId, dataDir }); } - return SecretKeyMetaData::GetKey({ user, "default", bundleName, storeId, std::to_string(instanceId) }); + return SecretKeyMetaData::GetKey({ user, "default", bundleName, storeId, std::to_string(instanceId), dataDir }); } std::string StoreMetaData::GetBackupSecretKey() const @@ -245,5 +242,96 @@ std::string StoreMetaData::GetCloneSecretKey() const { return SecretKeyMetaData::GetCloneKey({ user, "default", bundleName, storeId, std::to_string(instanceId) }); } + +std::string StoreMetaData::GetKeyWithoutPath() const +{ + if (instanceId == 0) { + return GetKey({ deviceId, user, "default", bundleName, storeId }); + } + return GetKey({ deviceId, user, "default", bundleName, storeId, std::to_string(instanceId) }); +} + +std::string StoreMetaData::GetKeyLocalWithoutPath() const +{ + if (instanceId == 0) { + return StoreMetaDataLocal::GetKey({ deviceId, user, "default", bundleName, storeId }); + } + return StoreMetaDataLocal::GetKey({ deviceId, user, "default", bundleName, storeId, std::to_string(instanceId) }); +} + +std::string StoreMetaData::GetSecretKeyWithoutPath() const +{ + if (version < UUID_CHANGED_TAG) { + return SecretKeyMetaData::GetKey({ user, "default", bundleName, storeId }); + } + return SecretKeyMetaData::GetKey({ user, "default", bundleName, storeId, std::to_string(instanceId) }); +} + +StoreMetaMapping::StoreMetaMapping() {} +StoreMetaMapping::StoreMetaMapping(const StoreMetaData &storeMeta) : StoreMetaData(storeMeta) {} +StoreMetaMapping::~StoreMetaMapping() {} + +bool StoreMetaMapping::Marshal(json &node) const +{ + StoreMetaData::Marshal(node); + SetValue(node[GET_NAME(cloudPath)], cloudPath); + SetValue(node[GET_NAME(devicePath)], devicePath); + SetValue(node[GET_NAME(searchPath)], searchPath); + return true; +} +bool StoreMetaMapping::Unmarshal(const Serializable::json &node) +{ + StoreMetaData::Unmarshal(node); + GetValue(node, GET_NAME(cloudPath), cloudPath); + GetValue(node, GET_NAME(devicePath), devicePath); + GetValue(node, GET_NAME(searchPath), searchPath); + return true; +} + +std::string StoreMetaMapping::GetKey() const +{ + if (instanceId == 0) { + return GetKey({ deviceId, user, "default", bundleName, storeId }); + } + return GetKey({ deviceId, user, "default", bundleName, storeId, std::to_string(instanceId) }); +} + +std::string StoreMetaMapping::GetCloudStoreMetaKey() const +{ + return GetStoreMetaKeyWithPath(cloudPath); +} + +std::string StoreMetaMapping::GetDeviceStoreMetaKey() const +{ + return GetStoreMetaKeyWithPath(devicePath); +} + +std::string StoreMetaMapping::GetSearchStoreMetaKey() const +{ + return GetStoreMetaKeyWithPath(searchPath); +} + +std::string StoreMetaMapping::GetPrefix(const std::initializer_list &fields) +{ + return GetKey(fields).append(Constant::KEY_SEPARATOR); +} + +std::string StoreMetaMapping::GetStoreMetaKeyWithPath(const std::string &path) const +{ + if (instanceId == 0) { + return StoreMetaData::GetKey({ deviceId, user, "default", bundleName, storeId, path }); + } + return StoreMetaData::GetKey({ deviceId, user, "default", bundleName, storeId, std::to_string(instanceId), path }); +} + +std::string StoreMetaMapping::GetKey(const std::initializer_list &fields) +{ + std::string prefix = KEY_PREFIX; + for (const auto &field : fields) { + prefix.append(Constant::KEY_SEPARATOR).append(field); + } + return prefix; +} +StoreMetaMapping::StoreMetaMapping(const StoreInfo &storeInfo) : StoreMetaData(storeInfo) {} } // namespace DistributedData } // namespace OHOS \ No newline at end of file diff --git a/services/distributeddataservice/framework/store/auto_cache.cpp b/services/distributeddataservice/framework/store/auto_cache.cpp index b6343164e4fad1818132c64d687b0806dd825b47..0cf9ebf767d25d79287a6cd09adaaeab7429dfe0 100644 --- a/services/distributeddataservice/framework/store/auto_cache.cpp +++ b/services/distributeddataservice/framework/store/auto_cache.cpp @@ -61,19 +61,24 @@ AutoCache::~AutoCache() } } -std::string AutoCache::GenerateKey(const std::string &userId, const std::string &storeId) const +std::string AutoCache::GenerateKey(const std::string &userId, const std::string &storeId, const std::string &path) const { std::string key = ""; if (userId.empty() || storeId.empty()) { return key; } - return key.append(userId).append(KEY_SEPARATOR).append(storeId); + // 存在有些场景确实不需要path的地方???是否需要兼容适配 + if (path.empty()) { + return key.append(userId).append(KEY_SEPARATOR).append(storeId); + } + return key.append(userId).append(KEY_SEPARATOR).append(storeId).append(KEY_SEPARATOR).append(path); } std::pair AutoCache::GetDBStore(const StoreMetaData &meta, const Watchers &watchers) { Store store; - auto storeKey = GenerateKey(meta.user, meta.storeId); + auto storeKey = GenerateKey(meta.user, meta.storeId, meta.dataDir); + ZLOGW("mmy storeKey %{public}s dataDir %{public}s", storeKey.c_str(), meta.dataDir.c_str()); if (meta.storeType >= MAX_CREATOR_NUM || meta.storeType < 0 || !creators_[meta.storeType] || disables_.ContainIf(meta.tokenId, [&storeKey](const std::set &stores) -> bool { return stores.count(storeKey) != 0; })) { @@ -86,6 +91,7 @@ std::pair AutoCache::GetDBStore(const StoreMetaData & meta.bundleName.c_str(), meta.GetStoreAlias().c_str()); return { E_SCREEN_LOCKED, store }; } + // 这个应该没有任何关系 if (Account::GetInstance()->IsDeactivating(atoi(meta.user.c_str()))) { ZLOGW("user %{public}s is deactivating, bundleName:%{public}s, storeName: %{public}s", meta.user.c_str(), meta.bundleName.c_str(), meta.GetStoreAlias().c_str()); @@ -93,11 +99,13 @@ std::pair AutoCache::GetDBStore(const StoreMetaData & } stores_.Compute(meta.tokenId, [this, &meta, &watchers, &store, &storeKey](auto &, std::map &stores) -> bool { + // 这个流程需要确认一下是干嘛的 if (disableStores_.count(meta.dataDir) != 0) { ZLOGW("store is closing,tokenId:0x%{public}x,user:%{public}s,bundleName:%{public}s,storeId:%{public}s", meta.tokenId, meta.user.c_str(), meta.bundleName.c_str(), meta.GetStoreAlias().c_str()); return !stores.empty(); } + // 重点是这个流程如何修改 auto it = stores.find(storeKey); if (it != stores.end()) { if (!watchers.empty()) { @@ -123,14 +131,15 @@ std::pair AutoCache::GetDBStore(const StoreMetaData & AutoCache::Store AutoCache::GetStore(const StoreMetaData &meta, const Watchers &watchers) { + // 外部传入meta确保都有path,此处直接取path使用即可。 return GetDBStore(meta, watchers).second; } AutoCache::Stores AutoCache::GetStoresIfPresent(uint32_t tokenId, const std::string &storeName, - const std::string &userId) + const std::string &userId, const std::string &path) { Stores stores; - auto storeKey = GenerateKey(userId, storeName); + auto storeKey = GenerateKey(userId, storeName, path); stores_.ComputeIfPresent( tokenId, [&stores, &storeKey](auto &, std::map &delegates) -> bool { if (storeKey.empty()) { @@ -170,13 +179,14 @@ void AutoCache::StartTimer() ZLOGD("start timer,taskId: %{public}" PRIu64, taskId_); } -void AutoCache::CloseStore(uint32_t tokenId, const std::string &storeId, const std::string &userId) +void AutoCache::CloseStore( + uint32_t tokenId, const std::string &storeId, const std::string &userId, const std::string &path) { ZLOGD("close store start, store:%{public}s, token:%{public}u", Anonymous::Change(storeId).c_str(), tokenId); std::set storeIds; std::list closeStores; bool isScreenLocked = ScreenManager::GetInstance()->IsLocked(); - auto storeKey = GenerateKey(userId, storeId); + auto storeKey = GenerateKey(userId, storeId, path); stores_.ComputeIfPresent(tokenId, [this, &storeKey, isScreenLocked, &storeIds, &closeStores](auto &, auto &delegates) { auto it = delegates.begin(); @@ -242,9 +252,9 @@ void AutoCache::CloseStore(const AutoCache::Filter &filter) } void AutoCache::SetObserver(uint32_t tokenId, const std::string &storeId, const AutoCache::Watchers &watchers, - const std::string &userId) + const std::string &userId, const std::string &path) { - auto storeKey = GenerateKey(userId, storeId); + auto storeKey = GenerateKey(userId, storeId, path); stores_.ComputeIfPresent(tokenId, [&storeKey, &watchers](auto &key, auto &stores) { ZLOGD("tokenId:0x%{public}x storeId:%{public}s observers:%{public}zu", key, Anonymous::Change(storeKey).c_str(), watchers.size()); @@ -274,18 +284,19 @@ void AutoCache::GarbageCollect(bool isForce) }); } -void AutoCache::Enable(uint32_t tokenId, const std::string &storeId, const std::string &userId) +void AutoCache::Enable(uint32_t tokenId, const std::string &storeId, const std::string &userId, const std::string &path) { - auto storeKey = GenerateKey(userId, storeId); + auto storeKey = GenerateKey(userId, storeId, path); disables_.ComputeIfPresent(tokenId, [&storeKey](auto key, std::set &stores) { stores.erase(storeKey); return !(stores.empty() || storeKey.empty()); }); } -void AutoCache::Disable(uint32_t tokenId, const std::string &storeId, const std::string &userId) +void AutoCache::Disable( + uint32_t tokenId, const std::string &storeId, const std::string &userId, const std::string &path) { - auto storeKey = GenerateKey(userId, storeId); + auto storeKey = GenerateKey(userId, storeId, path); disables_.Compute(tokenId, [&storeKey](auto key, std::set &stores) { stores.insert(storeKey); return !stores.empty(); diff --git a/services/distributeddataservice/framework/test/meta_data_test.cpp b/services/distributeddataservice/framework/test/meta_data_test.cpp index 4ae6ed71edb528ed06e3009a4d5127bf15505202..6a3fbde3a1c983d1d3984338ff306b4499ab728b 100644 --- a/services/distributeddataservice/framework/test/meta_data_test.cpp +++ b/services/distributeddataservice/framework/test/meta_data_test.cpp @@ -227,9 +227,9 @@ HWTEST_F(ServiceMetaDataTest, StoreMetaData001, TestSize.Level1) StoreMetaData storeMetaData("100", "appid", "test_store"); StoreMetaData storeMeta; - std::string key = storeMetaData.GetKey(); + std::string key = storeMetaData.GetKeyWithoutPath(); EXPECT_EQ(key, "KvStoreMetaData######100###default######test_store"); - std::string keylocal = storeMetaData.GetKeyLocal(); + std::string keylocal = storeMetaData.GetKeyLocalWithoutPath(); EXPECT_EQ(keylocal, "KvStoreMetaDataLocal######100###default######test_store"); std::initializer_list fields = { "100", "appid", "test_store" }; std::string keyfields = storeMetaData.GetKey(fields); @@ -270,7 +270,7 @@ HWTEST_F(ServiceMetaDataTest, StoreMetaData002, TestSize.Level1) StoreMetaData storeMetaData("100", "appid", "test_store"); StoreMetaData storeMeta; - std::string secretkey = storeMetaData.GetSecretKey(); + std::string secretkey = storeMetaData.GetSecretKeyWithoutPath(); EXPECT_EQ(secretkey, "SecretKey###100###default######test_store###0###SINGLE_KEY"); std::string backupsecretkey = storeMetaData.GetBackupSecretKey(); EXPECT_EQ(backupsecretkey, "BackupSecretKey###100###default######test_store###0###"); @@ -353,9 +353,9 @@ HWTEST_F(ServiceMetaDataTest, StoreMetaData004, TestSize.Level1) storeMetaData.instanceId = 1; StoreMetaData storeMeta; - std::string key = storeMetaData.GetKey(); + std::string key = storeMetaData.GetKeyWithoutPath(); EXPECT_EQ(key, "KvStoreMetaData######100###default######test_store###1"); - std::string keylocal = storeMetaData.GetKeyLocal(); + std::string keylocal = storeMetaData.GetKeyLocalWithoutPath(); EXPECT_EQ(keylocal, "KvStoreMetaDataLocal######100###default######test_store###1"); auto result = MetaDataManager::GetInstance().SaveMeta(key, storeMetaData, true); @@ -393,7 +393,7 @@ HWTEST_F(ServiceMetaDataTest, StoreMetaData005, TestSize.Level1) storeMetaData.instanceId = 1; StoreMetaData storeMeta; - std::string secretkey = storeMetaData.GetSecretKey(); + std::string secretkey = storeMetaData.GetSecretKeyWithoutPath(); EXPECT_EQ(secretkey, "SecretKey###100###default######test_store###SINGLE_KEY"); std::string backupsecretkey = storeMetaData.GetBackupSecretKey(); EXPECT_EQ(backupsecretkey, "BackupSecretKey###100###default######test_store###"); @@ -659,14 +659,14 @@ HWTEST_F(ServiceMetaDataTest, MetaData, TestSize.Level1) metaData.secretKeyMetaData = secretKeyMetaData; metaData.storeType = 1; std::initializer_list fields = { "time", "skey" }; - std::string key = metaData.storeMetaData.GetKey(); + std::string key = metaData.storeMetaData.GetKeyWithoutPath(); std::string secretkey = metaData.secretKeyMetaData.GetKey(fields); auto result = MetaDataManager::GetInstance().SaveMeta(key, metaData, true); EXPECT_TRUE(result); result = MetaDataManager::GetInstance().LoadMeta(key, metaDataLoad, true); EXPECT_TRUE(result); - EXPECT_EQ(key, metaDataLoad.storeMetaData.GetKey()); + EXPECT_EQ(key, metaDataLoad.storeMetaData.GetKeyWithoutPath()); EXPECT_EQ(secretkey, metaDataLoad.secretKeyMetaData.GetKey(fields)); result = MetaDataManager::GetInstance().DelMeta(key, true); EXPECT_TRUE(result); @@ -813,19 +813,15 @@ HWTEST_F(ServiceMetaDataTest, MatrixMetaData, TestSize.Level1) HWTEST_F(ServiceMetaDataTest, DeviceMetaData, TestSize.Level1) { DeviceMetaData metaData; - std::string newUuid = "newuuid"; - std::string oldUuid = "olduuid"; - metaData.newUuid = newUuid; - metaData.oldUuid = oldUuid; + std::string uuid = "uuid"; + metaData.uuid = uuid; Serializable::json node1; metaData.Marshal(node1); - EXPECT_EQ(node1["newUuid"], newUuid); - EXPECT_EQ(node1["oldUuid"], oldUuid); + EXPECT_EQ(node1["uuid"], uuid); DeviceMetaData newMetaData; newMetaData.Unmarshal(node1); - EXPECT_EQ(newMetaData.newUuid, newUuid); - EXPECT_EQ(newMetaData.oldUuid, oldUuid); + EXPECT_EQ(newMetaData.uuid, uuid); } /** @@ -843,10 +839,10 @@ HWTEST_F(ServiceMetaDataTest, InitTestMeta, TestSize.Level1) oldMeta.bundleName = "test_appid_001"; oldMeta.storeId = "test_storeid_001"; oldMeta.isEncrypt = true; - bool isSuccess = MetaDataManager::GetInstance().SaveMeta(oldMeta.GetKey(), oldMeta, true); + bool isSuccess = MetaDataManager::GetInstance().SaveMeta(oldMeta.GetKeyWithoutPath(), oldMeta, true); EXPECT_TRUE(isSuccess); StoreMetaDataLocal metaDataLocal; - isSuccess = MetaDataManager::GetInstance().SaveMeta(oldMeta.GetKeyLocal(), metaDataLocal, true); + isSuccess = MetaDataManager::GetInstance().SaveMeta(oldMeta.GetKeyLocalWithoutPath(), metaDataLocal, true); EXPECT_TRUE(isSuccess); SwitchesMetaData switchesMetaData; isSuccess = MetaDataManager::GetInstance().SaveMeta(SwitchesMetaData::GetPrefix({"mockOldUuid"}), @@ -860,7 +856,7 @@ HWTEST_F(ServiceMetaDataTest, InitTestMeta, TestSize.Level1) isSuccess = MetaDataManager::GetInstance().SaveMeta(MatrixMetaData::GetPrefix({"mockOldUuid"}), matrixMeta0, true); EXPECT_TRUE(isSuccess); - isSuccess = MetaDataManager::GetInstance().SaveMeta(oldMeta.GetKey(), oldMeta); + isSuccess = MetaDataManager::GetInstance().SaveMeta(oldMeta.GetKeyLocalWithoutPath(), oldMeta); EXPECT_TRUE(isSuccess); MatrixMetaData matrixMeta; isSuccess = MetaDataManager::GetInstance().SaveMeta(MatrixMetaData::GetPrefix({"mockOldUuid"}), matrixMeta); @@ -894,10 +890,10 @@ HWTEST_F(ServiceMetaDataTest, UpdateStoreMetaData, TestSize.Level1) newMeta.bundleName = "test_appid_001"; newMeta.storeId = "test_storeid_001"; KvStoreMetaManager::GetInstance().UpdateStoreMetaData(mockNewUuid, mockOldUuid); - bool isSuccess = MetaDataManager::GetInstance().LoadMeta(newMeta.GetKey(), newMeta, true); + bool isSuccess = MetaDataManager::GetInstance().LoadMeta(newMeta.GetKeyLocalWithoutPath(), newMeta, true); EXPECT_TRUE(isSuccess); EXPECT_TRUE(newMeta.isNeedUpdateDeviceId); - isSuccess = MetaDataManager::GetInstance().LoadMeta(newMeta.GetKey(), newMeta); + isSuccess = MetaDataManager::GetInstance().LoadMeta(newMeta.GetKeyLocalWithoutPath(), newMeta); EXPECT_TRUE(isSuccess); AutoLaunchMetaData autoLaunchMetaData; isSuccess = MetaDataManager::GetInstance().LoadMeta(AutoLaunchMetaData::GetPrefix({ newMeta.deviceId, newMeta.user, @@ -919,11 +915,6 @@ HWTEST_F(ServiceMetaDataTest, UpdateMetaDatas, TestSize.Level1) { std::string mockNewUuid = "mockNewUuid"; std::string mockOldUuid = "mockOldUuid"; - StoreMetaData newMeta; - newMeta.deviceId = "mockNewUuid"; - newMeta.user = "200"; - newMeta.bundleName = "test_appid_001"; - newMeta.storeId = "test_storeid_001"; KvStoreMetaManager::GetInstance().UpdateMetaDatas(mockNewUuid, mockOldUuid); MatrixMetaData matrixMeta; bool isSuccess = MetaDataManager::GetInstance().LoadMeta(MatrixMetaData::GetPrefix({ "mockNewUuid" }), @@ -958,9 +949,9 @@ HWTEST_F(ServiceMetaDataTest, DelTestMeta, TestSize.Level1) newMeta.user = "200"; newMeta.bundleName = "test_appid_001"; newMeta.storeId = "test_storeid_001"; - bool isSuccess = MetaDataManager::GetInstance().DelMeta(newMeta.GetKey(), true); + bool isSuccess = MetaDataManager::GetInstance().DelMeta(newMeta.GetKeyWithoutPath(), true); EXPECT_TRUE(isSuccess); - isSuccess = MetaDataManager::GetInstance().DelMeta(newMeta.GetKeyLocal(), true); + isSuccess = MetaDataManager::GetInstance().DelMeta(newMeta.GetKeyLocalWithoutPath(), true); EXPECT_TRUE(isSuccess); isSuccess = MetaDataManager::GetInstance().DelMeta(SwitchesMetaData::GetPrefix({ "mockNewUuid" }), true); EXPECT_TRUE(isSuccess); @@ -970,7 +961,7 @@ HWTEST_F(ServiceMetaDataTest, DelTestMeta, TestSize.Level1) isSuccess = MetaDataManager::GetInstance().DelMeta(MatrixMetaData::GetPrefix({ "mockNewUuid" }), true); EXPECT_TRUE(isSuccess); - isSuccess = MetaDataManager::GetInstance().DelMeta(newMeta.GetKey()); + isSuccess = MetaDataManager::GetInstance().DelMeta(newMeta.GetKeyWithoutPath()); EXPECT_TRUE(isSuccess); isSuccess = MetaDataManager::GetInstance().DelMeta(MatrixMetaData::GetPrefix({"mockNewUuid"})); EXPECT_TRUE(isSuccess); diff --git a/services/distributeddataservice/service/backup/src/backup_manager.cpp b/services/distributeddataservice/service/backup/src/backup_manager.cpp index d957de357f8f2240aa791dd12505dd88bf7467ee..817e79577b1d5b9a7c3fabdfe605311d32774a4c 100644 --- a/services/distributeddataservice/service/backup/src/backup_manager.cpp +++ b/services/distributeddataservice/service/backup/src/backup_manager.cpp @@ -181,6 +181,7 @@ void BackupManager::SaveData(const std::string &path, const std::string &key, co CopyFile(tmpPath, path); RemoveFile(tmpPath.c_str()); if (secretKey.sKey.size() != 0) { + // key需要有path MetaDataManager::GetInstance().SaveMeta(key, secretKey, true); } RemoveFile(backupPath.c_str()); diff --git a/services/distributeddataservice/service/cloud/cloud_service_impl.cpp b/services/distributeddataservice/service/cloud/cloud_service_impl.cpp index f566532a7a43f64a9e30fe5dc6a2640b213e23e2..9c00d8972b2b2b58e1d26bcf6d429d86f2ffb278 100644 --- a/services/distributeddataservice/service/cloud/cloud_service_impl.cpp +++ b/services/distributeddataservice/service/cloud/cloud_service_impl.cpp @@ -13,6 +13,7 @@ * limitations under the License. */ +#include "metadata/store_meta_data.h" #define LOG_TAG "CloudServiceImpl" #include "cloud_service_impl.h" @@ -291,6 +292,22 @@ void CloudServiceImpl::DoClean(int32_t user, const SchemaMeta &schemaMeta, int32 bool CloudServiceImpl::GetStoreMetaData(StoreMetaData &meta) { + StoreMetaMapping storeMetaMapping(meta); + if (!MetaDataManager::GetInstance().LoadMeta(storeMetaMapping.GetKey(), storeMetaMapping, true)) { + if (meta.user == "0") { + ZLOGE("failed, no storeMetaMapping bundleName:%{public}s, storeId:%{public}s, user = %{public}s", + meta.bundleName.c_str(), meta.GetStoreAlias().c_str(), meta.user.c_str()); + return false; + } + meta.user = "0"; + if (!MetaDataManager::GetInstance().LoadMeta(storeMetaMapping.GetKey(), storeMetaMapping, true)) { + ZLOGE("storeMetaMapping empty, not public store. bundleName:%{public}s, storeId:%{public}s, user = " + "%{public}s", + meta.bundleName.c_str(), meta.GetStoreAlias().c_str(), meta.user.c_str()); + return false; + } + } + meta.dataDir = storeMetaMapping.cloudPath; if (!MetaDataManager::GetInstance().LoadMeta(meta.GetKey(), meta, true)) { if (meta.user == "0") { ZLOGE("failed, no store meta bundleName:%{public}s, storeId:%{public}s, user = %{public}s", @@ -502,6 +519,10 @@ std::map CloudServiceImpl::ExecuteStatistics(const break; } meta.instanceId = it->second.instanceId; + StoreMetaMapping storeMetaMapping(meta); + // 默认一定有映射表? + MetaDataManager::GetInstance().LoadMeta(storeMetaMapping.GetKey(), storeMetaMapping, true); + meta.dataDir = storeMetaMapping.cloudPath; MetaDataManager::GetInstance().LoadMeta(meta.GetKey(), meta, true); result.insert_or_assign(database.alias, QueryStatistics(meta, database)); } @@ -1206,6 +1227,11 @@ std::pair> CloudServiceImpl::P const StoreInfo &storeInfo, GenQuery &query) { StoreMetaData meta(storeInfo); + if (meta.dataDir.empty()) { + StoreMetaMapping storeMetaMapping(meta); + MetaDataManager::GetInstance().LoadMeta(storeMetaMapping.GetKey(), storeMetaMapping, true); + meta.dataDir = storeMetaMapping.cloudPath; + } meta.deviceId = DmAdapter::GetInstance().GetLocalDevice().uuid; if (!MetaDataManager::GetInstance().LoadMeta(meta.GetKey(), meta, true)) { ZLOGE("failed, no store meta bundleName:%{public}s, storeId:%{public}s", meta.bundleName.c_str(), diff --git a/services/distributeddataservice/service/cloud/sync_manager.cpp b/services/distributeddataservice/service/cloud/sync_manager.cpp index f949d37c7afbf3e85c0babc48bda8d532dbc4dd1..75555a01ec5337156e6fa359bd9804dee92307b2 100644 --- a/services/distributeddataservice/service/cloud/sync_manager.cpp +++ b/services/distributeddataservice/service/cloud/sync_manager.cpp @@ -159,6 +159,7 @@ bool SyncManager::SyncInfo::Contains(const std::string &storeName) std::function SyncManager::GetLockChangeHandler() { + // event获取的storeInfo一定有path? return [](const Event &event) { auto &evt = static_cast(event); auto storeInfo = evt.GetStoreInfo(); @@ -416,6 +417,7 @@ void SyncManager::StartCloudSync(const DistributedData::SyncEvent &evt, const St std::function SyncManager::GetSyncHandler(Retryer retryer) { + // 默认evt获取的storeInfo一定有path? return [this, retryer](const Event &event) { auto &evt = static_cast(event); auto &storeInfo = evt.GetStoreInfo(); diff --git a/services/distributeddataservice/service/data_share/data_share_db_config.cpp b/services/distributeddataservice/service/data_share/data_share_db_config.cpp index 544f887ff00a115aadddf6af10de60fff81ffa46..f1b52a8ef547cde51cd2f2c7c644e0132703e12f 100644 --- a/services/distributeddataservice/service/data_share/data_share_db_config.cpp +++ b/services/distributeddataservice/service/data_share/data_share_db_config.cpp @@ -12,6 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +#include "metadata/store_meta_data.h" #define LOG_TAG "DataShareDbConfig" #include "data_share_db_config.h" @@ -34,17 +35,19 @@ std::pair DataShareDbConfig::QueryMetaData const std::string &bundleName, const std::string &storeName, int32_t userId, int32_t appIndex) { TimeoutReport timeoutReport({bundleName, "", storeName, __FUNCTION__, 0}); - DistributedData::StoreMetaData meta; + DistributedData::StoreMetaMapping meta; meta.deviceId = DistributedData::DeviceManagerAdapter::GetInstance().GetLocalDevice().uuid; meta.user = std::to_string(userId); meta.bundleName = bundleName; meta.storeId = storeName; meta.instanceId = appIndex; - DistributedData::StoreMetaData metaData; - bool isCreated = DistributedData::MetaDataManager::GetInstance().LoadMeta(meta.GetKey(), metaData, true); + // datashare只查到映射信息就够用了,不需要查带path的meta? + bool isCreated = + DistributedData::MetaDataManager::GetInstance().LoadMeta(meta.GetKey(), meta, true); + auto callingPid = IPCSkeleton::GetCallingPid(); timeoutReport.Report(std::to_string(userId), callingPid, appIndex); - return std::make_pair(isCreated, metaData); + return std::make_pair(isCreated, static_cast(meta)); } std::pair DataShareDbConfig::GetMetaData(const DbConfig &dbConfig) diff --git a/services/distributeddataservice/service/data_share/strategies/general/load_config_data_info_strategy.cpp b/services/distributeddataservice/service/data_share/strategies/general/load_config_data_info_strategy.cpp index 095a04bdb1f17f7d5a2f1e57f245c553af8bcb30..c5b4bd1733c5cae8500563423c27a39fa5940d4c 100644 --- a/services/distributeddataservice/service/data_share/strategies/general/load_config_data_info_strategy.cpp +++ b/services/distributeddataservice/service/data_share/strategies/general/load_config_data_info_strategy.cpp @@ -33,12 +33,14 @@ LoadConfigDataInfoStrategy::LoadConfigDataInfoStrategy() static bool QueryMetaData(const std::string &bundleName, const std::string &storeName, DistributedData::StoreMetaData &metaData, const int32_t userId, const int32_t appIndex) { - DistributedData::StoreMetaData meta; - meta.deviceId = DistributedData::DeviceManagerAdapter::GetInstance().GetLocalDevice().uuid; - meta.user = std::to_string(userId); - meta.bundleName = bundleName; - meta.storeId = storeName; - bool isCreated = DistributedData::MetaDataManager::GetInstance().LoadMeta(meta.GetKey(), metaData, true); + DistributedData::StoreMetaMapping storeMetaMapping; + storeMetaMapping.deviceId = DistributedData::DeviceManagerAdapter::GetInstance().GetLocalDevice().uuid; + storeMetaMapping.user = std::to_string(userId); + storeMetaMapping.bundleName = bundleName; + storeMetaMapping.storeId = storeName; + bool isCreated = DistributedData::MetaDataManager::GetInstance().LoadMeta( + storeMetaMapping.GetKey(), storeMetaMapping, true); + metaData = static_cast(storeMetaMapping); if (!isCreated) { ZLOGE("DB not exist"); return false; diff --git a/services/distributeddataservice/service/kvdb/kvdb_service_impl.cpp b/services/distributeddataservice/service/kvdb/kvdb_service_impl.cpp index 149598d07b69eb839c8da582646b3b304120779a..e5016ad089d58246bb23a8a3d3652a9d0dd9eb89 100644 --- a/services/distributeddataservice/service/kvdb/kvdb_service_impl.cpp +++ b/services/distributeddataservice/service/kvdb/kvdb_service_impl.cpp @@ -12,6 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +#include "metadata/store_meta_data.h" #define LOG_TAG "KVDBServiceImpl" #include "kvdb_service_impl.h" @@ -98,6 +99,7 @@ KVDBServiceImpl::~KVDBServiceImpl() void KVDBServiceImpl::Init() { + // evt.GetStoreInfo()默认有path? auto process = [this](const Event &event) { const auto &evt = static_cast(event); const auto &storeInfo = evt.GetStoreInfo(); @@ -124,6 +126,7 @@ void KVDBServiceImpl::Init() } auto watchers = GetWatchers(meta.tokenId, meta.storeId, meta.user); auto store = AutoCache::GetInstance().GetStore(meta, watchers); + ZLOGE("mmy Init, store:%{public}s", meta.dataDir.c_str()); if (store == nullptr) { ZLOGE("store null, storeId:%{public}s", meta.GetStoreAlias().c_str()); return; @@ -180,7 +183,7 @@ Status KVDBServiceImpl::GetStoreIds(const AppId &appId, int32_t subUser, std::ve Status KVDBServiceImpl::Delete(const AppId &appId, const StoreId &storeId, int32_t subUser) { - StoreMetaData metaData = GetStoreMetaData(appId, storeId, subUser); + StoreMetaData metaData = GetStoreMetaDataWithPath(appId, storeId, subUser); if (metaData.instanceId < 0) { return ILLEGAL_STATE; } @@ -193,7 +196,9 @@ Status KVDBServiceImpl::Delete(const AppId &appId, const StoreId &storeId, int32 syncAgent.delayTimes_.erase(storeId); return true; }); - MetaDataManager::GetInstance().DelMeta(metaData.GetKey()); + StoreMetaMapping storeMetaMapping(metaData); + MetaDataManager::GetInstance().DelMeta(storeMetaMapping.GetKey(), true); + MetaDataManager::GetInstance().DelMeta(metaData.GetKeyWithoutPath()); MetaDataManager::GetInstance().DelMeta(metaData.GetKey(), true); MetaDataManager::GetInstance().DelMeta(metaData.GetKeyLocal(), true); MetaDataManager::GetInstance().DelMeta(metaData.GetSecretKey(), true); @@ -202,7 +207,7 @@ Status KVDBServiceImpl::Delete(const AppId &appId, const StoreId &storeId, int32 MetaDataManager::GetInstance().DelMeta(metaData.GetAutoLaunchKey(), true); MetaDataManager::GetInstance().DelMeta(metaData.GetDebugInfoKey(), true); MetaDataManager::GetInstance().DelMeta(metaData.GetCloneSecretKey(), true); - PermitDelegate::GetInstance().DelCache(metaData.GetKey()); + PermitDelegate::GetInstance().DelCache(metaData.GetKeyWithoutPath()); AutoCache::GetInstance().CloseStore(metaData.tokenId, storeId, metaData.user); ZLOGD("appId:%{public}s storeId:%{public}s instanceId:%{public}d", appId.appId.c_str(), Anonymous::Change(storeId.storeId).c_str(), metaData.instanceId); @@ -211,11 +216,12 @@ Status KVDBServiceImpl::Delete(const AppId &appId, const StoreId &storeId, int32 Status KVDBServiceImpl::Close(const AppId &appId, const StoreId &storeId, int32_t subUser) { - StoreMetaData metaData = GetStoreMetaData(appId, storeId, subUser); + StoreMetaData metaData = GetStoreMetaDataWithPath(appId, storeId, subUser); if (metaData.instanceId < 0) { return ILLEGAL_STATE; } - AutoCache::GetInstance().CloseStore(metaData.tokenId, storeId, metaData.user); + + AutoCache::GetInstance().CloseStore(metaData.tokenId, storeId, metaData.user, metaData.dataDir); ZLOGD("appId:%{public}s storeId:%{public}s instanceId:%{public}d", appId.appId.c_str(), Anonymous::Change(storeId.storeId).c_str(), metaData.instanceId); return SUCCESS; @@ -223,7 +229,7 @@ Status KVDBServiceImpl::Close(const AppId &appId, const StoreId &storeId, int32_ Status KVDBServiceImpl::CloudSync(const AppId &appId, const StoreId &storeId, const SyncInfo &syncInfo) { - StoreMetaData metaData = GetStoreMetaData(appId, storeId); + StoreMetaData metaData = GetStoreMetaDataWithPath(appId, storeId); if (!MetaDataManager::GetInstance().LoadMeta(metaData.GetKey(), metaData, true)) { ZLOGE("invalid, appId:%{public}s storeId:%{public}s", appId.appId.c_str(), Anonymous::Change(storeId.storeId).c_str()); @@ -244,7 +250,7 @@ void KVDBServiceImpl::OnAsyncComplete(uint32_t tokenId, uint64_t seqNum, Progres Status KVDBServiceImpl::Sync(const AppId &appId, const StoreId &storeId, int32_t subUser, SyncInfo &syncInfo) { StoreMetaData metaData = GetStoreMetaData(appId, storeId, subUser); - MetaDataManager::GetInstance().LoadMeta(metaData.GetKey(), metaData); + MetaDataManager::GetInstance().LoadMeta(metaData.GetKeyWithoutPath(), metaData); auto delay = GetSyncDelayTime(syncInfo.delay, storeId, metaData.user); if (metaData.isAutoSync && syncInfo.seqId == std::numeric_limits::max()) { DeviceMatrix::GetInstance().OnChanged(metaData); @@ -269,7 +275,7 @@ Status KVDBServiceImpl::Sync(const AppId &appId, const StoreId &storeId, int32_t Status KVDBServiceImpl::NotifyDataChange(const AppId &appId, const StoreId &storeId, uint64_t delay) { StoreMetaData meta = GetStoreMetaData(appId, storeId); - if (!MetaDataManager::GetInstance().LoadMeta(meta.GetKey(), meta)) { + if (!MetaDataManager::GetInstance().LoadMeta(meta.GetKeyWithoutPath(), meta)) { ZLOGE("invalid, appId:%{public}s storeId:%{public}s", appId.appId.c_str(), Anonymous::Change(storeId.storeId).c_str()); return Status::INVALID_ARGUMENT; @@ -297,13 +303,13 @@ Status KVDBServiceImpl::PutSwitch(const AppId &appId, const SwitchData &data) auto deviceId = DMAdapter::GetInstance().GetLocalDevice().uuid; SwitchesMetaData oldMeta; oldMeta.deviceId = deviceId; - bool exist = MetaDataManager::GetInstance().LoadMeta(oldMeta.GetKey(), oldMeta, true); + bool exist = MetaDataManager::GetInstance().LoadMeta(oldMeta.GetKey(), oldMeta, true); // 不需要 SwitchesMetaData newMeta; newMeta.value = data.value; newMeta.length = data.length; newMeta.deviceId = deviceId; if (!exist || newMeta != oldMeta) { - bool success = MetaDataManager::GetInstance().SaveMeta(newMeta.GetKey(), newMeta, true); + bool success = MetaDataManager::GetInstance().SaveMeta(newMeta.GetKey(), newMeta, true); // 不需要 if (success) { ZLOGI("start broadcast swicthes data"); DeviceMatrix::DataLevel level = { @@ -329,6 +335,7 @@ Status KVDBServiceImpl::GetSwitch(const AppId &appId, const std::string &network } SwitchesMetaData meta; meta.deviceId = uuid; + // 不需要 if (!MetaDataManager::GetInstance().LoadMeta(meta.GetKey(), meta, true)) { return Status::NOT_FOUND; } @@ -491,7 +498,7 @@ Status KVDBServiceImpl::EnableCapability(const AppId &appId, const StoreId &stor if (strategyMeta.instanceId < 0) { return ILLEGAL_STATE; } - MetaDataManager::GetInstance().LoadMeta(strategyMeta.GetKey(), strategyMeta); + MetaDataManager::GetInstance().LoadMeta(strategyMeta.GetKey(), strategyMeta); // 不需要 strategyMeta.capabilityEnabled = true; MetaDataManager::GetInstance().SaveMeta(strategyMeta.GetKey(), strategyMeta); return SUCCESS; @@ -503,7 +510,7 @@ Status KVDBServiceImpl::DisableCapability(const AppId &appId, const StoreId &sto if (strategyMeta.instanceId < 0) { return ILLEGAL_STATE; } - MetaDataManager::GetInstance().LoadMeta(strategyMeta.GetKey(), strategyMeta); + MetaDataManager::GetInstance().LoadMeta(strategyMeta.GetKey(), strategyMeta); // 不需要 strategyMeta.capabilityEnabled = false; MetaDataManager::GetInstance().SaveMeta(strategyMeta.GetKey(), strategyMeta); return SUCCESS; @@ -516,7 +523,7 @@ Status KVDBServiceImpl::SetCapability(const AppId &appId, const StoreId &storeId if (strategy.instanceId < 0) { return ILLEGAL_STATE; } - MetaDataManager::GetInstance().LoadMeta(strategy.GetKey(), strategy); + MetaDataManager::GetInstance().LoadMeta(strategy.GetKey(), strategy); // 不需要 strategy.capabilityRange.localLabel = local; strategy.capabilityRange.remoteLabel = remote; MetaDataManager::GetInstance().SaveMeta(strategy.GetKey(), strategy); @@ -527,7 +534,7 @@ Status KVDBServiceImpl::AddSubscribeInfo(const AppId &appId, const StoreId &stor const SyncInfo &syncInfo) { StoreMetaData metaData = GetStoreMetaData(appId, storeId, subUser); - MetaDataManager::GetInstance().LoadMeta(metaData.GetKey(), metaData); + MetaDataManager::GetInstance().LoadMeta(metaData.GetKeyWithoutPath(), metaData); auto delay = GetSyncDelayTime(syncInfo.delay, storeId, metaData.user); return KvStoreSyncManager::GetInstance()->AddSyncOperation(uintptr_t(metaData.tokenId), delay, std::bind(&KVDBServiceImpl::DoSyncInOrder, this, metaData, syncInfo, std::placeholders::_1, ACTION_SUBSCRIBE), @@ -538,7 +545,7 @@ Status KVDBServiceImpl::RmvSubscribeInfo(const AppId &appId, const StoreId &stor const SyncInfo &syncInfo) { StoreMetaData metaData = GetStoreMetaData(appId, storeId, subUser); - MetaDataManager::GetInstance().LoadMeta(metaData.GetKey(), metaData); + MetaDataManager::GetInstance().LoadMeta(metaData.GetKeyWithoutPath(), metaData); auto delay = GetSyncDelayTime(syncInfo.delay, storeId, metaData.user); return KvStoreSyncManager::GetInstance()->AddSyncOperation(uintptr_t(metaData.tokenId), delay, std::bind( @@ -552,7 +559,7 @@ Status KVDBServiceImpl::Subscribe(const AppId &appId, const StoreId &storeId, in if (observer == nullptr) { return INVALID_ARGUMENT; } - StoreMetaData metaData = GetStoreMetaData(appId, storeId, subUser); + StoreMetaData metaData = GetStoreMetaDataWithPath(appId, storeId, subUser); ZLOGI("appId:%{public}s storeId:%{public}s tokenId:0x%{public}x", appId.appId.c_str(), Anonymous::Change(storeId.storeId).c_str(), metaData.tokenId); bool isCreate = false; @@ -569,7 +576,7 @@ Status KVDBServiceImpl::Subscribe(const AppId &appId, const StoreId &storeId, in }); if (isCreate) { AutoCache::GetInstance().SetObserver(metaData.tokenId, storeId, - GetWatchers(metaData.tokenId, storeId, metaData.user), metaData.user); + GetWatchers(metaData.tokenId, storeId, metaData.user), metaData.user, metaData.dataDir); } return SUCCESS; } @@ -577,7 +584,7 @@ Status KVDBServiceImpl::Subscribe(const AppId &appId, const StoreId &storeId, in Status KVDBServiceImpl::Unsubscribe(const AppId &appId, const StoreId &storeId, int32_t subUser, sptr observer) { - StoreMetaData metaData = GetStoreMetaData(appId, storeId, subUser); + StoreMetaData metaData = GetStoreMetaDataWithPath(appId, storeId, subUser); ZLOGI("appId:%{public}s storeId:%{public}s tokenId:0x%{public}x", appId.appId.c_str(), Anonymous::Change(storeId.storeId).c_str(), metaData.tokenId); bool destroyed = false; @@ -601,7 +608,7 @@ Status KVDBServiceImpl::Unsubscribe(const AppId &appId, const StoreId &storeId, }); if (destroyed) { AutoCache::GetInstance().SetObserver(metaData.tokenId, storeId, - GetWatchers(metaData.tokenId, storeId, metaData.user), metaData.user); + GetWatchers(metaData.tokenId, storeId, metaData.user), metaData.user, metaData.dataDir); } return SUCCESS; } @@ -609,7 +616,7 @@ Status KVDBServiceImpl::Unsubscribe(const AppId &appId, const StoreId &storeId, Status KVDBServiceImpl::GetBackupPassword(const AppId &appId, const StoreId &storeId, int32_t subUser, std::vector> &passwords, int32_t passwordType) { - StoreMetaData metaData = GetStoreMetaData(appId, storeId, subUser); + StoreMetaData metaData = GetStoreMetaDataWithPath(appId, storeId, subUser); if (passwordType == KVDBService::PasswordType::BACKUP_SECRET_KEY) { std::vector backupPwd; bool res = BackupManager::GetInstance().GetPassWord(metaData, backupPwd); @@ -644,7 +651,7 @@ Status KVDBServiceImpl::GetBackupPassword(const AppId &appId, const StoreId &sto Status KVDBServiceImpl::SetConfig(const AppId &appId, const StoreId &storeId, const StoreConfig &storeConfig) { - StoreMetaData meta = GetStoreMetaData(appId, storeId); + StoreMetaData meta = GetStoreMetaDataWithPath(appId, storeId); auto isCreated = MetaDataManager::GetInstance().LoadMeta(meta.GetKey(), meta, true); if (!isCreated) { return SUCCESS; @@ -655,14 +662,14 @@ Status KVDBServiceImpl::SetConfig(const AppId &appId, const StoreId &storeId, co return Status::ERROR; } StoreMetaData syncMeta; - if (MetaDataManager::GetInstance().LoadMeta(meta.GetKey(), syncMeta)) { + if (MetaDataManager::GetInstance().LoadMeta(meta.GetKeyWithoutPath(), syncMeta)) { syncMeta.enableCloud = storeConfig.cloudConfig.enableCloud; syncMeta.cloudAutoSync = storeConfig.cloudConfig.autoSync; - if (!MetaDataManager::GetInstance().SaveMeta(syncMeta.GetKey(), syncMeta)) { + if (!MetaDataManager::GetInstance().SaveMeta(syncMeta.GetKeyWithoutPath(), syncMeta)) { return Status::ERROR; } } - auto stores = AutoCache::GetInstance().GetStoresIfPresent(meta.tokenId, storeId, meta.user); + auto stores = AutoCache::GetInstance().GetStoresIfPresent(meta.tokenId, storeId, meta.user, meta.dataDir); for (auto store : stores) { store->SetConfig({ storeConfig.cloudConfig.enableCloud }); } @@ -742,12 +749,15 @@ Status KVDBServiceImpl::AfterCreate( status = STORE_UPGRADE_FAILED; } } - + StoreMetaMapping storeMetaMapping(metaData); + MetaDataManager::GetInstance().LoadMeta(storeMetaMapping.GetKey(), storeMetaMapping, true); if (!isCreated || oldMeta != metaData) { if (!CheckerManager::GetInstance().IsDistrust(Converter::ConvertToStoreInfo(metaData))) { - MetaDataManager::GetInstance().SaveMeta(metaData.GetKey(), metaData); + MetaDataManager::GetInstance().SaveMeta(metaData.GetKeyWithoutPath(), metaData); } MetaDataManager::GetInstance().SaveMeta(metaData.GetKey(), metaData, true); + storeMetaMapping = metaData; + MetaDataManager::GetInstance().LoadMeta(storeMetaMapping.GetKey(), storeMetaMapping, true); } AppIDMetaData appIdMeta; appIdMeta.bundleName = metaData.bundleName; @@ -841,6 +851,7 @@ int32_t KVDBServiceImpl::ResolveAutoLaunch(const std::string &identifier, DBLaun } auto watchers = GetWatchers(storeMeta.tokenId, storeMeta.storeId, storeMeta.user); auto store = AutoCache::GetInstance().GetStore(storeMeta, watchers); + ZLOGE("mmy ResolveAutoLaunch, store:%{public}s", storeMeta.dataDir.c_str()); if (isTripleIdentifierEqual && store != nullptr) { store->SetEqualIdentifier(storeMeta.appId, storeMeta.storeId, accountId); } @@ -916,6 +927,15 @@ void KVDBServiceImpl::SaveLocalMetaData(const Options &options, const StoreMetaD MetaDataManager::GetInstance().SaveMeta(metaData.GetKeyLocal(), localMetaData, true); } +StoreMetaData KVDBServiceImpl::GetStoreMetaDataWithPath(const AppId &appId, const StoreId &storeId, int32_t subUser) +{ + StoreMetaData metaData = GetStoreMetaData(appId, storeId, subUser); + StoreMetaMapping storeMetaMapping(metaData); + MetaDataManager::GetInstance().LoadMeta(storeMetaMapping.GetKey(), storeMetaMapping, true); + metaData.dataDir = storeMetaMapping.dataDir; + return metaData; +} + StoreMetaData KVDBServiceImpl::GetStoreMetaData(const AppId &appId, const StoreId &storeId, int32_t subUser) { StoreMetaData metaData; @@ -1002,6 +1022,7 @@ Status KVDBServiceImpl::DoCloudSync(const StoreMetaData &meta, const SyncInfo &s storeInfo.user = atoi(meta.user.c_str()); storeInfo.tokenId = meta.tokenId; storeInfo.storeName = meta.storeId; + storeInfo.path = meta.dataDir; GenAsync syncCallback = [tokenId = storeInfo.tokenId, seqId = syncInfo.seqId, this](const GenDetails &details) { OnAsyncComplete(tokenId, seqId, HandleGenDetails(details)); }; @@ -1080,7 +1101,7 @@ bool KVDBServiceImpl::IsNeedMetaSync(const StoreMetaData &meta, const std::vecto if ((!MetaDataManager::GetInstance().LoadMeta(std::string(capKey.begin(), capKey.end()), capMeta) && !(devInfo.osType != OH_OS_TYPE && devInfo.deviceType == static_cast(DistributedHardware::DmDeviceType::DEVICE_TYPE_CAR))) || - !MetaDataManager::GetInstance().LoadMeta(metaData.GetKey(), metaData)) { + !MetaDataManager::GetInstance().LoadMeta(metaData.GetKeyWithoutPath(), metaData)) { isAfterMeta = true; break; } @@ -1105,7 +1126,7 @@ StoreMetaData KVDBServiceImpl::GetDistributedDataMeta(const std::string &deviceI meta.bundleName = Bootstrap::GetInstance().GetProcessLabel(); meta.storeId = Bootstrap::GetInstance().GetMetaDBName(); meta.user = DEFAULT_USER_ID; - if (!MetaDataManager::GetInstance().LoadMeta(meta.GetKey(), meta)) { + if (!MetaDataManager::GetInstance().LoadMeta(meta.GetKeyWithoutPath(), meta)) { ZLOGE("Load meta fail, device: %{public}s", Anonymous::Change(deviceId).c_str()); } return meta; @@ -1137,6 +1158,7 @@ Status KVDBServiceImpl::DoSyncBegin(const std::vector &devices, con RADAR_REPORT(STANDARD_DEVICE_SYNC, OPEN_STORE, RADAR_START, SYNC_STORE_ID, Anonymous::Change(meta.storeId), SYNC_APP_ID, meta.bundleName, CONCURRENT_ID, info.syncId, DATA_TYPE, meta.dataType); auto store = AutoCache::GetInstance().GetStore(meta, watcher); + ZLOGE("mmy DoSyncBegin, store:%{public}s", meta.dataDir.c_str()); if (store == nullptr) { ZLOGE("GetStore failed! appId:%{public}s storeId:%{public}s storeId length:%{public}zu dir:%{public}s", meta.bundleName.c_str(), Anonymous::Change(meta.storeId).c_str(), @@ -1487,9 +1509,10 @@ Status KVDBServiceImpl::RemoveDeviceData(const AppId &appId, const StoreId &stor const std::string &device) { StoreMetaData metaData = GetStoreMetaData(appId, storeId, subUser); - MetaDataManager::GetInstance().LoadMeta(metaData.GetKey(), metaData); + MetaDataManager::GetInstance().LoadMeta(metaData.GetKeyWithoutPath(), metaData); auto watcher = GetWatchers(metaData.tokenId, metaData.storeId, metaData.user); auto store = AutoCache::GetInstance().GetStore(metaData, watcher); + ZLOGE("mmy RemoveDeviceData, store:%{public}s", metaData.dataDir.c_str()); if (store == nullptr) { ZLOGE("GetStore failed! appId:%{public}s storeId:%{public}s dir:%{public}s", metaData.bundleName.c_str(), Anonymous::Change(metaData.storeId).c_str(), metaData.dataDir.c_str()); diff --git a/services/distributeddataservice/service/kvdb/kvdb_service_impl.h b/services/distributeddataservice/service/kvdb/kvdb_service_impl.h index 4604f8b56eac50623014bd56fe84f06167797057..dfcd90f4c9c957bf2e6036faf11040580356aa76 100644 --- a/services/distributeddataservice/service/kvdb/kvdb_service_impl.h +++ b/services/distributeddataservice/service/kvdb/kvdb_service_impl.h @@ -123,6 +123,7 @@ private: void Init(); void AddOptions(const Options &options, StoreMetaData &metaData); StoreMetaData GetStoreMetaData(const AppId &appId, const StoreId &storeId, int32_t subUser = 0); + StoreMetaData GetStoreMetaDataWithPath(const AppId &appId, const StoreId &storeId, int32_t subUser = 0); StoreMetaData GetDistributedDataMeta(const std::string &deviceId); StrategyMeta GetStrategyMeta(const AppId &appId, const StoreId &storeId, int32_t subUser = 0); int32_t GetInstIndex(uint32_t tokenId, const AppId &appId); diff --git a/services/distributeddataservice/service/object/src/object_asset_machine.cpp b/services/distributeddataservice/service/object/src/object_asset_machine.cpp index 4bb56de3d08f4608916d250467e34ab28bd5d0ac..f37ee4c6729036d6988167f1a807acc584d832b1 100644 --- a/services/distributeddataservice/service/object/src/object_asset_machine.cpp +++ b/services/distributeddataservice/service/object/src/object_asset_machine.cpp @@ -296,7 +296,8 @@ static AutoCache::Store GetStore(const ChangedAssetInfo& changedAsset) meta.user = std::to_string(changedAsset.storeInfo.user); meta.instanceId = changedAsset.storeInfo.instanceId; meta.deviceId = DmAdapter::GetInstance().GetLocalDevice().uuid; - if (!MetaDataManager::GetInstance().LoadMeta(meta.GetKey(), meta)) { + // 访问的是sync表 + if (!MetaDataManager::GetInstance().LoadMeta(meta.GetKeyWithoutPath(), meta)) { ZLOGE("meta empty, bundleName:%{public}s, storeId:%{public}s", meta.bundleName.c_str(), meta.GetStoreAlias().c_str()); return nullptr; diff --git a/services/distributeddataservice/service/object/src/object_service_impl.cpp b/services/distributeddataservice/service/object/src/object_service_impl.cpp index 5df3363c770e7da4ee9908f7d845c8cc698372f5..9927bcd5e821b6f1b6c90368116054179f61e5a3 100644 --- a/services/distributeddataservice/service/object/src/object_service_impl.cpp +++ b/services/distributeddataservice/service/object/src/object_service_impl.cpp @@ -170,7 +170,7 @@ int32_t ObjectServiceImpl::SaveMetaData(StoreMetaData &saveMeta, const std::stri saveMeta.storeType = ObjectDistributedType::OBJECT_SINGLE_VERSION; saveMeta.dataType = DistributedKv::DataType::TYPE_DYNAMICAL; saveMeta.dataDir = DistributedData::DirectoryManager::GetInstance().GetStorePath(saveMeta); - bool isSaved = DistributedData::MetaDataManager::GetInstance().SaveMeta(saveMeta.GetKey(), saveMeta) && + bool isSaved = DistributedData::MetaDataManager::GetInstance().SaveMeta(saveMeta.GetKeyWithoutPath(), saveMeta) && DistributedData::MetaDataManager::GetInstance().SaveMeta(saveMeta.GetKey(), saveMeta, true); if (!isSaved) { ZLOGE("SaveMeta failed"); @@ -352,7 +352,7 @@ ObjectServiceImpl::ObjectServiceImpl() meta.bundleName = eventInfo.bundleName; meta.user = std::to_string(eventInfo.user); meta.deviceId = DmAdapter::GetInstance().GetLocalDevice().uuid; - if (!MetaDataManager::GetInstance().LoadMeta(meta.GetKey(), meta)) { + if (!MetaDataManager::GetInstance().LoadMeta(meta.GetKeyWithoutPath(), meta)) { ZLOGE("meta empty, bundleName:%{public}s, storeId:%{public}s", meta.bundleName.c_str(), meta.GetStoreAlias().c_str()); return; diff --git a/services/distributeddataservice/service/permission/src/permit_delegate.cpp b/services/distributeddataservice/service/permission/src/permit_delegate.cpp index d3d020871aa37876f4d22cfe0f885792e3b23a8a..8879b2da2dba84edf77c04a63339509cfe0d491e 100644 --- a/services/distributeddataservice/service/permission/src/permit_delegate.cpp +++ b/services/distributeddataservice/service/permission/src/permit_delegate.cpp @@ -102,13 +102,13 @@ bool PermitDelegate::VerifyPermission(const CheckParam ¶m, uint8_t flag) } return !value.empty(); }); - auto key = data.GetKey(); + auto key = data.GetKeyWithoutPath(); if (!metaDataBucket_.Get(key, data)) { if (!MetaDataManager::GetInstance().LoadMeta(key, data)) { ZLOGE("load meta failed."); return false; } - metaDataBucket_.Set(data.GetKey(), data); + metaDataBucket_.Set(data.GetKeyWithoutPath(), data); } if (data.appType.compare("default") == 0) { ZLOGD("default, sync permission success."); diff --git a/services/distributeddataservice/service/rdb/rdb_general_store.cpp b/services/distributeddataservice/service/rdb/rdb_general_store.cpp index ba0299bddaf21e6f970eafa881b5f75cc9b772aa..687b5b5f31ff5fc6b3b03a15384dbcc31636e30f 100644 --- a/services/distributeddataservice/service/rdb/rdb_general_store.cpp +++ b/services/distributeddataservice/service/rdb/rdb_general_store.cpp @@ -162,7 +162,7 @@ RdbGeneralStore::RdbGeneralStore(const StoreMetaData &meta) RelationalStoreDelegate::Option option = GetOption(meta); option.observer = &observer_; if (meta.isEncrypt) { - std::string key = meta.GetSecretKey(); + std::string key = meta.GetSecretKey(); // 这个meta是否有path? SecretKeyMetaData secretKeyMeta; MetaDataManager::GetInstance().LoadMeta(key, secretKeyMeta, true); std::vector decryptKey; diff --git a/services/distributeddataservice/service/rdb/rdb_service_impl.cpp b/services/distributeddataservice/service/rdb/rdb_service_impl.cpp index 9f988905d8f1a601476cce2d559a5743cd2a4d27..5a59bcef4bf8efafadc04eb2536bf86d81c8ca36 100644 --- a/services/distributeddataservice/service/rdb/rdb_service_impl.cpp +++ b/services/distributeddataservice/service/rdb/rdb_service_impl.cpp @@ -109,7 +109,9 @@ RdbServiceImpl::RdbServiceImpl() auto &evt = static_cast(event); auto &storeInfo = evt.GetStoreInfo(); StoreMetaData meta(storeInfo); + ZLOGE("mmy RdbServiceImpl1, store:%{public}s storeInfo_path:%{public}s", meta.dataDir.c_str(), storeInfo.path.c_str()); meta.deviceId = DmAdapter::GetInstance().GetLocalDevice().uuid; + meta.dataDir = storeInfo.path; if (!MetaDataManager::GetInstance().LoadMeta(meta.GetKey(), meta, true)) { ZLOGE("meta empty, bundleName:%{public}s, storeId:%{public}s", meta.bundleName.c_str(), meta.GetStoreAlias().c_str()); @@ -121,6 +123,7 @@ RdbServiceImpl::RdbServiceImpl() } auto watchers = GetWatchers(meta.tokenId, meta.storeId); auto store = AutoCache::GetInstance().GetStore(meta, watchers); + ZLOGE("mmy RdbServiceImpl, store:%{public}s storeInfo_path:%{public}s", meta.dataDir.c_str(), storeInfo.path.c_str()); if (store == nullptr) { ZLOGE("store null, storeId:%{public}s", meta.GetStoreAlias().c_str()); return; @@ -186,6 +189,7 @@ int32_t RdbServiceImpl::ResolveAutoLaunch(const std::string &identifier, Distrib GetDBPassword(entry, param.option.passwd); } AutoCache::GetInstance().GetStore(entry, GetWatchers(entry.tokenId, entry.storeId)); + // ZLOGE("mmy ResolveAutoLaunch, store:%{public}s", entry.dataDir.c_str()); return true; } ZLOGE("not find identifier"); @@ -313,9 +317,11 @@ int32_t RdbServiceImpl::InitNotifier(const RdbSyncerParam ¶m, const sptr RdbServiceImpl::GetStore(const RdbSyncerParam ¶m) { StoreMetaData storeMetaData = GetStoreMetaData(param); + // 有path直接使用新key MetaDataManager::GetInstance().LoadMeta(storeMetaData.GetKey(), storeMetaData, true); auto watchers = GetWatchers(storeMetaData.tokenId, storeMetaData.storeId); auto store = AutoCache::GetInstance().GetStore(storeMetaData, watchers); + ZLOGE("mmy RdbServiceImpl::GetStore, store:%{public}s", storeMetaData.dataDir.c_str()); if (store == nullptr) { ZLOGE("store null, storeId:%{public}s", storeMetaData.GetStoreAlias().c_str()); } @@ -324,14 +330,16 @@ std::shared_ptr RdbServiceImpl::GetStore(const Rd void RdbServiceImpl::UpdateMeta(const StoreMetaData &meta, const StoreMetaData &localMeta, AutoCache::Store store) { + // meta是有path的 StoreMetaData syncMeta; - bool isCreatedSync = MetaDataManager::GetInstance().LoadMeta(meta.GetKey(), syncMeta); + // 查询的是sync表,不需要带path + bool isCreatedSync = MetaDataManager::GetInstance().LoadMeta(meta.GetKeyWithoutPath(), syncMeta); if (!isCreatedSync || localMeta != syncMeta) { ZLOGI("save sync meta. bundle:%{public}s store:%{public}s type:%{public}d->%{public}d " "encrypt:%{public}d->%{public}d , area:%{public}d->%{public}d", meta.bundleName.c_str(), meta.GetStoreAlias().c_str(), syncMeta.storeType, meta.storeType, syncMeta.isEncrypt, meta.isEncrypt, syncMeta.area, meta.area); - MetaDataManager::GetInstance().SaveMeta(meta.GetKey(), localMeta); + MetaDataManager::GetInstance().SaveMeta(meta.GetKeyWithoutPath(), localMeta); } Database dataBase; if (RdbSchemaConfig::GetDistributedSchema(localMeta, dataBase) && !dataBase.name.empty() && @@ -363,13 +371,19 @@ int32_t RdbServiceImpl::SetDistributedTables(const RdbSyncerParam ¶m, const return RDB_ERROR; } auto store = GetStore(param); + ZLOGE("mmy SetDistributedTables, store:%{public}s", meta.dataDir.c_str()); if (store == nullptr) { ZLOGE("bundleName:%{public}s, storeName:%{public}s. GetStore failed", param.bundleName_.c_str(), Anonymous::Change(param.storeName_).c_str()); return RDB_ERROR; } + StoreMetaMapping metaMapping(localMeta); + MetaDataManager::GetInstance().LoadMeta(metaMapping.GetKey(), metaMapping, true); if (type == DistributedTableType::DISTRIBUTED_DEVICE) { UpdateMeta(meta, localMeta, store); + if (metaMapping.devicePath != meta.dataDir) { + metaMapping.devicePath = meta.dataDir; + } } else if (type == DistributedTableType::DISTRIBUTED_CLOUD) { if (localMeta.asyncDownloadAsset != param.asyncDownloadAsset_ || localMeta.enableCloud != param.enableCloud_) { ZLOGI("update meta, bundleName:%{public}s, storeName:%{public}s, asyncDownloadAsset? [%{public}d -> " @@ -380,7 +394,12 @@ int32_t RdbServiceImpl::SetDistributedTables(const RdbSyncerParam ¶m, const localMeta.enableCloud = param.enableCloud_; MetaDataManager::GetInstance().SaveMeta(localMeta.GetKey(), localMeta, true); } + if (metaMapping.cloudPath != meta.dataDir) { + metaMapping.cloudPath = meta.dataDir; + } } + static_cast(metaMapping) = localMeta; + MetaDataManager::GetInstance().SaveMeta(metaMapping.GetKey(), metaMapping, true); std::vector relationships; for (const auto &reference : references) { DistributedData::Reference relationship = { reference.sourceTable, reference.targetTable, reference.refFields }; @@ -549,7 +568,7 @@ bool RdbServiceImpl::IsNeedMetaSync(const StoreMetaData &meta, const std::vector CapMetaData capMeta; auto capKey = CapMetaRow::GetKeyFor(uuid); if (!MetaDataManager::GetInstance().LoadMeta(std::string(capKey.begin(), capKey.end()), capMeta) || - !MetaDataManager::GetInstance().LoadMeta(metaData.GetKey(), metaData)) { + !MetaDataManager::GetInstance().LoadMeta(metaData.GetKeyWithoutPath(), metaData)) { isAfterMeta = true; break; } @@ -583,6 +602,7 @@ RdbServiceImpl::SyncResult RdbServiceImpl::ProcessResult(const std::map(metaMapping) = meta; + MetaDataManager::GetInstance().SaveMeta(metaMapping.GetKey(), metaMapping, true); + SaveDebugInfo(meta, param); SavePromiseInfo(meta, param); SaveDfxInfo(meta, param); @@ -948,6 +981,8 @@ void RdbServiceImpl::GetSchema(const RdbSyncerParam ¶m) storeInfo.instanceId = instanceId; storeInfo.user = user; storeInfo.deviceId = DmAdapter::GetInstance().GetLocalDevice().uuid; + auto meta = GetStoreMetaData(param); + storeInfo.path = meta.dataDir; executors_->Execute([storeInfo]() { auto event = std::make_unique(CloudEvent::GET_SCHEMA, std::move(storeInfo)); EventCenter::GetInstance().PostEvent(move(event)); @@ -1000,6 +1035,7 @@ int32_t RdbServiceImpl::SetSecretKey(const RdbSyncerParam ¶m, const StoreMet } auto time = system_clock::to_time_t(system_clock::now()); newSecretKey.time = { reinterpret_cast(&time), reinterpret_cast(&time) + sizeof(time) }; + // 有path使用新key,meta是能获取到path的,是afteropen的meta return MetaDataManager::GetInstance().SaveMeta(meta.GetSecretKey(), newSecretKey, true) ? RDB_OK : RDB_ERROR; } @@ -1049,8 +1085,7 @@ bool RdbServiceImpl::GetDBPassword(const StoreMetaData &metaData, DistributedDB: if (!metaData.isEncrypt) { return true; } - - std::string key = metaData.GetSecretKey(); + std::string key = metaData.GetSecretKey(); // 这里是从数据库load出来的,有path DistributedData::SecretKeyMetaData secretKeyMeta; MetaDataManager::GetInstance().LoadMeta(key, secretKeyMeta, true); std::vector decryptKey; @@ -1109,7 +1144,10 @@ StoreMetaData RdbServiceImpl::GetStoreMetaData(const Database &dataBase) storeMetaData.tokenId = tokenId; auto [instanceId, user] = GetInstIndexAndUser(storeMetaData.tokenId, storeMetaData.bundleName); storeMetaData.instanceId = instanceId; - MetaDataManager::GetInstance().LoadMeta(storeMetaData.GetKey(), storeMetaData, true); + StoreMetaMapping storeMetaMapping(storeMetaData); + MetaDataManager::GetInstance().LoadMeta(storeMetaMapping.GetKey(), storeMetaMapping, true); + storeMetaData.dataDir = storeMetaMapping.cloudPath; + MetaDataManager::GetInstance().LoadMeta(storeMetaData.GetKey(), storeMetaData, true); // 通过映射表获取 return storeMetaData; } @@ -1133,12 +1171,14 @@ std::vector RdbServiceImpl::GetReuseDevice(const std::vector &devices, const Database &dataBase, std::vector tables) { StoreMetaData storeMetaData = GetStoreMetaData(dataBase); auto tokenId = storeMetaData.tokenId; auto store = GetStore(storeMetaData); + ZLOGE("mmy DoAutoSync, store:%{public}s", storeMetaData.dataDir.c_str()); if (store == nullptr) { ZLOGE("autosync store null, storeId:%{public}s", storeMetaData.GetStoreAlias().c_str()); return RDB_ERROR; @@ -1350,6 +1390,7 @@ int RdbServiceImpl::DoDataChangeSync(const StoreInfo &storeInfo, const RdbChange dataBase.name = storeInfo.storeName; dataBase.user = std::to_string(storeInfo.user); dataBase.deviceId = storeInfo.deviceId; + for (const auto &[key, value] : rdbChangedData.tableData) { if (value.isP2pSyncDataChange) { tableNames.push_back(key); @@ -1379,6 +1420,10 @@ int32_t RdbServiceImpl::NotifyDataChange( storeInfo.tokenId = IPCSkeleton::GetCallingTokenID(); storeInfo.bundleName = param.bundleName_; storeInfo.storeName = RemoveSuffix(param.storeName_); + auto meta = GetStoreMetaData(param); + storeInfo.path = meta.dataDir; // 这个path需不需要和meta保持一致?需要,因为搜索要获取元数据信息 + // 我们只需要把path传下去,做不做搜索是由搜索自身逻辑去判断,还是说我这里取出的path就是搜索需要的path + // ZLOGE("mmy storeInfo.path:%{public}s", storeInfo.path.c_str()); auto [instanceId, user] = GetInstIndexAndUser(storeInfo.tokenId, param.bundleName_); storeInfo.instanceId = instanceId; storeInfo.user = user; @@ -1386,7 +1431,8 @@ int32_t RdbServiceImpl::NotifyDataChange( DataChangeEvent::EventInfo eventInfo; eventInfo.isFull = rdbNotifyConfig.isFull_; if (!DoDataChangeSync(storeInfo, rdbChangedData)) { - ZLOGE("store datachange sync fail, storeId:%{public}s", storeInfo.storeName.c_str()); + ZLOGE("store datachange sync fail, storeId:%{public}s, path:%{public}s", + storeInfo.storeName.c_str(), storeInfo.path.c_str()); } for (const auto &[key, value] : rdbChangedData.tableData) { if (value.isTrackedDataChange) { @@ -1394,7 +1440,8 @@ int32_t RdbServiceImpl::NotifyDataChange( eventInfo.tableProperties.insert_or_assign(key, std::move(tableChangeProperties)); } } - if (IsPostImmediately(IPCSkeleton::GetCallingPid(), rdbNotifyConfig, storeInfo, eventInfo, param.storeName_)) { + if (IsPostImmediately(IPCSkeleton::GetCallingPid(), rdbNotifyConfig, storeInfo, eventInfo, storeInfo.path)) { + ZLOGE("mmy PostEvent path:%{public}s", storeInfo.path.c_str()); auto evt = std::make_unique(std::move(storeInfo), std::move(eventInfo)); EventCenter::GetInstance().PostEvent(std::move(evt)); } @@ -1402,12 +1449,12 @@ int32_t RdbServiceImpl::NotifyDataChange( } bool RdbServiceImpl::IsPostImmediately(const int32_t callingPid, const RdbNotifyConfig &rdbNotifyConfig, - StoreInfo &storeInfo, DataChangeEvent::EventInfo &eventInfo, const std::string &storeName) + StoreInfo &storeInfo, DataChangeEvent::EventInfo &eventInfo, const std::string &path) { bool postImmediately = false; heartbeatTaskIds_.Compute(callingPid, [this, &postImmediately, &rdbNotifyConfig, &storeInfo, &eventInfo, - &storeName](const int32_t &key, std::map &tasks) { - auto iter = tasks.find(storeName); + &path](const int32_t &key, std::map &tasks) { + auto iter = tasks.find(path); ExecutorPool::TaskId taskId = ExecutorPool::INVALID_TASK_ID; if (iter != tasks.end()) { taskId = iter->second; @@ -1417,7 +1464,7 @@ bool RdbServiceImpl::IsPostImmediately(const int32_t callingPid, const RdbNotify executors_->Remove(taskId); } postImmediately = true; - tasks.erase(storeName); + tasks.erase(path); return !tasks.empty(); } @@ -1432,9 +1479,10 @@ bool RdbServiceImpl::IsPostImmediately(const int32_t callingPid, const RdbNotify taskId = executors_->Reset(taskId, std::chrono::milliseconds(rdbNotifyConfig.delay_)); } } - tasks.insert_or_assign(storeName, taskId); + tasks.insert_or_assign(path, taskId); return true; }); + ZLOGE("mmy IsPostImmediately postImmediately %{public}d", postImmediately); return postImmediately; } @@ -1462,7 +1510,8 @@ int32_t RdbServiceImpl::PostSearchEvent(int32_t evtId, const RdbSyncerParam& par storeInfo.instanceId = instanceId; storeInfo.user = user; storeInfo.deviceId = DmAdapter::GetInstance().GetLocalDevice().uuid; - + auto meta = GetStoreMetaData(param); + storeInfo.path = meta.dataDir; auto evt = std::make_unique(std::move(storeInfo), std::move(eventInfo), evtId); EventCenter::GetInstance().PostEvent(std::move(evt)); return RDB_OK; @@ -1671,6 +1720,7 @@ int32_t RdbServiceImpl::SavePromiseInfo(const StoreMetaData &metaData, const Rdb localMeta.promiseInfo.tokenIds = param.tokenIds_; localMeta.promiseInfo.uids = param.uids_; localMeta.promiseInfo.permissionNames = param.permissionNames_; + // 有path使用新key MetaDataManager::GetInstance().SaveMeta(metaData.GetKeyLocal(), localMeta, true); return RDB_OK; } @@ -1683,7 +1733,7 @@ int32_t RdbServiceImpl::VerifyPromiseInfo(const RdbSyncerParam ¶m) auto uid = IPCSkeleton::GetCallingUid(); meta.user = param.user_; StoreMetaDataLocal localMeta; - auto isCreated = MetaDataManager::GetInstance().LoadMeta(meta.GetKeyLocal(), localMeta, true); + auto isCreated = MetaDataManager::GetInstance().LoadMeta(meta.GetKeyLocal(), localMeta, true); // 升级上来的,可以使用新key if (!isCreated) { ZLOGE("Store not exist. bundleName:%{public}s, storeName:%{public}s", meta.bundleName.c_str(), meta.storeId.c_str()); @@ -1730,7 +1780,7 @@ bool RdbServiceImpl::TryUpdateDeviceId(const RdbSyncerParam ¶m, const StoreM StoreMetaData syncMeta; if (oldMeta.isNeedUpdateDeviceId && oldMeta.storeType >= StoreMetaData::StoreType::STORE_RELATIONAL_BEGIN && oldMeta.storeType <= StoreMetaData::StoreType::STORE_RELATIONAL_END && - MetaDataManager::GetInstance().LoadMeta(meta.GetKey(), syncMeta)) { + MetaDataManager::GetInstance().LoadMeta(meta.GetKeyWithoutPath(), syncMeta)) { auto store = GetStore(param); if (store == nullptr) { ZLOGE("store is null, bundleName:%{public}s storeName:%{public}s", param.bundleName_.c_str(), diff --git a/services/distributeddataservice/service/udmf/store/runtime_store.cpp b/services/distributeddataservice/service/udmf/store/runtime_store.cpp index 60e59ff40b93700eed9fbde7e7822c52be28c3a4..36a3894a9fd2c5ab867b39a757cce1c5208249b0 100644 --- a/services/distributeddataservice/service/udmf/store/runtime_store.cpp +++ b/services/distributeddataservice/service/udmf/store/runtime_store.cpp @@ -12,6 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +#include "metadata/store_meta_data.h" #define LOG_TAG "RuntimeStore" #include "runtime_store.h" @@ -509,12 +510,12 @@ bool RuntimeStore::SaveMetaData() DistributedData::StoreMetaData loadLocal; DistributedData::StoreMetaData syncMeta; if (DistributedData::MetaDataManager::GetInstance().LoadMeta(saveMeta.GetKey(), loadLocal, true) && - DistributedData::MetaDataManager::GetInstance().LoadMeta(saveMeta.GetKey(), syncMeta, false)) { + DistributedData::MetaDataManager::GetInstance().LoadMeta(saveMeta.GetKeyLocalWithoutPath(), syncMeta, false)) { ZLOGD("Meta data is already saved."); return true; } - auto saved = DistributedData::MetaDataManager::GetInstance().SaveMeta(saveMeta.GetKey(), saveMeta) && + auto saved = DistributedData::MetaDataManager::GetInstance().SaveMeta(saveMeta.GetKeyWithoutPath(), saveMeta) && DistributedData::MetaDataManager::GetInstance().SaveMeta(saveMeta.GetKey(), saveMeta, true); if (!saved) { ZLOGE("SaveMeta failed, saveMeta.key:%{public}s", saveMeta.GetKey().c_str());