diff --git a/services/distributeddataservice/service/kvdb/kvdb_service_impl.cpp b/services/distributeddataservice/service/kvdb/kvdb_service_impl.cpp index f04980ccc167301f48916a6a907e72f745330e5e..99539b6bb46535e0390f82865eaef10445761462 100644 --- a/services/distributeddataservice/service/kvdb/kvdb_service_impl.cpp +++ b/services/distributeddataservice/service/kvdb/kvdb_service_impl.cpp @@ -245,17 +245,16 @@ Status KVDBServiceImpl::Sync(const AppId &appId, const StoreId &storeId, int32_t { StoreMetaData metaData = GetStoreMetaData(appId, storeId, subUser); MetaDataManager::GetInstance().LoadMeta(metaData.GetKey(), metaData); - auto delay = GetSyncDelayTime(syncInfo.delay, storeId, metaData.user); - if (metaData.isAutoSync && syncInfo.seqId == std::numeric_limits::max()) { - DeviceMatrix::GetInstance().OnChanged(metaData); - StoreMetaDataLocal localMeta; - MetaDataManager::GetInstance().LoadMeta(metaData.GetKeyLocal(), localMeta, true); - if (!localMeta.HasPolicy(IMMEDIATE_SYNC_ON_CHANGE)) { - ZLOGW("appId:%{public}s storeId:%{public}s no IMMEDIATE_SYNC_ON_CHANGE ", appId.appId.c_str(), - Anonymous::Change(storeId.storeId).c_str()); - return Status::SUCCESS; + if (DeviceMatrix::GetInstance().IsStatics(metaData) || DeviceMatrix::GetInstance().IsDynamic(metaData)) { + if (!syncInfo.devices.empty() && !IsNeedSync(metaData, syncInfo.devices)) { + ZLOGW("no change, do not need sync, appId:%{public}s storeId:%{public}s", metaData.bundleName.c_str(), + Anonymous::Change(metaData.storeId).c_str()); + DBResult dbResult = { {syncInfo.devices[0], DBStatus::OK} }; + DoComplete(metaData, syncInfo, RefCount(), std::move(dbResult)); + return SUCCESS; } } + auto delay = GetSyncDelayTime(syncInfo.delay, storeId, metaData.user); syncInfo.syncId = ++syncId_; RADAR_REPORT(STANDARD_DEVICE_SYNC, ADD_SYNC_TASK, RADAR_SUCCESS, BIZ_STATE, START, SYNC_STORE_ID, Anonymous::Change(storeId.storeId), SYNC_APP_ID, appId.appId, CONCURRENT_ID, @@ -266,6 +265,23 @@ Status KVDBServiceImpl::Sync(const AppId &appId, const StoreId &storeId, int32_t std::bind(&KVDBServiceImpl::DoComplete, this, metaData, syncInfo, RefCount(), std::placeholders::_1)); } +bool KVDBServiceImpl::IsNeedSync(const StoreMetaData &metaData, std::vector &devices) +{ + auto uuids = ConvertDevices(devices); + if (uuids.empty()) { + ZLOGW("no device, appId:%{public}s, storeId:%{public}s", metaData.bundleName.c_str(), + Anonymous::Change(metaData.storeId).c_str()); + return false; + } + auto code = DeviceMatrix::GetInstance().GetCode(metaData); + auto [exist, mask] = DeviceMatrix::GetInstance().GetRemoteMask(uuids[0]); + auto [existLocal, localMask] = DeviceMatrix::GetInstance().GetMask(uuids[0]); + if ((mask & code) == code || (localMask & code) == code) { + return true; + } + return false; +} + Status KVDBServiceImpl::NotifyDataChange(const AppId &appId, const StoreId &storeId, uint64_t delay) { StoreMetaData meta = GetStoreMetaData(appId, storeId); @@ -857,24 +873,6 @@ int32_t KVDBServiceImpl::OnUserChange(uint32_t code, const std::string &user, co return SUCCESS; } -bool KVDBServiceImpl::IsRemoteChange(const StoreMetaData &metaData, const std::string &device) -{ - auto code = DeviceMatrix::GetInstance().GetCode(metaData); - if (code == DeviceMatrix::INVALID_MASK) { - return true; - } - auto [dynamic, statics] = DeviceMatrix::GetInstance().IsConsistent(device); - if (metaData.dataType == DataType::TYPE_STATICS && statics) { - return false; - } - if (metaData.dataType == DataType::TYPE_DYNAMICAL && dynamic) { - return false; - } - auto [exist, mask] = DeviceMatrix::GetInstance().GetRemoteMask( - device, static_cast(metaData.dataType)); - return (mask & code) == code; -} - void KVDBServiceImpl::AddOptions(const Options &options, StoreMetaData &metaData) { metaData.isAutoSync = options.autoSync; diff --git a/services/distributeddataservice/service/kvdb/kvdb_service_impl.h b/services/distributeddataservice/service/kvdb/kvdb_service_impl.h index 4604f8b56eac50623014bd56fe84f06167797057..df132cf2066127222316904b922fd98c4f270507 100644 --- a/services/distributeddataservice/service/kvdb/kvdb_service_impl.h +++ b/services/distributeddataservice/service/kvdb/kvdb_service_impl.h @@ -155,7 +155,7 @@ private: void RegisterHandler(); void DumpKvServiceInfo(int fd, std::map> ¶ms); void TryToSync(const StoreMetaData &metaData, bool force = false); - bool IsRemoteChange(const StoreMetaData &metaData, const std::string &device); + bool IsNeedSync(const StoreMetaData &metaData, std::vector &devices); bool IsOHOSType(const std::vector &ids); Status ConvertDbStatusNative(DBStatus status); bool CompareTripleIdentifier(const std::string &accountId, const std::string &identifier,