diff --git a/services/distributeddataservice/app/src/kvstore_meta_manager.cpp b/services/distributeddataservice/app/src/kvstore_meta_manager.cpp index 0a718e50c68585c5edd685e3399e30baa46f9e20..4d0fc6b0d948a1079a9c689e0e08a0c96e1d30e2 100644 --- a/services/distributeddataservice/app/src/kvstore_meta_manager.cpp +++ b/services/distributeddataservice/app/src/kvstore_meta_manager.cpp @@ -95,7 +95,6 @@ void KvStoreMetaManager::InitMetaListener() } SubscribeMetaKvStore(); InitBroadcast(); - InitDeviceOnline(); NotifyAllAutoSyncDBInfo(); } @@ -126,48 +125,6 @@ void KvStoreMetaManager::InitBroadcast() ZLOGI("observer matrix broadcast %{public}d.", result); } -void KvStoreMetaManager::InitDeviceOnline() -{ - ZLOGI("observer matrix online event."); - using DBStatuses = std::map; - EventCenter::GetInstance().Subscribe(DeviceMatrix::MATRIX_ONLINE, [this](const Event &event) { - auto &matrixEvent = static_cast(event); - auto data = matrixEvent.GetMatrixData(); - auto deviceId = matrixEvent.GetDeviceId(); - auto onComplete = - [deviceId, data, refCount = matrixEvent.StealRefCount()](const DBStatuses &statuses) mutable { - auto finEvent = std::make_unique(DeviceMatrix::MATRIX_META_FINISHED, deviceId, data); - finEvent->SetRefCount(std::move(refCount)); - auto it = statuses.find(deviceId); - if (it != statuses.end() && it->second == DBStatus::OK) { - RADAR_REPORT(ONLINE_DEVICE_SYNC, ONLINE_META_COMPLETE, RADAR_SUCCESS, BIZ_STATE, END); - DeviceMatrix::GetInstance().OnExchanged(deviceId, DeviceMatrix::META_STORE_MASK); - } else if (it != statuses.end() && it->second != DBStatus::OK) { - RADAR_REPORT(ONLINE_DEVICE_SYNC, ONLINE_META_COMPLETE, RADAR_FAILED, BIZ_STATE, END); - } - ZLOGI("dynamic:0x%{public}08x statics:0x%{public}08x device:%{public}s status:%{public}d online", - data.dynamic, data.statics, Anonymous::Change(deviceId).c_str(), - it == statuses.end() ? DBStatus::OK : it->second); - EventCenter::GetInstance().PostEvent(std::move(finEvent)); - }; - auto store = GetMetaKvStore(); - uint16_t mask = data.dynamic & DEFAULT_MASK; - if (((mask & DeviceMatrix::META_STORE_MASK) != 0) && store != nullptr) { - RADAR_REPORT(ONLINE_DEVICE_SYNC, ONLINE_META_SYNC, RADAR_START, BIZ_STATE, START, - OS_TYPE, DmAdapter::GetInstance().IsOHOSType(deviceId)); - auto status = store->Sync({ deviceId }, DistributedDB::SyncMode::SYNC_MODE_PUSH_PULL, onComplete); - if (status == OK) { - RADAR_REPORT(ONLINE_DEVICE_SYNC, ONLINE_META_SYNC, RADAR_SUCCESS); - return; - } - RADAR_REPORT(ONLINE_DEVICE_SYNC, ONLINE_META_SYNC, RADAR_FAILED, BIZ_STATE, END); - ZLOGW("meta online sync error 0x%{public}08x device:%{public}s %{public}d", mask, - Anonymous::Change(deviceId).c_str(), status); - } - onComplete({ }); - }); -} - void KvStoreMetaManager::InitMetaData() { ZLOGI("start."); @@ -361,10 +318,10 @@ void KvStoreMetaManager::InitDBOption(DistributedDB::KvStoreNbDelegate::Option & 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); + DeviceMatrix::GetInstance().OnChanged(DeviceMatrix::META_STORE_MASK); DistributedData::StoreInfo storeInfo; storeInfo.bundleName = bundleName; storeInfo.storeName = storeName; @@ -479,7 +436,6 @@ void KvStoreMetaManager::MetaDeviceChangeListenerImpl::OnDeviceChanged(const App if (info.uuid == DmAdapter::CLOUD_DEVICE_UUID) { return; } - EventCenter::Defer defer; switch (type) { case AppDistributedKv::DeviceChangeType::DEVICE_OFFLINE: DeviceMatrix::GetInstance().Offline(info.uuid); diff --git a/services/distributeddataservice/app/src/kvstore_meta_manager.h b/services/distributeddataservice/app/src/kvstore_meta_manager.h index 29b25a746715d3789db26134e56de3a567b3bed7..d5ab34915ebd01c2c47088933c8e3b67d4404cd4 100644 --- a/services/distributeddataservice/app/src/kvstore_meta_manager.h +++ b/services/distributeddataservice/app/src/kvstore_meta_manager.h @@ -53,7 +53,6 @@ public: void InitMetaParameter(); void InitMetaListener(); void InitBroadcast(); - void InitDeviceOnline(); void SubscribeMeta(const std::string &keyPrefix, const ChangeObserver &observer); void BindExecutor(std::shared_ptr executors); private: diff --git a/services/distributeddataservice/service/kvdb/kvdb_service_impl.cpp b/services/distributeddataservice/service/kvdb/kvdb_service_impl.cpp index 6550fa925741f58e92ade1d9f13764c0f498dddb..dbce9db8f4d8b5aa634a8c0461fbe543dd9bc32a 100644 --- a/services/distributeddataservice/service/kvdb/kvdb_service_impl.cpp +++ b/services/distributeddataservice/service/kvdb/kvdb_service_impl.cpp @@ -88,75 +88,6 @@ KVDBServiceImpl::Factory::~Factory() KVDBServiceImpl::KVDBServiceImpl() { - EventCenter::GetInstance().Subscribe(DeviceMatrix::MATRIX_META_FINISHED, [this](const Event &event) { - auto &matrixEvent = static_cast(event); - auto deviceId = matrixEvent.GetDeviceId(); - auto refCount = matrixEvent.StealRefCount(); - std::vector metaData; - auto prefix = StoreMetaData::GetPrefix({ DMAdapter::GetInstance().GetLocalDevice().uuid }); - if (!MetaDataManager::GetInstance().LoadMeta(prefix, metaData)) { - ZLOGE("load meta failed!"); - return; - } - - uint16_t mask = matrixEvent.GetMatrixData().statics; - for (const auto &data : metaData) { - if (data.dataType != DataType::TYPE_STATICS) { - OldOnlineSync(data, deviceId, refCount, matrixEvent.GetMatrixData().dynamic); - continue; - } - auto code = DeviceMatrix::GetInstance().GetCode(data); - if ((code == DeviceMatrix::INVALID_MASK) || (mask & code) != code) { - OldOnlineSync(data, deviceId, refCount, matrixEvent.GetMatrixData().dynamic); - continue; - } - SyncInfo syncInfo; - syncInfo.mode = GetSyncMode(true, IsRemoteChange(data, deviceId)); - syncInfo.delay = 0; - syncInfo.devices = { deviceId }; - ZLOGI("[online] appId:%{public}s, storeId:%{public}s", data.bundleName.c_str(), - Anonymous::Change(data.storeId).c_str()); - syncInfo.syncId = ++syncId_; - RADAR_REPORT(STANDARD_DEVICE_SYNC, ADD_SYNC_TASK, RADAR_SUCCESS, BIZ_STATE, START, - SYNC_STORE_ID, Anonymous::Change(data.storeId), SYNC_APP_ID, data.bundleName, SYNC_ID, syncInfo.syncId); - KvStoreSyncManager::GetInstance()->AddSyncOperation(uintptr_t(data.tokenId), syncInfo.delay, - std::bind(&KVDBServiceImpl::DoSync, this, data, syncInfo, std::placeholders::_1, ACTION_SYNC), - std::bind(&KVDBServiceImpl::DoComplete, this, data, syncInfo, refCount, std::placeholders::_1)); - } - }); -} - -void KVDBServiceImpl::OldOnlineSync( - const StoreMetaData &data, const std::string &deviceId, RefCount refCount, uint16_t mask) -{ - StoreMetaDataLocal localMetaData; - MetaDataManager::GetInstance().LoadMeta(data.GetKeyLocal(), localMetaData, true); - if (!localMetaData.HasPolicy(PolicyType::IMMEDIATE_SYNC_ON_ONLINE)) { - return; - } - - auto code = DeviceMatrix::GetInstance().GetCode(data); - if ((mask & code) != code) { - return; - } - - auto policy = localMetaData.GetPolicy(PolicyType::IMMEDIATE_SYNC_ON_ONLINE); - SyncInfo syncInfo; - syncInfo.mode = PUSH_PULL; - syncInfo.delay = 0; - syncInfo.devices = { deviceId }; - if (policy.IsValueEffect()) { - syncInfo.delay = policy.valueUint; - } - ZLOGI("[online old] appId:%{public}s, storeId:%{public}s", data.bundleName.c_str(), - Anonymous::Change(data.storeId).c_str()); - auto delay = GetSyncDelayTime(syncInfo.delay, { data.storeId }); - syncInfo.syncId = ++syncId_; - RADAR_REPORT(STANDARD_DEVICE_SYNC, ADD_SYNC_TASK, RADAR_SUCCESS, BIZ_STATE, START, - SYNC_STORE_ID, Anonymous::Change(data.storeId), SYNC_APP_ID, data.bundleName, SYNC_ID, syncInfo.syncId); - KvStoreSyncManager::GetInstance()->AddSyncOperation(uintptr_t(data.tokenId), delay, - std::bind(&KVDBServiceImpl::DoSync, this, data, syncInfo, std::placeholders::_1, ACTION_SYNC), - std::bind(&KVDBServiceImpl::DoComplete, this, data, syncInfo, refCount, std::placeholders::_1)); } KVDBServiceImpl::~KVDBServiceImpl() @@ -504,7 +435,7 @@ void KVDBServiceImpl::RegisterMatrixChange() void KVDBServiceImpl::OnStaticsChange(const std::string &networkId, std::pair mask) { - syncAgents_.ForEachCopies([networkId, mask](const auto &key, auto &value) { + syncAgents_.ForEach([networkId, mask](const auto &key, auto &value) { StoreMetaData meta; meta.appId = value.appId_; meta.tokenId = key; @@ -530,7 +461,7 @@ void KVDBServiceImpl::OnStaticsChange(const std::string &networkId, std::pair mask) { - syncAgents_.ForEachCopies([networkId, mask](const auto &key, auto &value) { + syncAgents_.ForEach([networkId, mask](const auto &key, auto &value) { StoreMetaData meta; meta.appId = value.appId_; meta.tokenId = key; @@ -962,45 +893,6 @@ int32_t KVDBServiceImpl::OnUserChange(uint32_t code, const std::string &user, co int32_t KVDBServiceImpl::OnReady(const std::string &device) { - if (device == DeviceManagerAdapter::CLOUD_DEVICE_UUID) { - return SUCCESS; - } - std::vector metaData; - auto prefix = StoreMetaData::GetPrefix({ DMAdapter::GetInstance().GetLocalDevice().uuid }); - if (!MetaDataManager::GetInstance().LoadMeta(prefix, metaData)) { - ZLOGE("load meta failed!"); - return STORE_NOT_FOUND; - } - for (const auto &data : metaData) { - if (!data.isAutoSync) { - continue; - } - ZLOGI("[onReady] appId:%{public}s, storeId:%{public}s", - data.bundleName.c_str(), Anonymous::Change(data.storeId).c_str()); - auto code = DeviceMatrix::GetInstance().GetCode(data); - if (code == DeviceMatrix::INVALID_MASK) { - continue; - } - std::pair mask = { false, 0 }; - if (data.dataType == DataType::TYPE_STATICS) { - mask = DeviceMatrix::GetInstance().GetMask(device, DeviceMatrix::LevelType::STATICS); - } else { - mask = DeviceMatrix::GetInstance().GetMask(device); - } - if (mask.first && ((mask.second & code) != code)) { - continue; - } - SyncInfo syncInfo; - syncInfo.mode = SyncMode::PUSH; - syncInfo.devices = { device }; - auto delay = GetSyncDelayTime(syncInfo.delay, { data.storeId }); - syncInfo.syncId = ++syncId_; - RADAR_REPORT(STANDARD_DEVICE_SYNC, ADD_SYNC_TASK, RADAR_SUCCESS, BIZ_STATE, START, - SYNC_STORE_ID, Anonymous::Change(data.storeId), SYNC_APP_ID, data.bundleName, SYNC_ID, syncInfo.syncId); - KvStoreSyncManager::GetInstance()->AddSyncOperation(uintptr_t(data.tokenId), delay, - std::bind(&KVDBServiceImpl::DoSync, this, data, syncInfo, std::placeholders::_1, ACTION_SYNC), - std::bind(&KVDBServiceImpl::DoComplete, this, data, syncInfo, RefCount(), std::placeholders::_1)); - } return SUCCESS; } @@ -1011,7 +903,6 @@ int32_t KVDBServiceImpl::OnSessionReady(const std::string &device) return SUCCESS; } - SyncOnSessionReady(device); auto stores = AutoSyncMatrix::GetInstance().GetChangedStore(device); for (const auto &store : stores) { ZLOGI("[OnSessionReady] appId:%{public}s, storeId:%{public}s", @@ -1029,37 +920,6 @@ int32_t KVDBServiceImpl::OnSessionReady(const std::string &device) return SUCCESS; } -void KVDBServiceImpl::SyncOnSessionReady(const std::string &device) -{ - auto local = DMAdapter::GetInstance().GetLocalDevice().uuid; - std::vector metas; - auto prefix = StoreMetaData::GetPrefix({ local }); - if (!MetaDataManager::GetInstance().LoadMeta(prefix, metas)) { - ZLOGE("load meta failed!"); - return; - } - for (const auto &meta : metas) { - if (!DeviceMatrix::GetInstance().IsStatics(meta) && !DeviceMatrix::GetInstance().IsDynamic(meta)) { - continue; - } - if (!IsRemoteChange(meta, device)) { - continue; - } - SyncInfo syncInfo; - syncInfo.mode = PULL; - syncInfo.delay = 0; - syncInfo.devices = { device }; - ZLOGI("[SyncOnSessionReady] appId:%{public}s, storeId:%{public}s", meta.bundleName.c_str(), - Anonymous::Change(meta.storeId).c_str()); - syncInfo.syncId = ++syncId_; - RADAR_REPORT(STANDARD_DEVICE_SYNC, ADD_SYNC_TASK, RADAR_SUCCESS, BIZ_STATE, START, - SYNC_STORE_ID, Anonymous::Change(meta.storeId), SYNC_APP_ID, meta.bundleName, SYNC_ID, syncInfo.syncId); - KvStoreSyncManager::GetInstance()->AddSyncOperation(uintptr_t(meta.tokenId), syncInfo.delay, - std::bind(&KVDBServiceImpl::DoSyncInOrder, this, meta, syncInfo, std::placeholders::_1, ACTION_SYNC), - std::bind(&KVDBServiceImpl::DoComplete, this, meta, syncInfo, RefCount(), std::placeholders::_1)); - } -} - bool KVDBServiceImpl::IsRemoteChange(const StoreMetaData &metaData, const std::string &device) { auto code = DeviceMatrix::GetInstance().GetCode(metaData); @@ -1271,13 +1131,8 @@ Status KVDBServiceImpl::DoSyncInOrder( bool KVDBServiceImpl::IsNeedMetaSync(const StoreMetaData &meta, const std::vector &uuids) { - bool isOnline = false; bool isAfterMeta = false; for (const auto &uuid : uuids) { - if (!DMAdapter::GetInstance().IsDeviceReady(uuid)) { - isOnline = true; - break; - } auto metaData = meta; metaData.deviceId = uuid; CapMetaData capMeta; @@ -1292,10 +1147,7 @@ bool KVDBServiceImpl::IsNeedMetaSync(const StoreMetaData &meta, const std::vecto break; } } - if (!isOnline && isAfterMeta) { - return true; - } - return false; + return isAfterMeta; } StoreMetaData KVDBServiceImpl::GetDistributedDataMeta(const std::string &deviceId) diff --git a/services/distributeddataservice/service/kvdb/kvdb_service_impl.h b/services/distributeddataservice/service/kvdb/kvdb_service_impl.h index 3ece03de3dc57c4bd7bcba7dfab932ef3a87384d..1a10293769c3a600c65338c808022880a1f7f048 100644 --- a/services/distributeddataservice/service/kvdb/kvdb_service_impl.h +++ b/services/distributeddataservice/service/kvdb/kvdb_service_impl.h @@ -146,8 +146,6 @@ private: void RegisterMatrixChange(); void DumpKvServiceInfo(int fd, std::map> ¶ms); void TryToSync(const StoreMetaData &metaData, bool force = false); - void SyncOnSessionReady(const std::string &device); - void OldOnlineSync(const StoreMetaData &data, const std::string &deviceId, RefCount refCount, uint16_t mask); void OnStaticsChange(const std::string &networkId, std::pair mask); void OnDynamicChange(const std::string &networkId, std::pair mask); bool IsRemoteChange(const StoreMetaData &metaData, const std::string &device); diff --git a/services/distributeddataservice/service/matrix/src/device_matrix.cpp b/services/distributeddataservice/service/matrix/src/device_matrix.cpp index 42d9d48b0c16604aee01668998f3805fb995554d..c77945ab4d924dd0ec932f491eb0ea0f78139ecc 100644 --- a/services/distributeddataservice/service/matrix/src/device_matrix.cpp +++ b/services/distributeddataservice/service/matrix/src/device_matrix.cpp @@ -124,36 +124,15 @@ bool DeviceMatrix::Initialize(uint32_t token, std::string storeId) void DeviceMatrix::Online(const std::string &device, RefCount refCount) { Mask mask; - EventCenter::Defer defer; - { - std::lock_guard lockGuard(mutex_); - auto it = offLines_.find(device); - if (it != offLines_.end()) { - mask = it->second; - offLines_.erase(it); - } else { - UpdateMask(mask); - } - onLines_.insert_or_assign(device, mask); - } - auto [dynamic, statics] = IsConsistent(device); - if ((dynamic && statics) || (Low(mask.statics) == 0 && Low(mask.dynamic) == 0)) { - ZLOGI("dynamic:%{public}d statics:%{public}d dynamic mask:0x%{public}08x statics mask:0x%{public}08x", - dynamic, statics, Low(mask.dynamic), Low(mask.statics)); - return; - } - if (dynamic) { - mask.dynamic = ResetMask(mask.dynamic); - } - if (statics) { - mask.statics = ResetMask(mask.statics); + std::lock_guard lockGuard(mutex_); + auto it = offLines_.find(device); + if (it != offLines_.end()) { + mask = it->second; + offLines_.erase(it); + } else { + UpdateMask(mask); } - MatrixEvent::MatrixData matrixData; - matrixData.statics = mask.statics; - matrixData.dynamic = mask.dynamic; - auto evt = std::make_unique(MATRIX_ONLINE, device, matrixData); - evt->SetRefCount(std::move(refCount)); - EventCenter::GetInstance().PostEvent(std::move(evt)); + onLines_.insert_or_assign(device, mask); } std::pair DeviceMatrix::IsConsistent(const std::string &device) @@ -318,10 +297,25 @@ void DeviceMatrix::UpdateRemoteMeta(const std::string &device, Mask &mask) if (High(newMeta.dynamic) < High(oldMeta.dynamic)) { newMeta.dynamic &= 0x000F; newMeta.dynamic |= High(oldMeta.dynamic); + } else if ((High(newMeta.dynamic) - High(oldMeta.dynamic)) > 1) { + newMeta.dynamic |= 0x000F; + mask.dynamic |= 0x000F; } if (High(newMeta.statics) < High(oldMeta.statics)) { newMeta.statics &= 0x000F; newMeta.statics |= High(oldMeta.statics); + } else if ((High(newMeta.statics) - High(oldMeta.statics)) > 1) { + newMeta.statics |= 0x000F; + mask.statics |= 0x000F; + } + } else { + if (High(newMeta.dynamic) != 0x0010) { + newMeta.dynamic |= 0x000F; + mask.dynamic |= 0x000F; + } + if (High(newMeta.statics) != 0x0010) { + newMeta.statics |= 0x000F; + mask.statics |= 0x000F; } } MetaDataManager::GetInstance().SaveMeta(newMeta.GetKey(), newMeta, true);