From 541b55471b4775a2a848a83c9236af3a9c37d4c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=81=E5=86=AC=E5=86=AC?= Date: Thu, 16 May 2024 20:52:14 +0800 Subject: [PATCH] modify meta sync MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 丁冬冬 --- .../app/src/kvstore_meta_manager.cpp | 73 +++++++++---------- .../app/src/kvstore_meta_manager.h | 4 +- .../distributeddataservice/app/test/BUILD.gn | 12 +++ .../include/metadata/meta_data_manager.h | 5 +- .../framework/metadata/meta_data_manager.cpp | 53 +++++++++++++- .../framework/test/BUILD.gn | 7 ++ .../service/cloud/sync_manager.cpp | 3 +- .../service/kvdb/kvdb_general_store.cpp | 16 ++-- .../service/kvdb/kvdb_general_store.h | 3 +- .../service/kvdb/kvdb_service_impl.cpp | 5 ++ .../service/kvdb/user_delegate.cpp | 8 +- .../service/matrix/src/auto_sync_matrix.cpp | 14 ++-- .../service/matrix/src/device_matrix.cpp | 10 ++- .../service/test/BUILD.gn | 7 ++ .../service/test/device_matrix_test.cpp | 2 +- .../waterversion/water_version_manager.h | 4 +- 16 files changed, 159 insertions(+), 67 deletions(-) diff --git a/services/distributeddataservice/app/src/kvstore_meta_manager.cpp b/services/distributeddataservice/app/src/kvstore_meta_manager.cpp index c3466956c..f05ad7d8f 100644 --- a/services/distributeddataservice/app/src/kvstore_meta_manager.cpp +++ b/services/distributeddataservice/app/src/kvstore_meta_manager.cpp @@ -22,6 +22,7 @@ #include "account_delegate.h" #include "bootstrap.h" +#include "cloud/change_event.h" #include "communication_provider.h" #include "crypto_manager.h" #include "device_manager_adapter.h" @@ -32,13 +33,17 @@ #include "log_print.h" #include "matrix_event.h" #include "metadata/meta_data_manager.h" +#include "metadata/store_meta_data_local.h" #include "metadata/version_meta_data.h" #include "runtime_config.h" +#include "store/general_store.h" +#include "store/store_info.h" #include "utils/anonymous.h" #include "utils/block_integer.h" #include "utils/crypto.h" #include "utils/ref_count.h" #include "utils/converter.h" +#include "water_version_manager.h" namespace OHOS { namespace DistributedKv { @@ -87,15 +92,7 @@ void KvStoreMetaManager::InitMetaListener() ZLOGW("register metaMgr failed: %{public}d.", status); return; } - status = DmAdapter::GetInstance().StartWatchDeviceChange(&dbInfoListener_, { "notifyDbInfos" }); - if (status != AppDistributedKv::Status::SUCCESS) { - ZLOGW("register notifyDbInfos failed: %{public}d.", status); - return; - } - ZLOGI("register metaMgr and notifyDbInfos device change success."); - SubscribeMetaKvStore(); - SyncMeta(); InitBroadcast(); InitDeviceOnline(); NotifyAllAutoSyncDBInfo(); @@ -185,6 +182,7 @@ void KvStoreMetaManager::InitMetaData() data.isAutoSync = false; data.isBackup = false; data.isEncrypt = false; + data.isNeedCompress = true; data.storeType = KvStoreType::SINGLE_VERSION; data.dataType = DataType::TYPE_DYNAMICAL; data.schema = ""; @@ -195,12 +193,20 @@ void KvStoreMetaManager::InitMetaData() data.securityLevel = SecurityLevel::S1; data.area = EL1; data.tokenId = tokenId; + StoreMetaDataLocal localData; + localData.isAutoSync = false; + localData.isBackup = false; + localData.isEncrypt = false; + localData.dataDir = metaDBDirectory_; + localData.schema = ""; + localData.isPublic = true; if (!(MetaDataManager::GetInstance().SaveMeta(data.GetKey(), data) && - MetaDataManager::GetInstance().SaveMeta(data.GetKey(), data, true))) { + MetaDataManager::GetInstance().SaveMeta(data.GetKey(), data, true) && + MetaDataManager::GetInstance().SaveMeta(data.GetKeyLocal(), localData, true))) { ZLOGE("save meta fail"); } UpdateMetaData(); - SetSyncer(); + SetCloudSyncer(); ZLOGI("end."); } @@ -321,6 +327,25 @@ KvStoreMetaManager::NbDelegate KvStoreMetaManager::CreateMetaKvStore() return NbDelegate(delegate, release); } +void KvStoreMetaManager::SetCloudSyncer() +{ + auto cloudSyncer = []() { + DeviceMatrix::GetInstance().OnChanged(DeviceMatrix::META_STORE_MASK); + auto bundleName = Bootstrap::GetInstance().GetProcessLabel(); + auto storeName = Bootstrap::GetInstance().GetMetaDBName(); + WaterVersionManager::GetInstance().GenerateWaterVersion(bundleName, storeName); + DistributedData::StoreInfo storeInfo; + storeInfo.bundleName = bundleName; + storeInfo.storeName = storeName; + auto mixMode = static_cast(GeneralStore::MixMode(GeneralStore::CLOUD_TIME_FIRST, + GeneralStore::AUTO_SYNC_MODE)); + auto info = ChangeEvent::EventInfo(mixMode, 0, true, nullptr, nullptr); + auto evt = std::make_unique(std::move(storeInfo), std::move(info)); + EventCenter::GetInstance().PostEvent(std::move(evt)); + }; + MetaDataManager::GetInstance().SetCloudSyncer(cloudSyncer); +} + void KvStoreMetaManager::SetSyncer() { auto syncer = [this](const auto &store, int32_t status) { @@ -372,33 +397,6 @@ std::function KvStoreMetaManager::SyncTask(const NbDelegate &store, int3 }; } -void KvStoreMetaManager::SyncMeta() -{ - std::vector devs; - auto deviceList = DmAdapter::GetInstance().GetRemoteDevices(); - for (auto const &dev : deviceList) { - devs.push_back(dev.uuid); - } - - if (devs.empty()) { - ZLOGW("meta db sync fail, devices is empty."); - return; - } - - auto metaDelegate = GetMetaKvStore(); - if (metaDelegate == nullptr) { - ZLOGW("meta db sync failed."); - return; - } - auto onComplete = [this](const std::map &) { - ZLOGD("meta db sync complete end."); - }; - auto dbStatus = metaDelegate->Sync(devs, DistributedDB::SyncMode::SYNC_MODE_PUSH_PULL, onComplete); - if (dbStatus != DistributedDB::OK) { - ZLOGW("meta db sync failed, error is %{public}d.", dbStatus); - } -} - void KvStoreMetaManager::SubscribeMetaKvStore() { auto metaDelegate = GetMetaKvStore(); @@ -569,7 +567,6 @@ void KvStoreMetaManager::DBInfoDeviceChangeListenerImpl::OnDeviceChanged(const A ZLOGD("Network change, ignore"); return; } - KvStoreMetaManager::GetInstance().SyncMeta(); KvStoreMetaManager::GetInstance().OnDeviceChange(info.uuid); } diff --git a/services/distributeddataservice/app/src/kvstore_meta_manager.h b/services/distributeddataservice/app/src/kvstore_meta_manager.h index a2355edd1..a7418ce1d 100644 --- a/services/distributeddataservice/app/src/kvstore_meta_manager.h +++ b/services/distributeddataservice/app/src/kvstore_meta_manager.h @@ -65,6 +65,8 @@ private: void SetSyncer(); + void SetCloudSyncer(); + KvStoreMetaManager(); void InitMetaData(); @@ -73,8 +75,6 @@ private: void SubscribeMetaKvStore(); - void SyncMeta(); - void NotifyAllAutoSyncDBInfo(); void OnDataChange(CHANGE_FLAG flag, const std::list& changedData); diff --git a/services/distributeddataservice/app/test/BUILD.gn b/services/distributeddataservice/app/test/BUILD.gn index a57069443..4eff9a12f 100644 --- a/services/distributeddataservice/app/test/BUILD.gn +++ b/services/distributeddataservice/app/test/BUILD.gn @@ -140,6 +140,12 @@ ohos_unittest("SessionManagerTest") { "unittest/session_manager_test.cpp", ] + sanitize = { + cfi = true + cfi_cross_dso = true + debug = false + } + cflags_cc = [ "-DUT_TEST" ] configs = [ ":module_private_config" ] @@ -236,6 +242,12 @@ ohos_unittest("KvStoreDataServiceClearTest") { "unittest/kvstore_data_service_clear_test.cpp", ] + sanitize = { + cfi = true + cfi_cross_dso = true + debug = false + } + configs = [ ":module_private_config" ] external_deps = [ diff --git a/services/distributeddataservice/framework/include/metadata/meta_data_manager.h b/services/distributeddataservice/framework/include/metadata/meta_data_manager.h index b1588b705..4c5fb8698 100644 --- a/services/distributeddataservice/framework/include/metadata/meta_data_manager.h +++ b/services/distributeddataservice/framework/include/metadata/meta_data_manager.h @@ -47,12 +47,14 @@ public: using MetaStore = DistributedDB::KvStoreNbDelegate; using Observer = std::function; using Syncer = std::function &, int32_t)>; + using CloudSyncer = std::function; using Backup = std::function &)>; using Bytes = std::vector; using OnComplete = std::function &)>; API_EXPORT static MetaDataManager &GetInstance(); API_EXPORT void Initialize(std::shared_ptr metaStore, const Backup &backup); 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 LoadMeta(const std::string &key, Serializable &value, bool isLocal = false); template @@ -90,6 +92,7 @@ private: ConcurrentMap> metaObservers_; Backup backup_; Syncer syncer_; + CloudSyncer cloudSyncer_; }; } // namespace OHOS::DistributedData -#endif // OHOS_DISTRIBUTED_DATA_SERVICES_FRAMEWORK_METADATA_META_DATA_MANAGER_H +#endif // OHOS_DISTRIBUTED_DATA_SERVICES_FRAMEWORK_METADATA_META_DATA_MANAGER_H \ No newline at end of file diff --git a/services/distributeddataservice/framework/metadata/meta_data_manager.cpp b/services/distributeddataservice/framework/metadata/meta_data_manager.cpp index 1e8cd74fb..1f77a82b3 100644 --- a/services/distributeddataservice/framework/metadata/meta_data_manager.cpp +++ b/services/distributeddataservice/framework/metadata/meta_data_manager.cpp @@ -26,13 +26,18 @@ public: using Filter = MetaDataManager::Filter; using MetaStore = MetaDataManager::MetaStore; using Observer = MetaDataManager::Observer; + using DBOrigin = DistributedDB::Origin; + using DBChangeData = DistributedDB::ChangedData; + using Type = DistributedDB::Type; MetaObserver(std::shared_ptr metaStore, std::shared_ptr filter, Observer observer, bool isLocal = false); virtual ~MetaObserver(); // Database change callback void OnChange(const DistributedDB::KvStoreChangedData &data) override; + void OnChange(DBOrigin origin, const std::string &originalId, DBChangeData &&data) override; + void HandleChanges(int32_t flag, std::vector> &priData); private: std::shared_ptr metaStore_; std::shared_ptr filter_; @@ -47,6 +52,9 @@ MetaObserver::MetaObserver(std::shared_ptr metaStore, int mode = isLocal ? DistributedDB::OBSERVER_CHANGES_LOCAL_ONLY : (DistributedDB::OBSERVER_CHANGES_NATIVE | DistributedDB::OBSERVER_CHANGES_FOREIGN); auto status = metaStore_->RegisterObserver(filter_->GetKey(), mode, this); + if (!isLocal) { + status = metaStore_->RegisterObserver(filter_->GetKey(), DistributedDB::OBSERVER_CHANGES_CLOUD, this); + } if (status != DistributedDB::DBStatus::OK) { ZLOGE("register meta observer failed :%{public}d.", status); } @@ -94,6 +102,35 @@ void MetaObserver::OnChange(const DistributedDB::KvStoreChangedData &data) } } +void MetaObserver::OnChange(DBOrigin origin, const std::string &originalId, DBChangeData &&data) +{ + (void)origin; + (void)originalId; + HandleChanges(MetaDataManager::INSERT, data.primaryData[MetaDataManager::INSERT]); + HandleChanges(MetaDataManager::UPDATE, data.primaryData[MetaDataManager::UPDATE]); + HandleChanges(MetaDataManager::DELETE, data.primaryData[MetaDataManager::DELETE]); +} + +void MetaObserver::HandleChanges(int32_t flag, std::vector> &priData) +{ + if (priData.empty()) { + return; + } + for (const auto &priKey : priData) { + if (priKey.empty()) { + continue; + } + auto strValue = std::get_if(&priKey[0]); + if (strValue != nullptr) { + auto key = *strValue; + if (!(*filter_)(key)) { + continue; + } + observer_(key, "", flag); + } + } +} + MetaDataManager &MetaDataManager::GetInstance() { static MetaDataManager instance; @@ -130,6 +167,14 @@ void MetaDataManager::SetSyncer(const Syncer &syncer) syncer_ = syncer; } +void MetaDataManager::SetCloudSyncer(const CloudSyncer &cloudSyncer) +{ + if (metaStore_ == nullptr) { + return; + } + cloudSyncer_ = cloudSyncer; +} + bool MetaDataManager::SaveMeta(const std::string &key, const Serializable &value, bool isLocal) { if (!inited_) { @@ -142,8 +187,8 @@ bool MetaDataManager::SaveMeta(const std::string &key, const Serializable &value if (status == DistributedDB::DBStatus::OK && backup_) { backup_(metaStore_); } - if (!isLocal && syncer_) { - syncer_(metaStore_, status); + if (!isLocal && cloudSyncer_) { + cloudSyncer_(); } if (status != DistributedDB::DBStatus::OK) { ZLOGE("failed! status:%{public}d isLocal:%{public}d, key:%{public}s", @@ -200,8 +245,8 @@ bool MetaDataManager::DelMeta(const std::string &key, bool isLocal) if (status == DistributedDB::DBStatus::OK && backup_) { backup_(metaStore_); } - if (!isLocal && syncer_) { - syncer_(metaStore_, status); + if (!isLocal && cloudSyncer_) { + cloudSyncer_(); } return ((status == DistributedDB::DBStatus::OK) || (status == DistributedDB::DBStatus::NOT_FOUND)); } diff --git a/services/distributeddataservice/framework/test/BUILD.gn b/services/distributeddataservice/framework/test/BUILD.gn index 79b7862f8..1ef088db0 100644 --- a/services/distributeddataservice/framework/test/BUILD.gn +++ b/services/distributeddataservice/framework/test/BUILD.gn @@ -44,6 +44,7 @@ config("module_private_config") { "${data_service_path}/app/src/security", "${data_service_path}/service/crypto/include", "${data_service_path}/service/matrix/include", + "${data_service_path}/service/waterversion", "//third_party/json/single_include", ] ldflags = [ "-Wl,--whole-archive" ] @@ -276,6 +277,12 @@ ohos_unittest("ServiceMetaDataTest") { "meta_data_test.cpp", ] + sanitize = { + cfi = true + cfi_cross_dso = true + debug = false + } + configs = [ ":module_private_config" ] external_deps = [ diff --git a/services/distributeddataservice/service/cloud/sync_manager.cpp b/services/distributeddataservice/service/cloud/sync_manager.cpp index d380530c3..2354d3d4f 100644 --- a/services/distributeddataservice/service/cloud/sync_manager.cpp +++ b/services/distributeddataservice/service/cloud/sync_manager.cpp @@ -353,8 +353,7 @@ std::function SyncManager::GetClientChangeHandler() syncInfo.SetQuery(evt.GetQuery()); syncInfo.SetCompensation(evt.IsCompensation()); auto times = evt.AutoRetry() ? RETRY_TIMES - CLIENT_RETRY_TIMES : RETRY_TIMES; - auto task = GetSyncTask(times, evt.AutoRetry(), RefCount(), std::move(syncInfo)); - task(); + executor_->Execute(GetSyncTask(times, evt.AutoRetry(), RefCount(), std::move(syncInfo))); }; } diff --git a/services/distributeddataservice/service/kvdb/kvdb_general_store.cpp b/services/distributeddataservice/service/kvdb/kvdb_general_store.cpp index bcce28c9b..a76ee7fd9 100644 --- a/services/distributeddataservice/service/kvdb/kvdb_general_store.cpp +++ b/services/distributeddataservice/service/kvdb/kvdb_general_store.cpp @@ -15,6 +15,7 @@ #define LOG_TAG "KVDBGeneralStore" #include "kvdb_general_store.h" +#include "bootstrap.h" #include "checker/checker_manager.h" #include "cloud/cloud_sync_finished_event.h" #include "cloud/schema_meta.h" @@ -78,7 +79,11 @@ KVDBGeneralStore::DBSecurity KVDBGeneralStore::GetDBSecurity(int32_t secLevel) KVDBGeneralStore::DBOption KVDBGeneralStore::GetDBOption(const StoreMetaData &data, const DBPassword &password) { DBOption dbOption; - dbOption.syncDualTupleMode = true; // tuple of (appid+storeid) + if (data.appId == Bootstrap::GetInstance().GetProcessLabel()) { + dbOption.compressionRate = META_COMPRESS_RATE; + } else { + dbOption.syncDualTupleMode = true; // tuple of (appid+storeid) + } dbOption.createIfNecessary = false; dbOption.isMemoryDb = false; dbOption.isEncryptedDb = data.isEncrypt; @@ -101,12 +106,13 @@ KVDBGeneralStore::DBOption KVDBGeneralStore::GetDBOption(const StoreMetaData &da return dbOption; } -KVDBGeneralStore::KVDBGeneralStore(const StoreMetaData &meta) : manager_(meta.appId, meta.user, meta.instanceId) +KVDBGeneralStore::KVDBGeneralStore(const StoreMetaData &meta) + : manager_(meta.appId, meta.appId == Bootstrap::GetInstance().GetProcessLabel() ? "default" : meta.user, + meta.instanceId) { observer_.storeId_ = meta.storeId; - DBStatus status = DBStatus::NOT_FOUND; - manager_.SetKvStoreConfig({ DirectoryManager::GetInstance().GetStorePath(meta) }); + manager_.SetKvStoreConfig({ meta.dataDir }); std::unique_lock lock(rwMutex_); manager_.GetKvStore( meta.storeId, GetDBOption(meta, GetDBPassword(meta)), [&status, this](auto dbStatus, auto *tmpStore) { @@ -611,4 +617,4 @@ KVDBGeneralStore::DBProcessCB KVDBGeneralStore::GetDBProcessCB(DetailAsync async } }; } -} // namespace OHOS::DistributedKv +} // namespace OHOS::DistributedKv \ No newline at end of file diff --git a/services/distributeddataservice/service/kvdb/kvdb_general_store.h b/services/distributeddataservice/service/kvdb/kvdb_general_store.h index f937502d3..44f645f75 100644 --- a/services/distributeddataservice/service/kvdb/kvdb_general_store.h +++ b/services/distributeddataservice/service/kvdb/kvdb_general_store.h @@ -109,6 +109,7 @@ private: std::string storeId_; }; + static constexpr uint8_t META_COMPRESS_RATE = 10; ObserverProxy observer_; KvManager manager_; KvDelegate *delegate_ = nullptr; @@ -123,4 +124,4 @@ private: bool enableCloud_ = false; }; } // namespace OHOS::DistributedKv -#endif // OHOS_DISTRIBUTED_DATA_DATAMGR_SERVICE_KVDB_GENERAL_STORE_H +#endif // OHOS_DISTRIBUTED_DATA_DATAMGR_SERVICE_KVDB_GENERAL_STORE_H \ No newline at end of file diff --git a/services/distributeddataservice/service/kvdb/kvdb_service_impl.cpp b/services/distributeddataservice/service/kvdb/kvdb_service_impl.cpp index 69d9e2efd..211f20365 100644 --- a/services/distributeddataservice/service/kvdb/kvdb_service_impl.cpp +++ b/services/distributeddataservice/service/kvdb/kvdb_service_impl.cpp @@ -1181,6 +1181,11 @@ Status KVDBServiceImpl::DoSyncInOrder( if (!MetaDataManager::GetInstance().LoadMeta(std::string(capKey.begin(), capKey.end()), capMeta) || !MetaDataManager::GetInstance().LoadMeta(metaData.GetKey(), metaData)) { isAfterMeta = true; + break; + } + if (IsRemoteChange(metaData, uuid)) { + isAfterMeta = true; + break; } } if (!isOnline && isAfterMeta) { diff --git a/services/distributeddataservice/service/kvdb/user_delegate.cpp b/services/distributeddataservice/service/kvdb/user_delegate.cpp index 2c6a5c95e..a40202e3c 100644 --- a/services/distributeddataservice/service/kvdb/user_delegate.cpp +++ b/services/distributeddataservice/service/kvdb/user_delegate.cpp @@ -153,7 +153,11 @@ void UserDelegate::Init(const std::shared_ptr& executors) MetaDataManager::GetInstance().Subscribe( UserMetaRow::KEY_PREFIX, [this](const std::string &key, const std::string &value, int32_t flag) -> auto { UserMetaData metaData; - UserMetaData::Unmarshall(value, metaData); + if (value.empty()) { + MetaDataManager::GetInstance().LoadMeta(key, metaData); + } else { + UserMetaData::Unmarshall(value, metaData); + } ZLOGD("flag:%{public}d, value:%{public}s", flag, Anonymous::Change(metaData.deviceId).c_str()); if (metaData.deviceId == GetLocalDeviceId()) { ZLOGD("ignore local device user meta change"); @@ -207,4 +211,4 @@ std::string UserDelegate::LocalUserObserver::Name() { return "user_delegate"; } -} // namespace OHOS::DistributedData +} // namespace OHOS::DistributedData \ No newline at end of file diff --git a/services/distributeddataservice/service/matrix/src/auto_sync_matrix.cpp b/services/distributeddataservice/service/matrix/src/auto_sync_matrix.cpp index 42d075553..0e03a9676 100644 --- a/services/distributeddataservice/service/matrix/src/auto_sync_matrix.cpp +++ b/services/distributeddataservice/service/matrix/src/auto_sync_matrix.cpp @@ -34,10 +34,12 @@ AutoSyncMatrix &AutoSyncMatrix::GetInstance() AutoSyncMatrix::AutoSyncMatrix() { MetaDataManager::GetInstance().Subscribe(StoreMetaData::GetPrefix({}), - [this](const std::string &, const std::string &meta, int32_t action) -> bool { + [this](const std::string &key, const std::string &meta, int32_t action) -> bool { StoreMetaData metaData; - if (!StoreMetaData::Unmarshall(meta, metaData)) { - return true; + if (meta.empty()) { + MetaDataManager::GetInstance().LoadMeta(key, metaData); + } else { + StoreMetaData::Unmarshall(meta, metaData); } if (!IsAutoSync(metaData)) { return true; @@ -184,7 +186,7 @@ void AutoSyncMatrix::Online(const std::string &device) } onlines_.insert_or_assign(device, mask); } - + void AutoSyncMatrix::Offline(const std::string &device) { if (device.empty()) { @@ -216,7 +218,7 @@ void AutoSyncMatrix::OnChanged(const StoreMetaData &metaData) mask.Set(pos); } } - + void AutoSyncMatrix::OnExchanged(const std::string &device, const StoreMetaData &metaData) { std::lock_guard lock(mutex_); @@ -258,4 +260,4 @@ std::vector AutoSyncMatrix::GetChangedStore(const std::string &de } return result; } -} // namespace OHOS::DistributedData +} // namespace OHOS::DistributedData \ No newline at end of file diff --git a/services/distributeddataservice/service/matrix/src/device_matrix.cpp b/services/distributeddataservice/service/matrix/src/device_matrix.cpp index c2b0cc836..5abd548ba 100644 --- a/services/distributeddataservice/service/matrix/src/device_matrix.cpp +++ b/services/distributeddataservice/service/matrix/src/device_matrix.cpp @@ -57,12 +57,16 @@ DeviceMatrix::DeviceMatrix() return true; }, true); MetaDataManager::GetInstance().Subscribe(MatrixMetaData::GetPrefix({}), - [this](const std::string &, const std::string &meta, int32_t action) { + [this](const std::string &key, const std::string &meta, int32_t action) { if (action != MetaDataManager::INSERT && action != MetaDataManager::UPDATE) { return true; } MatrixMetaData metaData; - MatrixMetaData::Unmarshall(meta, metaData); + if (meta.empty()) { + MetaDataManager::GetInstance().LoadMeta(key, metaData); + } else { + MatrixMetaData::Unmarshall(meta, metaData); + } auto deviceId = std::move(metaData.deviceId); versions_.Set(deviceId, metaData); ZLOGI("Matrix ver:%{public}u device:%{public}s", @@ -743,4 +747,4 @@ bool DeviceMatrix::IsSupportMatrix() { return isSupportBroadcast_; } -} // namespace OHOS::DistributedData +} // namespace OHOS::DistributedData \ No newline at end of file diff --git a/services/distributeddataservice/service/test/BUILD.gn b/services/distributeddataservice/service/test/BUILD.gn index e0f1bd9b5..2990c2ebb 100644 --- a/services/distributeddataservice/service/test/BUILD.gn +++ b/services/distributeddataservice/service/test/BUILD.gn @@ -41,6 +41,7 @@ config("module_private_config") { "${data_service_path}/service/object/", "${data_service_path}/service/permission/include", "${data_service_path}/service/rdb/", + "${data_service_path}/service/waterversion", "${dataobject_path}/interfaces/innerkits", "${dataobject_path}/frameworks/innerkitsimpl/include", ] @@ -459,6 +460,12 @@ ohos_unittest("MetaDataTest") { "meta_data_test.cpp", ] + sanitize = { + cfi = true + cfi_cross_dso = true + debug = false + } + include_dirs = [ "${data_service_path}/app/src", "${data_service_path}/service/kvdb", diff --git a/services/distributeddataservice/service/test/device_matrix_test.cpp b/services/distributeddataservice/service/test/device_matrix_test.cpp index 1006c72f1..7145eec99 100644 --- a/services/distributeddataservice/service/test/device_matrix_test.cpp +++ b/services/distributeddataservice/service/test/device_matrix_test.cpp @@ -71,7 +71,7 @@ CheckerMock DeviceMatrixTest::instance_; void DeviceMatrixTest::SetUpTestCase(void) { MetaDataManager::GetInstance().Initialize(dbStoreMock_, nullptr); - MetaDataManager::GetInstance().SetSyncer([](const auto &, auto) { + MetaDataManager::GetInstance().SetCloudSyncer([]() { DeviceMatrix::GetInstance().OnChanged(DeviceMatrix::META_STORE_MASK); }); selfToken_ = IPCSkeleton::GetCallingTokenID(); diff --git a/services/distributeddataservice/service/waterversion/water_version_manager.h b/services/distributeddataservice/service/waterversion/water_version_manager.h index d43476a9c..f35c735f3 100644 --- a/services/distributeddataservice/service/waterversion/water_version_manager.h +++ b/services/distributeddataservice/service/waterversion/water_version_manager.h @@ -51,7 +51,7 @@ public: }; API_EXPORT static WaterVersionManager &GetInstance(); API_EXPORT void Init(); - std::string GenerateWaterVersion(const std::string &bundleName, const std::string &storeName); + API_EXPORT std::string GenerateWaterVersion(const std::string &bundleName, const std::string &storeName); std::string GetWaterVersion(const std::string &bundleName, const std::string &storeName); std::pair GetVersion(const std::string &deviceId, Type type); std::string GetWaterVersion(const std::string &deviceId, Type type); @@ -94,4 +94,4 @@ private: }; } // namespace DistributedData } // namespace OHOS -#endif //OHOS_DISTRIBUTED_DATA_SERVICES_FRAMEWORK_WATER_MANAGER_H +#endif //OHOS_DISTRIBUTED_DATA_SERVICES_FRAMEWORK_WATER_MANAGER_H \ No newline at end of file -- Gitee