diff --git a/frameworks/libs/distributeddb/common/include/db_constant.h b/frameworks/libs/distributeddb/common/include/db_constant.h index acbc03a856fc8bd6d473bd0f63e2b34ed9a57f4b..abf73290dd193d8fa1d9a8b32de4808836427578 100644 --- a/frameworks/libs/distributeddb/common/include/db_constant.h +++ b/frameworks/libs/distributeddb/common/include/db_constant.h @@ -119,6 +119,7 @@ public: // Prefix Key in meta db static constexpr const char *DEVICEID_PREFIX_KEY = "deviceId"; + static constexpr const char *USERID_PREFIX_KEY = "userId"; static constexpr const char *QUERY_SYNC_PREFIX_KEY = "querySync"; static constexpr const char *DELETE_SYNC_PREFIX_KEY = "deleteSync"; @@ -200,6 +201,8 @@ public: static constexpr const char *KV_LOCAL_TABLE_NAME = "local_data"; static constexpr const char *ROWID = "rowid"; + + static constexpr const char *DEFAULT_USER = "default_user"; }; } // namespace DistributedDB #endif // DISTRIBUTEDDB_CONSTANT_H diff --git a/frameworks/libs/distributeddb/common/include/db_errno.h b/frameworks/libs/distributeddb/common/include/db_errno.h index ceb9841b4a0550e24aea8dcb4e8380f5490d1894..a0174fae4086ac89c55d47e31d2297469b1350d9 100644 --- a/frameworks/libs/distributeddb/common/include/db_errno.h +++ b/frameworks/libs/distributeddb/common/include/db_errno.h @@ -189,6 +189,7 @@ constexpr const int E_DISTRIBUTED_SCHEMA_CHANGED = (E_BASE + 203); // Schema has constexpr const int E_TABLE_REFERENCE_CHANGED = (E_BASE + 204); // table reference is changed constexpr const int E_CLOUD_DISABLED = (E_BASE + 205); // The cloud switch has been turned off constexpr const int E_DISTRIBUTED_FIELD_DECREASE = (E_BASE + 206); // Sync fewer specified columns than last time +constexpr const int E_NO_TRUSTED_USER = (E_BASE + 207); // No trusted found before device sync } // namespace DistributedDB #endif // DISTRIBUTEDDB_ERRNO_H diff --git a/frameworks/libs/distributeddb/communicator/include/communicator_aggregator.h b/frameworks/libs/distributeddb/communicator/include/communicator_aggregator.h index 6034cb15e096818c0975b6939f8c3a76981969da..a5dfd3f8a5410b7694cad7405905b1cae1f354dd 100644 --- a/frameworks/libs/distributeddb/communicator/include/communicator_aggregator.h +++ b/frameworks/libs/distributeddb/communicator/include/communicator_aggregator.h @@ -120,7 +120,7 @@ private: // Function with suffix NoMutex should be called with mutex in the caller int TryDeliverAppLayerFrameToCommunicatorNoMutex(const std::string &srcTarget, SerialBuffer *&inFrameBuffer, - const LabelType &toLabel, const std::string &userId = ""); + const LabelType &toLabel, const UserInfo &userInfo); // Auxiliary function for cutting short primary function int RegCallbackToAdapter(); @@ -164,7 +164,7 @@ private: uint64_t IncreaseSendSequenceId(const std::string &target); int GetDataUserId(const ParseResult &inResult, const LabelType &toLabel, const DataUserInfoProc &userInfoProc, - std::string &userId); + UserInfo &userInfo); DECLARE_OBJECT_TAG(CommunicatorAggregator); diff --git a/frameworks/libs/distributeddb/communicator/include/frame_retainer.h b/frameworks/libs/distributeddb/communicator/include/frame_retainer.h index 4a7c80e9fac4244534c597e05865bf6d0bdf85c4..79837f45002ab70292e916a93e0fb21c9c5b47e0 100644 --- a/frameworks/libs/distributeddb/communicator/include/frame_retainer.h +++ b/frameworks/libs/distributeddb/communicator/include/frame_retainer.h @@ -29,12 +29,14 @@ class SerialBuffer; // Forward Declarations struct FrameInfo { SerialBuffer *buffer = nullptr; std::string srcTarget; + std::string sendUser; LabelType commLabel; uint32_t frameId = 0u; }; struct RetainWork { SerialBuffer *buffer = nullptr; + std::string sendUser; uint32_t frameId = 0u; uint32_t remainTime = 0u; // in second }; diff --git a/frameworks/libs/distributeddb/communicator/include/icommunicator.h b/frameworks/libs/distributeddb/communicator/include/icommunicator.h index 4b73ab3262ad8a2cdff11b76cefd71f2ec355e7a..fa3eed8c659c99d86361699a1acfffe890d7760a 100644 --- a/frameworks/libs/distributeddb/communicator/include/icommunicator.h +++ b/frameworks/libs/distributeddb/communicator/include/icommunicator.h @@ -84,6 +84,8 @@ public: virtual int SendMessage(const std::string &dstTarget, const Message *inMsg, const SendConfig &config, const OnSendEnd &onEnd) = 0; // HW Code Regulation do not allow to use default parameters on virtual function + virtual std::string GetTargetUserId(const ExtendInfo ¶mInfo) const = 0; + virtual ~ICommunicator() {}; }; } // namespace DistributedDB diff --git a/frameworks/libs/distributeddb/communicator/include/message.h b/frameworks/libs/distributeddb/communicator/include/message.h index 416e083169cfcdc97e4f464f378ee21e9820d6af..ec52a076b1cf1298e597a3f9e1bbb40fbb539fda 100644 --- a/frameworks/libs/distributeddb/communicator/include/message.h +++ b/frameworks/libs/distributeddb/communicator/include/message.h @@ -142,6 +142,11 @@ public: target_ = inTarget; } + void SetSenderUserId(const std::string &userId) + { + senderUserId_ = userId; + } + void SetPriority(Priority inPriority) { prio_ = inPriority; @@ -185,6 +190,11 @@ public: return target_; } + std::string GetSenderUserId() const + { + return senderUserId_; + } + Priority GetPriority() const { return prio_; @@ -212,6 +222,7 @@ private: // Field carry supplemental info std::string target_; + std::string senderUserId_; Priority prio_ = Priority::LOW; }; } // namespace DistributedDB diff --git a/frameworks/libs/distributeddb/communicator/src/communicator.cpp b/frameworks/libs/distributeddb/communicator/src/communicator.cpp index 608adaf912dcdf682d6eacdb16d92f96e0775c3e..0020a6387dc6ca3a4460bc3afed15e1fe67b6e83 100644 --- a/frameworks/libs/distributeddb/communicator/src/communicator.cpp +++ b/frameworks/libs/distributeddb/communicator/src/communicator.cpp @@ -144,13 +144,15 @@ int Communicator::SendMessage(const std::string &dstTarget, const Message *inMsg return errCode; } -void Communicator::OnBufferReceive(const std::string &srcTarget, const SerialBuffer *inBuf) +void Communicator::OnBufferReceive(const std::string &srcTarget, const SerialBuffer *inBuf, + const std::string &sendUser) { std::lock_guard messageHandleLockGuard(messageHandleMutex_); - if (srcTarget.size() != 0 && inBuf != nullptr && onMessageHandle_) { + if (!srcTarget.empty() && inBuf != nullptr && onMessageHandle_) { int error = E_OK; // if error is not E_OK, null pointer will be returned Message *message = ProtocolProto::ToMessage(inBuf, error); + message->SetSenderUserId(sendUser); delete inBuf; inBuf = nullptr; // message is not nullptr if error is E_OK or error is E_NOT_REGISTER. @@ -269,5 +271,11 @@ void Communicator::TriggerUnknownMessageFeedback(const std::string &dstTarget, M } } +std::string Communicator::GetTargetUserId(const ExtendInfo ¶mInfo) const +{ + std::shared_ptr extendHandle = commAggrHandle_->GetExtendHeaderHandle(paramInfo); + return extendHandle->GetTargetUserId(); +} + DEFINE_OBJECT_TAG_FACILITIES(Communicator) } // namespace DistributedDB diff --git a/frameworks/libs/distributeddb/communicator/src/communicator.h b/frameworks/libs/distributeddb/communicator/src/communicator.h index 976ce0ae9488ecf3f4a4b2b4c6f362592a7974f7..2a6aaf82d8a706fb1c1234c3fc8584979f9bab33 100644 --- a/frameworks/libs/distributeddb/communicator/src/communicator.h +++ b/frameworks/libs/distributeddb/communicator/src/communicator.h @@ -56,7 +56,7 @@ public: const OnSendEnd &onEnd) override; // Call by CommunicatorAggregator directly - void OnBufferReceive(const std::string &srcTarget, const SerialBuffer *inBuf); + void OnBufferReceive(const std::string &srcTarget, const SerialBuffer *inBuf, const std::string &sendUser); // Call by CommunicatorAggregator directly void OnConnectChange(const std::string &target, bool isConnect); @@ -67,6 +67,7 @@ public: // Call by CommunicatorAggregator directly LabelType GetCommunicatorLabel() const; + std::string GetTargetUserId(const ExtendInfo ¶mInfo) const override; private: void TriggerVersionNegotiation(const std::string &dstTarget); void TriggerUnknownMessageFeedback(const std::string &dstTarget, Message* &oriMsg); diff --git a/frameworks/libs/distributeddb/communicator/src/communicator_aggregator.cpp b/frameworks/libs/distributeddb/communicator/src/communicator_aggregator.cpp index ea724de998b34ec55ba20e6e818fb85daa98fde8..3ca99ad389084e6251356e30061064175f60e34c 100644 --- a/frameworks/libs/distributeddb/communicator/src/communicator_aggregator.cpp +++ b/frameworks/libs/distributeddb/communicator/src/communicator_aggregator.cpp @@ -276,7 +276,7 @@ void CommunicatorAggregator::ActivateCommunicator(const LabelType &commLabel, co // Do Redeliver, the communicator is responsible to deal with the frame std::list framesToRedeliver = retainer_.FetchFramesForSpecificCommunicator(commLabel); for (auto &entry : framesToRedeliver) { - commMap_[userId].at(commLabel).first->OnBufferReceive(entry.srcTarget, entry.buffer); + commMap_[userId].at(commLabel).first->OnBufferReceive(entry.srcTarget, entry.buffer, entry.sendUser); } } @@ -674,17 +674,17 @@ int CommunicatorAggregator::OnAppLayerFrameReceive(const std::string &srcTarget, const ParseResult &inResult, const DataUserInfoProc &userInfoProc) { LabelType toLabel = inResult.GetCommLabel(); - std::string userId; - int ret = GetDataUserId(inResult, toLabel, userInfoProc, userId); - if (ret != E_OK) { - LOGE("[CommAggr][AppReceive] get data user id err, ret=%d", ret); + UserInfo userInfo = { .sendUser = DBConstant::DEFAULT_USER }; + int ret = GetDataUserId(inResult, toLabel, userInfoProc, userInfo); + if (ret != E_OK || userInfo.sendUser.empty()) { + LOGE("[CommAggr][AppReceive] get data user id err, ret=%d, empty sendUser=%d", ret); delete inFrameBuffer; inFrameBuffer = nullptr; - return ret; + return ret != E_OK ? ret : -E_NO_TRUSTED_USER; } { std::lock_guard commMapLockGuard(commMapMutex_); - int errCode = TryDeliverAppLayerFrameToCommunicatorNoMutex(srcTarget, inFrameBuffer, toLabel, userId); + int errCode = TryDeliverAppLayerFrameToCommunicatorNoMutex(srcTarget, inFrameBuffer, toLabel, userInfo); if (errCode == E_OK) { // Attention: Here is equal to E_OK return E_OK; } @@ -694,7 +694,7 @@ int CommunicatorAggregator::OnAppLayerFrameReceive(const std::string &srcTarget, { std::lock_guard onCommLackLockGuard(onCommLackMutex_); if (onCommLackHandle_) { - errCode = onCommLackHandle_(toLabel, userId); + errCode = onCommLackHandle_(toLabel, userInfo.receiveUser); LOGI("[CommAggr][AppReceive] On CommLack End."); // Log in case callback block this thread } else { LOGI("[CommAggr][AppReceive] CommLackHandle invalid currently."); @@ -702,7 +702,7 @@ int CommunicatorAggregator::OnAppLayerFrameReceive(const std::string &srcTarget, } // Here we have to lock commMapMutex_ and search communicator again. std::lock_guard commMapLockGuard(commMapMutex_); - int errCodeAgain = TryDeliverAppLayerFrameToCommunicatorNoMutex(srcTarget, inFrameBuffer, toLabel, userId); + int errCodeAgain = TryDeliverAppLayerFrameToCommunicatorNoMutex(srcTarget, inFrameBuffer, toLabel, userInfo); if (errCodeAgain == E_OK) { // Attention: Here is equal to E_OK. LOGI("[CommAggr][AppReceive] Communicator of %.3s found after try again(rare case).", VEC_TO_STR(toLabel)); return E_OK; @@ -715,13 +715,13 @@ int CommunicatorAggregator::OnAppLayerFrameReceive(const std::string &srcTarget, return errCode; // The caller will display errCode in log } // Do Retention, the retainer is responsible to deal with the frame - retainer_.RetainFrame(FrameInfo{inFrameBuffer, srcTarget, toLabel, inResult.GetFrameId()}); + retainer_.RetainFrame(FrameInfo{inFrameBuffer, srcTarget, userInfo.sendUser, toLabel, inResult.GetFrameId()}); inFrameBuffer = nullptr; return E_OK; } int CommunicatorAggregator::GetDataUserId(const ParseResult &inResult, const LabelType &toLabel, - const DataUserInfoProc &userInfoProc, std::string &userId) + const DataUserInfoProc &userInfoProc, UserInfo &userInfo) { if (userInfoProc.processCommunicator == nullptr) { LOGE("[CommAggr][GetDataUserId] processCommunicator is nullptr"); @@ -736,8 +736,8 @@ int CommunicatorAggregator::GetDataUserId(const ParseResult &inResult, const Lab LOGE("[CommAggr][GetDataUserId] userId dismatched, drop packet"); return ret; } - if (userInfos.size() >= 1) { - userId = userInfos[0].receiveUser; + if (!userInfos.empty()) { + userInfo = userInfos[0]; } else { LOGW("[CommAggr][GetDataUserId] userInfos is empty"); } @@ -745,11 +745,13 @@ int CommunicatorAggregator::GetDataUserId(const ParseResult &inResult, const Lab } int CommunicatorAggregator::TryDeliverAppLayerFrameToCommunicatorNoMutex(const std::string &srcTarget, - SerialBuffer *&inFrameBuffer, const LabelType &toLabel, const std::string &userId) + SerialBuffer *&inFrameBuffer, const LabelType &toLabel, const UserInfo &userInfo) { // Ignore nonactivated communicator, which is regarded as inexistent - if (commMap_[userId].count(toLabel) != 0 && commMap_[userId].at(toLabel).second) { - commMap_[userId].at(toLabel).first->OnBufferReceive(srcTarget, inFrameBuffer); + const std::string &sendUser = userInfo.sendUser; + const std::string &receiveUser = userInfo.receiveUser; + if (commMap_[receiveUser].count(toLabel) != 0 && commMap_[receiveUser].at(toLabel).second) { + commMap_[receiveUser].at(toLabel).first->OnBufferReceive(srcTarget, inFrameBuffer, sendUser); // Frame handed over to communicator who is responsible to delete it. The frame is deleted here after return. inFrameBuffer = nullptr; return E_OK; @@ -762,7 +764,7 @@ int CommunicatorAggregator::TryDeliverAppLayerFrameToCommunicatorNoMutex(const s communicator = entry.second.first; isEmpty = userCommMap.first.empty(); LOGW("[CommAggr][TryDeliver] Found communicator of %s, but required user is %s", - userCommMap.first.c_str(), userId.c_str()); + userCommMap.first.c_str(), receiveUser.c_str()); break; } } @@ -770,8 +772,8 @@ int CommunicatorAggregator::TryDeliverAppLayerFrameToCommunicatorNoMutex(const s break; } } - if (communicator != nullptr && (userId.empty() || isEmpty)) { - communicator->OnBufferReceive(srcTarget, inFrameBuffer); + if (communicator != nullptr && (receiveUser.empty() || isEmpty)) { + communicator->OnBufferReceive(srcTarget, inFrameBuffer, sendUser); inFrameBuffer = nullptr; return E_OK; } diff --git a/frameworks/libs/distributeddb/communicator/src/frame_retainer.cpp b/frameworks/libs/distributeddb/communicator/src/frame_retainer.cpp index fc0eb0bba34e92d7e70e332ddcf617d049098ac0..b1b42011efd8a87b6ad92ea8237eaff815a88f8e 100644 --- a/frameworks/libs/distributeddb/communicator/src/frame_retainer.cpp +++ b/frameworks/libs/distributeddb/communicator/src/frame_retainer.cpp @@ -85,7 +85,7 @@ void FrameRetainer::RetainFrame(const FrameInfo &inFrame) if (inFrame.buffer == nullptr) { return; // Never gonna happen } - RetainWork work{inFrame.buffer, inFrame.frameId, MAX_RETAIN_TIME}; + RetainWork work{inFrame.buffer, inFrame.sendUser, inFrame.frameId, MAX_RETAIN_TIME}; if (work.buffer->GetSize() > MAX_RETAIN_FRAME_SIZE) { LOGE("[Retainer][Retain] Frame size=%u over limit=%u.", work.buffer->GetSize(), MAX_RETAIN_FRAME_SIZE); delete work.buffer; @@ -140,7 +140,7 @@ std::list FrameRetainer::FetchFramesForSpecificCommunicator(const Lab for (auto &entry : fetchOrder) { RetainWork &work = perLabel[entry.second][entry.first]; LogRetainInfo("[Retainer][Fetch] FETCH-OUT", inCommLabel, entry.second, entry.first, work); - outFrameList.emplace_back(FrameInfo{work.buffer, entry.second, inCommLabel, work.frameId}); + outFrameList.emplace_back(FrameInfo{work.buffer, entry.second, work.sendUser, inCommLabel, work.frameId}); // Update statistics totalSizeByByte_ -= work.buffer->GetSize(); totalRetainFrames_--; diff --git a/frameworks/libs/distributeddb/include/types_export.h b/frameworks/libs/distributeddb/include/types_export.h index 73abe2cd7d05fa58ba1a4d8ec688afadf26c0620..748dc2d7ca682e00588d0fbb75e5c54ee21f0983 100644 --- a/frameworks/libs/distributeddb/include/types_export.h +++ b/frameworks/libs/distributeddb/include/types_export.h @@ -244,6 +244,16 @@ struct StoreInfo { std::string userId; std::string appId; std::string storeId; + + bool operator<(const StoreInfo &other) const + { + if (userId == other.userId && appId == other.appId) { + return storeId < other.storeId; + } else if (userId == other.userId) { + return appId < other.appId; + } + return userId < other.userId; + } }; using TranslateToDeviceIdCallback = std::function; } // namespace DistributedDB diff --git a/frameworks/libs/distributeddb/interfaces/include/iprocess_communicator.h b/frameworks/libs/distributeddb/interfaces/include/iprocess_communicator.h index 0fdb757aafb7e38d17bca2a2327b208bda34e669..12139fcee1b498182b89b4fe838e60ed6368b396 100644 --- a/frameworks/libs/distributeddb/interfaces/include/iprocess_communicator.h +++ b/frameworks/libs/distributeddb/interfaces/include/iprocess_communicator.h @@ -39,6 +39,7 @@ struct ExtendInfo { struct UserInfo { std::string receiveUser; + std::string sendUser; }; class ExtendHeaderHandle { @@ -60,6 +61,11 @@ public: { return OK; }; + + virtual std::string GetTargetUserId() + { + return ""; + } }; // In OnDeviceChange, all field of devInfo should be valid, isOnline true for online and false for offline. diff --git a/frameworks/libs/distributeddb/interfaces/include/store_types.h b/frameworks/libs/distributeddb/interfaces/include/store_types.h index a75a5b428c3e8f87cd47642d2fbc2127d46c6ffd..336d01f1f115c511550dd5e47ed687d1a7c78739 100644 --- a/frameworks/libs/distributeddb/interfaces/include/store_types.h +++ b/frameworks/libs/distributeddb/interfaces/include/store_types.h @@ -318,5 +318,18 @@ enum class DataOperator : uint32_t { UPDATE_TIME = 0x01, RESET_UPLOAD_CLOUD = 0x02 }; + +struct DeviceSyncTarget { + std::string device; + std::string userId; + DeviceSyncTarget(std::string device, std::string userId) : device(std::move(device)), userId(std::move(userId)) {} + bool operator<(const DeviceSyncTarget& other) const + { + if (device == other.device) { + return userId < other.userId; + } + return device < other.device; + } +}; } // namespace DistributedDB #endif // KV_STORE_TYPE_H diff --git a/frameworks/libs/distributeddb/interfaces/src/relational/relational_sync_able_storage.h b/frameworks/libs/distributeddb/interfaces/src/relational/relational_sync_able_storage.h index 012ba84c7e0199a0ea8ce57b86917ff6e1e4cf19..777caa77ed81ead520d401afeb567454db4ff982 100644 --- a/frameworks/libs/distributeddb/interfaces/src/relational/relational_sync_able_storage.h +++ b/frameworks/libs/distributeddb/interfaces/src/relational/relational_sync_able_storage.h @@ -62,6 +62,8 @@ public: // Get meta data associated with the given key. int GetMetaData(const Key &key, Value &value) const override; + int GetMetaDataByPrefixKey(const Key &keyPrefix, std::map &data) const override; + // Put meta data as a key-value entry. int PutMetaData(const Key &key, const Value &value) override; diff --git a/frameworks/libs/distributeddb/storage/include/isync_interface.h b/frameworks/libs/distributeddb/storage/include/isync_interface.h index 4cabb6b10131f148cb8f5616d956251f438b173c..6a74a50c257dd3bdbd1f638fec9143c1b4c7ed46 100644 --- a/frameworks/libs/distributeddb/storage/include/isync_interface.h +++ b/frameworks/libs/distributeddb/storage/include/isync_interface.h @@ -54,6 +54,8 @@ public: // Get meta data associated with the given key. virtual int GetMetaData(const Key &key, Value &value) const = 0; + virtual int GetMetaDataByPrefixKey(const Key &keyPrefix, std::map &data) const = 0; + // Put meta data as a key-value entry. virtual int PutMetaData(const Key &key, const Value &value, bool isInTransaction) = 0; diff --git a/frameworks/libs/distributeddb/storage/src/gaussdb_rd/rd_single_ver_natural_store.cpp b/frameworks/libs/distributeddb/storage/src/gaussdb_rd/rd_single_ver_natural_store.cpp index 63dea2b08a0d2b420dbdf97683713b422a289c35..be4d48aeb01847c8881023381cb7425f1a05a783 100644 --- a/frameworks/libs/distributeddb/storage/src/gaussdb_rd/rd_single_ver_natural_store.cpp +++ b/frameworks/libs/distributeddb/storage/src/gaussdb_rd/rd_single_ver_natural_store.cpp @@ -198,6 +198,11 @@ int RdSingleVerNaturalStore::GetMetaData(const Key &key, Value &value) const return -E_NOT_SUPPORT; } +int RdSingleVerNaturalStore::GetMetaDataByPrefixKey(const Key &keyPrefix, std::map &data) const +{ + return -E_NOT_SUPPORT; +} + int RdSingleVerNaturalStore::PutMetaData(const Key &key, const Value &value, bool isInTransaction) { return -E_NOT_SUPPORT; diff --git a/frameworks/libs/distributeddb/storage/src/gaussdb_rd/rd_single_ver_natural_store.h b/frameworks/libs/distributeddb/storage/src/gaussdb_rd/rd_single_ver_natural_store.h index 0fbfe89685a766f755e788fa02851c9994cc46bd..8bca78c89476a8b790d2510aade173e7ec46cfb9 100644 --- a/frameworks/libs/distributeddb/storage/src/gaussdb_rd/rd_single_ver_natural_store.h +++ b/frameworks/libs/distributeddb/storage/src/gaussdb_rd/rd_single_ver_natural_store.h @@ -60,6 +60,8 @@ public: int GetMetaData(const Key &key, Value &value) const override; + int GetMetaDataByPrefixKey(const Key &keyPrefix, std::map &data) const override; + int PutMetaData(const Key &key, const Value &value, bool isInTransaction) override; // Delete multiple meta data records in a transaction. diff --git a/frameworks/libs/distributeddb/storage/src/relational/relational_sync_able_storage.cpp b/frameworks/libs/distributeddb/storage/src/relational/relational_sync_able_storage.cpp index 57335c959f58e445f1692fefc49dbf6e379ac4ae..b7da21ae833c006be97027d724c052fd05d6f814 100644 --- a/frameworks/libs/distributeddb/storage/src/relational/relational_sync_able_storage.cpp +++ b/frameworks/libs/distributeddb/storage/src/relational/relational_sync_able_storage.cpp @@ -105,7 +105,6 @@ void RelationalSyncAbleStorage::GetMaxTimestamp(Timestamp ×tamp) const TriggerCloseAutoLaunchConn(storageEngine_->GetProperties()); } ReleaseHandle(handle); - return; } int RelationalSyncAbleStorage::GetMaxTimestamp(const std::string &tableName, Timestamp ×tamp) const @@ -179,9 +178,6 @@ void RelationalSyncAbleStorage::ReleaseHandle(SQLiteSingleVerRelationalStorageEx // Get meta data associated with the given key. int RelationalSyncAbleStorage::GetMetaData(const Key &key, Value &value) const { - if (storageEngine_ == nullptr) { - return -E_INVALID_DB; - } if (key.size() > DBConstant::MAX_KEY_SIZE) { return -E_INVALID_ARGS; } @@ -198,12 +194,27 @@ int RelationalSyncAbleStorage::GetMetaData(const Key &key, Value &value) const return errCode; } +int RelationalSyncAbleStorage::GetMetaDataByPrefixKey(const Key &keyPrefix, std::map &data) const +{ + if (keyPrefix.size() > DBConstant::MAX_KEY_SIZE) { + return -E_INVALID_ARGS; + } + int errCode = E_OK; + auto handle = GetHandle(false, errCode, OperatePerm::NORMAL_PERM); + if (handle == nullptr) { + return errCode; + } + errCode = handle->GetKvDataByPrefixKey(keyPrefix, data); + if (errCode != E_OK && errCode != -E_NOT_FOUND) { + TriggerCloseAutoLaunchConn(storageEngine_->GetProperties()); + } + ReleaseHandle(handle); + return errCode; +} + // Put meta data as a key-value entry. int RelationalSyncAbleStorage::PutMetaData(const Key &key, const Value &value) { - if (storageEngine_ == nullptr) { - return -E_INVALID_DB; - } int errCode = E_OK; auto *handle = GetHandle(true, errCode, OperatePerm::NORMAL_PERM); if (handle == nullptr) { @@ -260,9 +271,6 @@ int RelationalSyncAbleStorage::PutMetaData(const Key &key, const Value &value, b // Delete multiple meta data records in a transaction. int RelationalSyncAbleStorage::DeleteMetaData(const std::vector &keys) { - if (storageEngine_ == nullptr) { - return -E_INVALID_DB; - } for (const auto &key : keys) { if (key.empty() || key.size() > DBConstant::MAX_KEY_SIZE) { return -E_INVALID_ARGS; @@ -290,9 +298,6 @@ int RelationalSyncAbleStorage::DeleteMetaData(const std::vector &keys) // Delete multiple meta data records with key prefix in a transaction. int RelationalSyncAbleStorage::DeleteMetaDataByPrefixKey(const Key &keyPrefix) const { - if (storageEngine_ == nullptr) { - return -E_INVALID_DB; - } if (keyPrefix.empty() || keyPrefix.size() > DBConstant::MAX_KEY_SIZE) { return -E_INVALID_ARGS; } @@ -315,9 +320,6 @@ int RelationalSyncAbleStorage::DeleteMetaDataByPrefixKey(const Key &keyPrefix) c // Get all meta data keys. int RelationalSyncAbleStorage::GetAllMetaKeys(std::vector &keys) const { - if (storageEngine_ == nullptr) { - return -E_INVALID_DB; - } int errCode = E_OK; auto *handle = GetHandle(true, errCode, OperatePerm::NORMAL_PERM); if (handle == nullptr) { diff --git a/frameworks/libs/distributeddb/storage/src/sqlite/relational/sqlite_single_ver_relational_storage_executor.cpp b/frameworks/libs/distributeddb/storage/src/sqlite/relational/sqlite_single_ver_relational_storage_executor.cpp index 0998c5f6593d8f32b052ccd0a41ec337cfd2451f..bad396c938d1d76ff58e05b8e463db2bed0c7ce8 100644 --- a/frameworks/libs/distributeddb/storage/src/sqlite/relational/sqlite_single_ver_relational_storage_executor.cpp +++ b/frameworks/libs/distributeddb/storage/src/sqlite/relational/sqlite_single_ver_relational_storage_executor.cpp @@ -806,6 +806,13 @@ END: return errCode != E_OK ? errCode : ret; } +int SQLiteSingleVerRelationalStorageExecutor::GetKvDataByPrefixKey(const Key &keyPrefix, + std::map &data) const +{ + std::string metaTableName = std::string(DBConstant::RELATIONAL_PREFIX) + "metadata"; + return SqliteMetaExecutor::GetMetaDataByPrefixKey(dbHandle_, isMemDb_, metaTableName, keyPrefix, data); +} + int SQLiteSingleVerRelationalStorageExecutor::PutKvData(const Key &key, const Value &value) const { static const std::string INSERT_META_SQL = "INSERT OR REPLACE INTO " + std::string(DBConstant::RELATIONAL_PREFIX) + @@ -1021,10 +1028,8 @@ int SQLiteSingleVerRelationalStorageExecutor::CheckDataConflictDefeated(const Da isDefeated = false; // no need to solve conflict except miss query data return E_OK; } - if (!isExist || dataItem.dev != logInfoGet.device) { - // defeated if item timestamp is earlier than raw data - isDefeated = (dataItem.timestamp <= logInfoGet.timestamp); - } + // defeated if item timestamp is earlier than raw data + isDefeated = (dataItem.timestamp < logInfoGet.timestamp); return E_OK; } diff --git a/frameworks/libs/distributeddb/storage/src/sqlite/relational/sqlite_single_ver_relational_storage_executor.h b/frameworks/libs/distributeddb/storage/src/sqlite/relational/sqlite_single_ver_relational_storage_executor.h index 8acac8e99787cd73959897cdbbc8e805946a649d..c0b05396d8eaf5a70f67df99a21bb3e0a59bfc97 100644 --- a/frameworks/libs/distributeddb/storage/src/sqlite/relational/sqlite_single_ver_relational_storage_executor.h +++ b/frameworks/libs/distributeddb/storage/src/sqlite/relational/sqlite_single_ver_relational_storage_executor.h @@ -80,6 +80,7 @@ public: // operation of meta data int GetKvData(const Key &key, Value &value) const; + int GetKvDataByPrefixKey(const Key &keyPrefix, std::map &data) const; int PutKvData(const Key &key, const Value &value) const; int DeleteMetaData(const std::vector &keys) const; int DeleteMetaDataByPrefixKey(const Key &keyPrefix) const; diff --git a/frameworks/libs/distributeddb/storage/src/sqlite/sqlite_meta_executor.cpp b/frameworks/libs/distributeddb/storage/src/sqlite/sqlite_meta_executor.cpp index e9f2e26b33f35818b87e17de1ffb4a38d7331675..612af826e6d04dfdf8528ccd9595b7db5e22f888 100644 --- a/frameworks/libs/distributeddb/storage/src/sqlite/sqlite_meta_executor.cpp +++ b/frameworks/libs/distributeddb/storage/src/sqlite/sqlite_meta_executor.cpp @@ -111,4 +111,45 @@ int SqliteMetaExecutor::GetExistsDevicesFromMeta(sqlite3 *dbHandle, MetaMode met } return errCode; } + +int SqliteMetaExecutor::GetMetaDataByPrefixKey(sqlite3 *dbHandle, bool isMemDb, const std::string &metaTableName, + const Key &keyPrefix, std::map &data) +{ + std::string sql = "SELECT key,value FROM " + metaTableName + " WHERE key >= ? AND key <= ?;"; + sqlite3_stmt *statement = nullptr; + int errCode = SQLiteUtils::GetStatement(dbHandle, sql, statement); + if (errCode != E_OK) { + LOGE("[SqliteMetaExecutor][GetMetaDataByPrefixKey] Get statement failed:%d", errCode); + return errCode; + } + + errCode = SQLiteUtils::BindPrefixKey(statement, 1, keyPrefix); // 1 is first arg. + if (errCode != E_OK) { + LOGE("[SqliteMetaExecutor][GetMetaDataByPrefixKey] Bind prefix key failed:%d", errCode); + return SQLiteUtils::ProcessStatementErrCode(statement, true, errCode); + } + do { + errCode = SQLiteUtils::StepWithRetry(statement, isMemDb); + if (errCode != SQLiteUtils::MapSQLiteErrno(SQLITE_ROW)) { + break; + } + Key key; + errCode = SQLiteUtils::GetColumnBlobValue(statement, 0, key); // 0 is key. + if (errCode != E_OK) { + LOGE("[SqliteMetaExecutor][GetMetaDataByPrefixKey] Get key failed:%d", errCode); + return SQLiteUtils::ProcessStatementErrCode(statement, true, errCode); + } + Value value; + errCode = SQLiteUtils::GetColumnBlobValue(statement, 1, value); // 1 is value. + if (errCode != E_OK) { + LOGE("[SqliteMetaExecutor][GetMetaDataByPrefixKey] Get value failed:%d", errCode); + return SQLiteUtils::ProcessStatementErrCode(statement, true, errCode); + } + data[key] = value; + } while (errCode == E_OK); + if (errCode == SQLiteUtils::MapSQLiteErrno(SQLITE_DONE)) { + errCode = E_OK; + } + return SQLiteUtils::ProcessStatementErrCode(statement, true, errCode); +} } \ No newline at end of file diff --git a/frameworks/libs/distributeddb/storage/src/sqlite/sqlite_meta_executor.h b/frameworks/libs/distributeddb/storage/src/sqlite/sqlite_meta_executor.h index f2890e7b473817abacfe96ed71f5bbd9d1c3cf94..0fcd3f350261b287b8b8c02cd555b0fdd4fff329 100644 --- a/frameworks/libs/distributeddb/storage/src/sqlite/sqlite_meta_executor.h +++ b/frameworks/libs/distributeddb/storage/src/sqlite/sqlite_meta_executor.h @@ -33,6 +33,9 @@ public: static int GetExistsDevicesFromMeta(sqlite3 *dbHandle, MetaMode metaMode, bool isMemDb, std::set &devices); + + static int GetMetaDataByPrefixKey(sqlite3 *dbHandle, bool isMemDb, const std::string &metaTableName, + const Key &keyPrefix, std::map &data); private: static constexpr const char *SELECT_ATTACH_META_KEYS_BY_PREFIX = "SELECT key FROM meta.meta_data where key like ?;"; diff --git a/frameworks/libs/distributeddb/storage/src/sqlite/sqlite_single_ver_natural_store.cpp b/frameworks/libs/distributeddb/storage/src/sqlite/sqlite_single_ver_natural_store.cpp index 7476c7911fac2792949dd761b7c1a7b366ec74ab..b45cd961d26c9b49d4fc960952c792086e42416f 100644 --- a/frameworks/libs/distributeddb/storage/src/sqlite/sqlite_single_ver_natural_store.cpp +++ b/frameworks/libs/distributeddb/storage/src/sqlite/sqlite_single_ver_natural_store.cpp @@ -549,6 +549,31 @@ int SQLiteSingleVerNaturalStore::GetMetaData(const Key &key, Value &value) const return errCode; } +int SQLiteSingleVerNaturalStore::GetMetaDataByPrefixKey(const Key &keyPrefix, std::map &data) const +{ + if (storageEngine_ == nullptr) { + return -E_INVALID_DB; + } + if (keyPrefix.size() > DBConstant::MAX_KEY_SIZE) { + return -E_INVALID_ARGS; + } + + int errCode = E_OK; + SecurityOption option; + (void)GetSecurityOption(option); + bool isWrite = (option.securityLabel >= S3) && (option.securityFlag == SECE); + // meta in S3 SECE open meta.db, should use write handle + auto handle = GetHandle(isWrite, errCode); + if (handle == nullptr) { + return errCode; + } + + errCode = handle->GetMetaDataByPrefixKey(keyPrefix, data); + ReleaseHandle(handle); + HeartBeatForLifeCycle(); + return errCode; +} + int SQLiteSingleVerNaturalStore::PutMetaData(const Key &key, const Value &value, bool isInTransaction) { (void)isInTransaction; diff --git a/frameworks/libs/distributeddb/storage/src/sqlite/sqlite_single_ver_natural_store.h b/frameworks/libs/distributeddb/storage/src/sqlite/sqlite_single_ver_natural_store.h index 82bb7045c0f3e564eedc69318ba3605bf97a756c..dd0bffdcb0cfd3904f1da68c7258c7131798306b 100644 --- a/frameworks/libs/distributeddb/storage/src/sqlite/sqlite_single_ver_natural_store.h +++ b/frameworks/libs/distributeddb/storage/src/sqlite/sqlite_single_ver_natural_store.h @@ -65,6 +65,8 @@ public: int GetMetaData(const Key &key, Value &value) const override; + int GetMetaDataByPrefixKey(const Key &keyPrefix, std::map &data) const override; + int PutMetaData(const Key &key, const Value &value, bool isInTransaction) override; // Delete multiple meta data records in a transaction. diff --git a/frameworks/libs/distributeddb/storage/src/sqlite/sqlite_single_ver_storage_executor.cpp b/frameworks/libs/distributeddb/storage/src/sqlite/sqlite_single_ver_storage_executor.cpp index a99a3c6252f0c429bcd696dd7df84dfeb64b3136..3cc5c82bd911f078bcba73d236e932383c2117f7 100644 --- a/frameworks/libs/distributeddb/storage/src/sqlite/sqlite_single_ver_storage_executor.cpp +++ b/frameworks/libs/distributeddb/storage/src/sqlite/sqlite_single_ver_storage_executor.cpp @@ -17,7 +17,6 @@ #include -#include "cloud/cloud_store_types.h" #include "db_constant.h" #include "db_common.h" #include "db_errno.h" @@ -238,7 +237,6 @@ int SQLiteSingleVerStorageExecutor::GetKvDataByHashKey(const Key &hashKey, Singl result.origDevice = std::string(origDevVect.begin(), origDevVect.end()); } else if (errCode == SQLiteUtils::MapSQLiteErrno(SQLITE_DONE)) { errCode = -E_NOT_FOUND; - goto END; } END: diff --git a/frameworks/libs/distributeddb/storage/src/sqlite/sqlite_single_ver_storage_executor.h b/frameworks/libs/distributeddb/storage/src/sqlite/sqlite_single_ver_storage_executor.h index 1192a2e62e48d71c630ca691abf00402c43d34df..16c1022c12e219d2a55b96b4bb788c5fa0e74b2c 100644 --- a/frameworks/libs/distributeddb/storage/src/sqlite/sqlite_single_ver_storage_executor.h +++ b/frameworks/libs/distributeddb/storage/src/sqlite/sqlite_single_ver_storage_executor.h @@ -54,6 +54,8 @@ public: // Get all the meta keys. int GetAllMetaKeys(std::vector &keys) const; + int GetMetaDataByPrefixKey(const Key &keyPrefix, std::map &data) const; + int GetAllSyncedEntries(const std::string &hashDev, std::vector &entries) const; int SaveSyncDataItem(DataItem &dataItem, const DeviceInfo &deviceInfo, diff --git a/frameworks/libs/distributeddb/storage/src/sqlite/sqlite_single_ver_storage_executor_extend.cpp b/frameworks/libs/distributeddb/storage/src/sqlite/sqlite_single_ver_storage_executor_extend.cpp index ba67ca710f61ebe8adb60d5eb83075c83f2795dd..56bcff6714b556663f7cd84e467508e127315284 100644 --- a/frameworks/libs/distributeddb/storage/src/sqlite/sqlite_single_ver_storage_executor_extend.cpp +++ b/frameworks/libs/distributeddb/storage/src/sqlite/sqlite_single_ver_storage_executor_extend.cpp @@ -487,4 +487,10 @@ int SQLiteSingleVerStorageExecutor::ClearCloudWatermark() { return CloudExcuteRemoveOrUpdate(REMOVE_CLOUD_ALL_HWM_DATA_SQL, "", "", true); } + +int SQLiteSingleVerStorageExecutor::GetMetaDataByPrefixKey(const Key &keyPrefix, std::map &data) const +{ + std::string metaTableName = "meta_data"; + return SqliteMetaExecutor::GetMetaDataByPrefixKey(dbHandle_, isMemDb_, metaTableName, keyPrefix, data); +} } // namespace DistributedDB diff --git a/frameworks/libs/distributeddb/storage/src/sqlite/sqlite_utils.h b/frameworks/libs/distributeddb/storage/src/sqlite/sqlite_utils.h index 1953db51e23826a3d88761ee7f8ad9a1e1d94592..69b1a18c75891541ab13fb27faa260cbb2f52db7 100644 --- a/frameworks/libs/distributeddb/storage/src/sqlite/sqlite_utils.h +++ b/frameworks/libs/distributeddb/storage/src/sqlite/sqlite_utils.h @@ -213,6 +213,8 @@ public: static int UpdateLocalDataModifyTime(sqlite3 *db, const std::string &virtualTime, const std::string &modifyTime); static int UpdateLocalDataCloudFlag(sqlite3 *db); + + static int ProcessStatementErrCode(sqlite3_stmt *&statement, bool isNeedFinalize, int errCode); private: static int CreateDataBase(const OpenDbProperties &properties, sqlite3 *&dbTemp, bool setWal); diff --git a/frameworks/libs/distributeddb/storage/src/sqlite/sqlite_utils_extend.cpp b/frameworks/libs/distributeddb/storage/src/sqlite/sqlite_utils_extend.cpp index 2164d1871ba20e8640a7275cabff0b366f76ca56..fecd1caf75db1f5198ee38407457831c4a61d1c4 100644 --- a/frameworks/libs/distributeddb/storage/src/sqlite/sqlite_utils_extend.cpp +++ b/frameworks/libs/distributeddb/storage/src/sqlite/sqlite_utils_extend.cpp @@ -787,4 +787,11 @@ int SQLiteUtils::UpdateLocalDataCloudFlag(sqlite3 *db) } return errCode; } + +int SQLiteUtils::ProcessStatementErrCode(sqlite3_stmt *&statement, bool isNeedFinalize, int errCode) +{ + int ret = E_OK; + SQLiteUtils::ResetStatement(statement, isNeedFinalize, ret); + return errCode != E_OK ? errCode : ret; +} } // namespace DistributedDB diff --git a/frameworks/libs/distributeddb/syncer/src/device/ability_sync.cpp b/frameworks/libs/distributeddb/syncer/src/device/ability_sync.cpp index 7a4af6fa01b018eccd7db4728968c9e439df2ef3..e4239e09e6585d9c76d2d830abc9aa00b5fb4057 100644 --- a/frameworks/libs/distributeddb/syncer/src/device/ability_sync.cpp +++ b/frameworks/libs/distributeddb/syncer/src/device/ability_sync.cpp @@ -423,7 +423,7 @@ int AbilitySync::AckRecv(const Message *message, ISyncTaskContext *context) } uint32_t remoteSoftwareVersion = packet->GetSoftwareVersion(); context->SetRemoteSoftwareVersion(remoteSoftwareVersion); - metadata_->SetRemoteSchemaVersion(context->GetDeviceId(), remoteSoftwareVersion); + metadata_->SetRemoteSchemaVersion(context->GetDeviceId(), context->GetTargetUserId(), remoteSoftwareVersion); if (remoteSoftwareVersion > SOFTWARE_VERSION_RELEASE_2_0) { errCode = AckRecvWithHighVersion(message, context, packet); } else { @@ -518,7 +518,7 @@ void AbilitySync::SetAbilitySyncFinishedStatus(bool syncFinished, ISyncTaskConte if (syncFinished && !context.IsSchemaCompatible()) { // LCOV_EXCL_BR_LINE return; } - int errCode = metadata_->SetAbilitySyncFinishMark(deviceId_, syncFinished); + int errCode = metadata_->SetAbilitySyncFinishMark(deviceId_, context.GetTargetUserId(), syncFinished); if (errCode != E_OK) { LOGW("[AbilitySync] Set ability sync finish mark failed %d", errCode); } @@ -1155,10 +1155,11 @@ int AbilitySync::HandleRequestRecv(const Message *message, ISyncTaskContext *con ackCode = -E_SECURITY_OPTION_CHECK_ERROR; } if (ackCode == E_OK && remoteSoftwareVersion > SOFTWARE_VERSION_RELEASE_3_0) { - ackCode = metadata_->SetDbCreateTime(deviceId_, packet->GetDbCreateTime(), true); + ackCode = metadata_->SetDbCreateTime(deviceId_, context->GetTargetUserId(), packet->GetDbCreateTime(), true); } if (ackCode == E_OK && remoteSoftwareVersion >= SOFTWARE_VERSION_RELEASE_9_0) { - ackCode = metadata_->SetRemoteSchemaVersion(context->GetDeviceId(), packet->GetSchemaVersion()); + ackCode = metadata_->SetRemoteSchemaVersion(context->GetDeviceId(), context->GetTargetUserId(), + packet->GetSchemaVersion()); } AbilitySyncAckPacket ackPacket; if (IsSingleRelationalVer()) { @@ -1334,7 +1335,7 @@ int AbilitySync::AckRecvWithHighVersion(const Message *message, ISyncTaskContext std::pair schemaSyncStatus; int errCode = E_OK; if (context->GetRemoteSoftwareVersion() > SOFTWARE_VERSION_RELEASE_3_0) { - errCode = metadata_->SetDbCreateTime(deviceId_, packet->GetDbCreateTime(), true); + errCode = metadata_->SetDbCreateTime(deviceId_, context->GetTargetUserId(), packet->GetDbCreateTime(), true); if (errCode != E_OK) { LOGE("[AbilitySync][AckRecv] set db create time failed,errCode=%d", errCode); context->SetTaskErrCode(errCode); @@ -1378,7 +1379,7 @@ bool AbilitySync::IsBothKvAndOptAbilitySync(uint32_t remoteVersion, SchemaType l void AbilitySync::InitAbilitySyncFinishStatus(ISyncTaskContext &context) { - if (!metadata_->IsAbilitySyncFinish(context.GetDeviceId())) { + if (!metadata_->IsAbilitySyncFinish(context.GetDeviceId(), context.GetTargetUserId())) { return; } LOGI("[AbilitySync] Mark ability sync finish from db status"); @@ -1398,7 +1399,8 @@ void AbilitySync::InitRemoteDBAbility(ISyncTaskContext &context) return; } context.SetDbAbility(ability); - auto version = static_cast(metadata_->GetRemoteSoftwareVersion(context.GetDeviceId())); + auto version = static_cast(metadata_->GetRemoteSoftwareVersion(context.GetDeviceId(), + context.GetTargetUserId())); if (version > 0) { context.SetRemoteSoftwareVersion(version); } @@ -1408,7 +1410,8 @@ void AbilitySync::RecordAbilitySyncFinish(uint64_t remoteSchemaVersion, ISyncTas { SetAbilitySyncFinishedStatus(true, context); if (context.GetRemoteSoftwareVersion() >= SOFTWARE_VERSION_RELEASE_9_0) { // LCOV_EXCL_BR_LINE - (void)metadata_->SetRemoteSchemaVersion(deviceId_, remoteSchemaVersion); + (void)metadata_->SetRemoteSchemaVersion(deviceId_, context.GetTargetUserId(), remoteSchemaVersion); } + (void)metadata_->SetRemoteSoftwareVersion(deviceId_, context.GetTargetUserId(), remoteSchemaVersion); } } // namespace DistributedDB \ No newline at end of file diff --git a/frameworks/libs/distributeddb/syncer/src/device/communicator_proxy.cpp b/frameworks/libs/distributeddb/syncer/src/device/communicator_proxy.cpp index 15327f2541210458e16587e8943b889329a9c46a..847d17ee2f05a6ebf5e9603bc7e0c937306a9367 100644 --- a/frameworks/libs/distributeddb/syncer/src/device/communicator_proxy.cpp +++ b/frameworks/libs/distributeddb/syncer/src/device/communicator_proxy.cpp @@ -272,4 +272,27 @@ void CommunicatorProxy::Dump(int fd) DBDumpHelper::Dump(fd, "\t\ttarget = %s, label = %s\n", target.c_str(), label.c_str()); } } + +std::string CommunicatorProxy::GetTargetUserId(const ExtendInfo ¶mInfo) const +{ + ICommunicator *targetCommunicator = nullptr; + { + std::lock_guard lock(devCommMapLock_); + if (devCommMap_.count(paramInfo.dstTarget) != 0) { + targetCommunicator = devCommMap_.at(paramInfo.dstTarget).second; + RefObject::IncObjRef(targetCommunicator); + } + } + if (targetCommunicator != nullptr) { + std::string targetUserId = targetCommunicator->GetTargetUserId(paramInfo); + RefObject::DecObjRef(targetCommunicator); + return targetUserId; + } + + if (mainComm_ != nullptr) { + return mainComm_->GetTargetUserId(paramInfo); + } + + return ""; +} } // namespace DistributedDB \ No newline at end of file diff --git a/frameworks/libs/distributeddb/syncer/src/device/communicator_proxy.h b/frameworks/libs/distributeddb/syncer/src/device/communicator_proxy.h index fafd852f7067b42c670d8f67eec8b3c98c217884..9049a37b0e83ae42d3426482d082453a8e06102e 100644 --- a/frameworks/libs/distributeddb/syncer/src/device/communicator_proxy.h +++ b/frameworks/libs/distributeddb/syncer/src/device/communicator_proxy.h @@ -55,6 +55,8 @@ public: void Dump(int fd); + std::string GetTargetUserId(const ExtendInfo ¶mInfo) const override; + private: ICommunicator *mainComm_; mutable std::mutex devCommMapLock_; diff --git a/frameworks/libs/distributeddb/syncer/src/device/generic_syncer.cpp b/frameworks/libs/distributeddb/syncer/src/device/generic_syncer.cpp index 772dee8f9d82aa1a3551aec1807c79bad7efd50e..aaeeda2449690c27aa0547477cf743914572a9df 100644 --- a/frameworks/libs/distributeddb/syncer/src/device/generic_syncer.cpp +++ b/frameworks/libs/distributeddb/syncer/src/device/generic_syncer.cpp @@ -1114,7 +1114,7 @@ int GenericSyncer::GetSyncDataSize(const std::string &device, size_t &size) cons syncInterface_->IncRefCount(); metadata = metadata_; } - metadata->GetLocalWaterMark(device, localWaterMark); + metadata->GetLocalWaterMark(device, "", localWaterMark); uint32_t expectedMtuSize = DEFAULT_MTU_SIZE; DataSizeSpecInfo syncDataSizeInfo = {expectedMtuSize, static_cast(MAX_TIMESTAMP)}; std::vector outData; @@ -1207,7 +1207,7 @@ int GenericSyncer::GetWatermarkInfo(const std::string &device, WatermarkInfo &in } else { dev = device; } - return metadata->GetWaterMarkInfoFromDB(dev, devNeedHash, info); + return metadata->GetWaterMarkInfoFromDB(dev, DBConstant::DEFAULT_USER, devNeedHash, info); } int GenericSyncer::UpgradeSchemaVerInMeta() diff --git a/frameworks/libs/distributeddb/syncer/src/device/isync_task_context.h b/frameworks/libs/distributeddb/syncer/src/device/isync_task_context.h index 91ed88936156ceb0092bd4c6a30b09c17a48ba57..2ef33d7d59666698eba40b565fb7eb20f00ecce7 100644 --- a/frameworks/libs/distributeddb/syncer/src/device/isync_task_context.h +++ b/frameworks/libs/distributeddb/syncer/src/device/isync_task_context.h @@ -35,7 +35,7 @@ public: enum TASK_EXEC_STATUS { INIT, RUNNING, FAILED, FINISHED }; // Initialize the context - virtual int Initialize(const std::string &deviceId, ISyncInterface *syncInterface, + virtual int Initialize(const DeviceSyncTarget &target, ISyncInterface *syncInterface, const std::shared_ptr &metadata, ICommunicator *communicator) = 0; // Add a sync task target with the operation to the queue @@ -76,6 +76,10 @@ public: // Get the current task deviceId. virtual std::string GetDeviceId() const = 0; + virtual std::string GetTargetUserId() const = 0; + + virtual void SetTargetUserId(const std::string &userId) = 0; + virtual void SetTaskExecStatus(int status) = 0; virtual int GetTaskExecStatus() const = 0; diff --git a/frameworks/libs/distributeddb/syncer/src/device/meta_data.cpp b/frameworks/libs/distributeddb/syncer/src/device/meta_data.cpp index 80fc35acf24b3d480acd36c508f0e03f29e3299a..e6e6d68fb1591bcb369c95eb3c052dd240713fd2 100644 --- a/frameworks/libs/distributeddb/syncer/src/device/meta_data.cpp +++ b/frameworks/libs/distributeddb/syncer/src/device/meta_data.cpp @@ -70,59 +70,85 @@ int Metadata::Initialize(ISyncInterface* storage) return LoadAllMetadata(); } -int Metadata::SaveTimeOffset(const DeviceID &deviceId, TimeOffset inValue) +int Metadata::SaveTimeOffset(const DeviceID &deviceId, const DeviceID &userId, TimeOffset inValue) { MetaDataValue metadata; std::lock_guard lockGuard(metadataLock_); - GetMetaDataValue(deviceId, metadata, true); + GetMetaDataValue(deviceId, userId, metadata, true); metadata.timeOffset = inValue; metadata.lastUpdateTime = TimeHelper::GetSysCurrentTime(); LOGD("Metadata::SaveTimeOffset = %" PRId64 " dev %s", inValue, STR_MASK(deviceId)); - return SaveMetaDataValue(deviceId, metadata); + return SaveMetaDataValue(deviceId, userId, metadata); } -void Metadata::GetTimeOffset(const DeviceID &deviceId, TimeOffset &outValue) +void Metadata::GetTimeOffset(const DeviceID &deviceId, const DeviceID &userId, TimeOffset &outValue) { MetaDataValue metadata; std::lock_guard lockGuard(metadataLock_); - GetMetaDataValue(deviceId, metadata, true); + GetMetaDataValue(deviceId, userId, metadata, true); outValue = metadata.timeOffset; } -void Metadata::GetLocalWaterMark(const DeviceID &deviceId, uint64_t &outValue) +void Metadata::GetLocalWaterMark(const DeviceID &deviceId, const DeviceID &userId, uint64_t &outValue) { MetaDataValue metadata; std::lock_guard lockGuard(metadataLock_); - GetMetaDataValue(deviceId, metadata, true); + GetMetaDataValue(deviceId, userId, metadata, true); outValue = metadata.localWaterMark; } -int Metadata::SaveLocalWaterMark(const DeviceID &deviceId, uint64_t inValue) +int Metadata::SaveLocalWaterMark(const DeviceID &deviceId, const DeviceID &userId, uint64_t inValue) { MetaDataValue metadata; std::lock_guard lockGuard(metadataLock_); - GetMetaDataValue(deviceId, metadata, true); + GetMetaDataValue(deviceId, userId, metadata, true); metadata.localWaterMark = inValue; LOGD("Metadata::SaveLocalWaterMark = %" PRIu64, inValue); - return SaveMetaDataValue(deviceId, metadata); + return SaveMetaDataValue(deviceId, userId, metadata); } -void Metadata::GetPeerWaterMark(const DeviceID &deviceId, uint64_t &outValue, bool isNeedHash) +void Metadata::GetPeerWaterMark(const DeviceID &deviceId, const DeviceID &userId, uint64_t &outValue, bool isNeedHash) { MetaDataValue metadata; std::lock_guard lockGuard(metadataLock_); - GetMetaDataValue(deviceId, metadata, isNeedHash); + GetMetaDataValue(deviceId, userId, metadata, isNeedHash); outValue = metadata.peerWaterMark; } -int Metadata::SavePeerWaterMark(const DeviceID &deviceId, uint64_t inValue, bool isNeedHash) +int Metadata::SavePeerWaterMark(const DeviceID &deviceId, const DeviceID &userId, uint64_t inValue, bool isNeedHash) { - MetaDataValue metadata; + std::map metadata; std::lock_guard lockGuard(metadataLock_); - GetMetaDataValue(deviceId, metadata, isNeedHash); - metadata.peerWaterMark = inValue; - LOGD("Metadata::SavePeerWaterMark = %" PRIu64, inValue); - return SaveMetaDataValue(deviceId, metadata, isNeedHash); + int errCode = E_OK; + if (!userId.empty()) { + MetaDataValue oneMetadata; + GetMetaDataValue(deviceId, userId, oneMetadata, isNeedHash); + DeviceID hashId; + Key key; + GetHashDeviceId(deviceId, userId, hashId, isNeedHash); + DBCommon::StringToVector(hashId, key); + metadata[key] = oneMetadata; + } else { + errCode = GetMetaDataFromDBByPrefixKey(deviceId, isNeedHash, metadata); + if (errCode != E_OK) { + return errCode; + } + } + + for (auto &oneMetadata : metadata) { + oneMetadata.second.peerWaterMark = inValue; + LOGD("Metadata::SavePeerWaterMark = %" PRIu64, inValue); + Value metadataValue; + errCode = SerializeMetaData(oneMetadata.second, metadataValue); + if (errCode != E_OK) { + return errCode; + } + errCode = SetMetadataToDb(oneMetadata.first, metadataValue); + if (errCode != E_OK) { + return errCode; + } + } + return E_OK; } int Metadata::SaveLocalTimeOffset(TimeOffset timeOffset, bool saveIntoDb) @@ -153,10 +179,11 @@ TimeOffset Metadata::GetLocalTimeOffset() const int Metadata::EraseDeviceWaterMark(const std::string &deviceId, bool isNeedHash) { - return EraseDeviceWaterMark(deviceId, isNeedHash, ""); + return EraseDeviceWaterMark(deviceId, "", isNeedHash, ""); } -int Metadata::EraseDeviceWaterMark(const std::string &deviceId, bool isNeedHash, const std::string &tableName) +int Metadata::EraseDeviceWaterMark(const std::string &deviceId, const std::string &userId, bool isNeedHash, + const std::string &tableName) { // reload meta data again (void)LoadAllMetadata(); @@ -164,19 +191,19 @@ int Metadata::EraseDeviceWaterMark(const std::string &deviceId, bool isNeedHash, // try to erase all the waterMark // erase deleteSync recv waterMark WaterMark waterMark = 0; - int errCodeDeleteSync = SetRecvDeleteSyncWaterMark(deviceId, waterMark, isNeedHash); + int errCodeDeleteSync = SetRecvDeleteSyncWaterMark(deviceId, userId, waterMark, isNeedHash); if (errCodeDeleteSync != E_OK) { LOGE("[Metadata] erase deleteWaterMark failed errCode:%d", errCodeDeleteSync); return errCodeDeleteSync; } // erase querySync recv waterMark - int errCodeQuerySync = ResetRecvQueryWaterMark(deviceId, tableName, isNeedHash); + int errCodeQuerySync = ResetRecvQueryWaterMark(deviceId, userId, tableName, isNeedHash); if (errCodeQuerySync != E_OK) { LOGE("[Metadata] erase queryWaterMark failed errCode:%d", errCodeQuerySync); return errCodeQuerySync; } // peerWaterMark must be erased at last - int errCode = SavePeerWaterMark(deviceId, 0, isNeedHash); + int errCode = SavePeerWaterMark(deviceId, userId, 0, isNeedHash); if (errCode != E_OK) { LOGE("[Metadata] erase peerWaterMark failed errCode:%d", errCode); return errCode; @@ -198,7 +225,8 @@ Timestamp Metadata::GetLastLocalTime() const return lastLocalTime_; } -int Metadata::SaveMetaDataValue(const DeviceID &deviceId, const MetaDataValue &inValue, bool isNeedHash) +int Metadata::SaveMetaDataValue(const DeviceID &deviceId, const DeviceID &userId, const MetaDataValue &inValue, + bool isNeedHash) { std::vector value; int errCode = SerializeMetaData(inValue, value); @@ -207,7 +235,7 @@ int Metadata::SaveMetaDataValue(const DeviceID &deviceId, const MetaDataValue &i } DeviceID hashDeviceId; - GetHashDeviceId(deviceId, hashDeviceId, isNeedHash); + GetHashDeviceId(deviceId, userId, hashDeviceId, isNeedHash); std::vector key; DBCommon::StringToVector(hashDeviceId, key); errCode = SetMetadataToDb(key, value); @@ -217,9 +245,10 @@ int Metadata::SaveMetaDataValue(const DeviceID &deviceId, const MetaDataValue &i return errCode; } -int Metadata::GetMetaDataValue(const DeviceID &deviceId, MetaDataValue &outValue, bool isNeedHash) +int Metadata::GetMetaDataValue(const DeviceID &deviceId, const DeviceID &userId, MetaDataValue &outValue, + bool isNeedHash) { - int errCode = GetMetaDataValueFromDB(deviceId, isNeedHash, outValue); + int errCode = GetMetaDataValueFromDB(deviceId, userId, isNeedHash, outValue); if (errCode == -E_NOT_FOUND && RuntimeContext::GetInstance()->IsTimeChanged()) { outValue = {}; outValue.syncMark = static_cast(SyncMark::SYNC_MARK_TIME_CHANGE); @@ -257,6 +286,14 @@ int Metadata::GetMetadataFromDb(const std::vector &key, std::vectorGetMetaData(key, outValue); } +int Metadata::GetMetadataFromDbByPrefixKey(const Key &keyPrefix, std::map &data) const +{ + if (naturalStoragePtr_ == nullptr) { + return -E_INVALID_DB; + } + return naturalStoragePtr_->GetMetaDataByPrefixKey(keyPrefix, data); +} + int Metadata::SetMetadataToDb(const std::vector &key, const std::vector &inValue) { if (naturalStoragePtr_ == nullptr) { @@ -326,51 +363,54 @@ int Metadata::LoadAllMetadata() return InitLocalMetaData(); } -void Metadata::GetHashDeviceId(const DeviceID &deviceId, DeviceID &hashDeviceId, bool isNeedHash) +void Metadata::GetHashDeviceId(const DeviceID &deviceId, const DeviceID &userId, DeviceID &hashDeviceId, + bool isNeedHash) { if (!isNeedHash) { - hashDeviceId = DBConstant::DEVICEID_PREFIX_KEY + deviceId; + hashDeviceId = DBConstant::DEVICEID_PREFIX_KEY + deviceId + DBConstant::USERID_PREFIX_KEY + userId; return; } - if (deviceIdToHashDeviceIdMap_.count(deviceId) == 0) { - hashDeviceId = DBConstant::DEVICEID_PREFIX_KEY + DBCommon::TransferHashString(deviceId); - deviceIdToHashDeviceIdMap_.insert(std::pair(deviceId, hashDeviceId)); + DeviceSyncTarget deviceInfo(deviceId, userId); + if (deviceIdToHashDeviceIdMap_.count(deviceInfo) == 0) { + hashDeviceId = DBConstant::DEVICEID_PREFIX_KEY + DBCommon::TransferHashString(deviceId) + + DBConstant::USERID_PREFIX_KEY + userId; + deviceIdToHashDeviceIdMap_.insert(std::pair(deviceInfo, hashDeviceId)); } else { - hashDeviceId = deviceIdToHashDeviceIdMap_[deviceId]; + hashDeviceId = deviceIdToHashDeviceIdMap_[deviceInfo]; } } int Metadata::GetRecvQueryWaterMark(const std::string &queryIdentify, - const std::string &deviceId, WaterMark &waterMark) + const std::string &deviceId, const std::string &userId, WaterMark &waterMark) { QueryWaterMark queryWaterMark; - int errCode = querySyncWaterMarkHelper_.GetQueryWaterMark(queryIdentify, deviceId, queryWaterMark); + int errCode = querySyncWaterMarkHelper_.GetQueryWaterMark(queryIdentify, deviceId, userId, queryWaterMark); if (errCode != E_OK) { return errCode; } WaterMark peerWaterMark; - GetPeerWaterMark(deviceId, peerWaterMark); + GetPeerWaterMark(deviceId, userId, peerWaterMark); waterMark = std::max(queryWaterMark.recvWaterMark, peerWaterMark); return E_OK; } int Metadata::SetRecvQueryWaterMark(const std::string &queryIdentify, - const std::string &deviceId, const WaterMark &waterMark) + const std::string &deviceId, const std::string &userId, const WaterMark &waterMark) { - return querySyncWaterMarkHelper_.SetRecvQueryWaterMark(queryIdentify, deviceId, waterMark); + return querySyncWaterMarkHelper_.SetRecvQueryWaterMark(queryIdentify, deviceId, userId, waterMark); } int Metadata::GetSendQueryWaterMark(const std::string &queryIdentify, - const std::string &deviceId, WaterMark &waterMark, bool isAutoLift) + const std::string &deviceId, const std::string &userId, WaterMark &waterMark, bool isAutoLift) { QueryWaterMark queryWaterMark; - int errCode = querySyncWaterMarkHelper_.GetQueryWaterMark(queryIdentify, deviceId, queryWaterMark); + int errCode = querySyncWaterMarkHelper_.GetQueryWaterMark(queryIdentify, deviceId, userId, queryWaterMark); if (errCode != E_OK) { return errCode; } if (isAutoLift) { WaterMark localWaterMark; - GetLocalWaterMark(deviceId, localWaterMark); + GetLocalWaterMark(deviceId, userId, localWaterMark); waterMark = std::max(queryWaterMark.sendWaterMark, localWaterMark); } else { waterMark = queryWaterMark.sendWaterMark; @@ -379,15 +419,16 @@ int Metadata::GetSendQueryWaterMark(const std::string &queryIdentify, } int Metadata::SetSendQueryWaterMark(const std::string &queryIdentify, - const std::string &deviceId, const WaterMark &waterMark) + const std::string &deviceId, const std::string &userId, const WaterMark &waterMark) { - return querySyncWaterMarkHelper_.SetSendQueryWaterMark(queryIdentify, deviceId, waterMark); + return querySyncWaterMarkHelper_.SetSendQueryWaterMark(queryIdentify, deviceId, userId, waterMark); } -int Metadata::GetLastQueryTime(const std::string &queryIdentify, const std::string &deviceId, Timestamp ×tamp) +int Metadata::GetLastQueryTime(const std::string &queryIdentify, const std::string &deviceId, const std::string &userId, + Timestamp ×tamp) { QueryWaterMark queryWaterMark; - int errCode = querySyncWaterMarkHelper_.GetQueryWaterMark(queryIdentify, deviceId, queryWaterMark); + int errCode = querySyncWaterMarkHelper_.GetQueryWaterMark(queryIdentify, deviceId, userId, queryWaterMark); if (errCode != E_OK) { return errCode; } @@ -395,22 +436,23 @@ int Metadata::GetLastQueryTime(const std::string &queryIdentify, const std::stri return E_OK; } -int Metadata::SetLastQueryTime(const std::string &queryIdentify, const std::string &deviceId, +int Metadata::SetLastQueryTime(const std::string &queryIdentify, const std::string &deviceId, const std::string &userId, const Timestamp ×tamp) { - return querySyncWaterMarkHelper_.SetLastQueryTime(queryIdentify, deviceId, timestamp); + return querySyncWaterMarkHelper_.SetLastQueryTime(queryIdentify, deviceId, userId, timestamp); } -int Metadata::GetSendDeleteSyncWaterMark(const DeviceID &deviceId, WaterMark &waterMark, bool isAutoLift) +int Metadata::GetSendDeleteSyncWaterMark(const DeviceID &deviceId, const DeviceID &userId, WaterMark &waterMark, + bool isAutoLift) { DeleteWaterMark deleteWaterMark; - int errCode = querySyncWaterMarkHelper_.GetDeleteSyncWaterMark(deviceId, deleteWaterMark); + int errCode = querySyncWaterMarkHelper_.GetDeleteSyncWaterMark(deviceId, userId, deleteWaterMark); if (errCode != E_OK) { return errCode; } if (isAutoLift) { WaterMark localWaterMark; - GetLocalWaterMark(deviceId, localWaterMark); + GetLocalWaterMark(deviceId, userId, localWaterMark); waterMark = std::max(deleteWaterMark.sendWaterMark, localWaterMark); } else { waterMark = deleteWaterMark.sendWaterMark; @@ -418,39 +460,41 @@ int Metadata::GetSendDeleteSyncWaterMark(const DeviceID &deviceId, WaterMark &wa return E_OK; } -int Metadata::SetSendDeleteSyncWaterMark(const DeviceID &deviceId, const WaterMark &waterMark) +int Metadata::SetSendDeleteSyncWaterMark(const DeviceID &deviceId, const DeviceID &userId, const WaterMark &waterMark) { - return querySyncWaterMarkHelper_.SetSendDeleteSyncWaterMark(deviceId, waterMark); + return querySyncWaterMarkHelper_.SetSendDeleteSyncWaterMark(deviceId, userId, waterMark); } -int Metadata::GetRecvDeleteSyncWaterMark(const DeviceID &deviceId, WaterMark &waterMark) +int Metadata::GetRecvDeleteSyncWaterMark(const DeviceID &deviceId, const DeviceID &userId, WaterMark &waterMark) { DeleteWaterMark deleteWaterMark; - int errCode = querySyncWaterMarkHelper_.GetDeleteSyncWaterMark(deviceId, deleteWaterMark); + int errCode = querySyncWaterMarkHelper_.GetDeleteSyncWaterMark(deviceId, userId, deleteWaterMark); if (errCode != E_OK) { return errCode; } WaterMark peerWaterMark; - GetPeerWaterMark(deviceId, peerWaterMark); + GetPeerWaterMark(deviceId, userId, peerWaterMark); waterMark = std::max(deleteWaterMark.recvWaterMark, peerWaterMark); return E_OK; } -int Metadata::SetRecvDeleteSyncWaterMark(const DeviceID &deviceId, const WaterMark &waterMark, bool isNeedHash) +int Metadata::SetRecvDeleteSyncWaterMark(const DeviceID &deviceId, const DeviceID &userId, const WaterMark &waterMark, + bool isNeedHash) { - return querySyncWaterMarkHelper_.SetRecvDeleteSyncWaterMark(deviceId, waterMark, isNeedHash); + return querySyncWaterMarkHelper_.SetRecvDeleteSyncWaterMark(deviceId, userId, waterMark, isNeedHash); } -int Metadata::ResetRecvQueryWaterMark(const DeviceID &deviceId, const std::string &tableName, bool isNeedHash) +int Metadata::ResetRecvQueryWaterMark(const DeviceID &deviceId, const DeviceID &userId, const std::string &tableName, + bool isNeedHash) { - return querySyncWaterMarkHelper_.ResetRecvQueryWaterMark(deviceId, tableName, isNeedHash); + return querySyncWaterMarkHelper_.ResetRecvQueryWaterMark(deviceId, userId, tableName, isNeedHash); } -void Metadata::GetDbCreateTime(const DeviceID &deviceId, uint64_t &outValue) +void Metadata::GetDbCreateTime(const DeviceID &deviceId, const DeviceID &userId, uint64_t &outValue) { std::lock_guard lockGuard(metadataLock_); MetaDataValue metadata; - int errCode = GetMetaDataValue(deviceId, metadata, true); + int errCode = GetMetaDataValue(deviceId, userId, metadata, true); if (errCode == E_OK) { outValue = metadata.dbCreateTime; return; @@ -459,11 +503,11 @@ void Metadata::GetDbCreateTime(const DeviceID &deviceId, uint64_t &outValue) LOGI("Metadata::GetDbCreateTime, not found dev = %s dbCreateTime", STR_MASK(deviceId)); } -int Metadata::SetDbCreateTime(const DeviceID &deviceId, uint64_t inValue, bool isNeedHash) +int Metadata::SetDbCreateTime(const DeviceID &deviceId, const DeviceID &userId, uint64_t inValue, bool isNeedHash) { std::lock_guard lockGuard(metadataLock_); MetaDataValue metadata; - int errCode = GetMetaDataValue(deviceId, metadata, isNeedHash); + int errCode = GetMetaDataValue(deviceId, userId, metadata, isNeedHash); if (errCode == E_OK) { if (metadata.dbCreateTime != 0 && metadata.dbCreateTime != inValue) { metadata.clearDeviceDataMark = REMOVE_DEVICE_DATA_MARK; @@ -478,26 +522,26 @@ int Metadata::SetDbCreateTime(const DeviceID &deviceId, uint64_t inValue, bool i } metadata.dbCreateTime = inValue; - return SaveMetaDataValue(deviceId, metadata, isNeedHash); + return SaveMetaDataValue(deviceId, userId, metadata, isNeedHash); } -int Metadata::ResetMetaDataAfterRemoveData(const DeviceID &deviceId) +int Metadata::ResetMetaDataAfterRemoveData(const DeviceID &deviceId, const DeviceID &userId) { std::lock_guard lockGuard(metadataLock_); MetaDataValue metadata; - int errCode = GetMetaDataValue(deviceId, metadata, true); + int errCode = GetMetaDataValue(deviceId, userId, metadata, true); if (errCode == E_OK) { metadata.clearDeviceDataMark = 0; - return SaveMetaDataValue(deviceId, metadata, true); + return SaveMetaDataValue(deviceId, userId, metadata, true); } return errCode; } -void Metadata::GetRemoveDataMark(const DeviceID &deviceId, uint64_t &outValue) +void Metadata::GetRemoveDataMark(const DeviceID &deviceId, const DeviceID &userId, uint64_t &outValue) { std::lock_guard lockGuard(metadataLock_); MetaDataValue metadata; - int errCode = GetMetaDataValue(deviceId, metadata, true); + int errCode = GetMetaDataValue(deviceId, userId, metadata, true); if (errCode == E_OK) { outValue = metadata.clearDeviceDataMark; return; @@ -601,12 +645,13 @@ void Metadata::UnlockWaterMark() const waterMarkMutex_.unlock(); } -int Metadata::GetWaterMarkInfoFromDB(const std::string &dev, bool isNeedHash, WatermarkInfo &info) +int Metadata::GetWaterMarkInfoFromDB(const std::string &dev, const std::string &userId, bool isNeedHash, + WatermarkInfo &info) { // read from db avoid watermark update in diff process std::lock_guard lockGuard(metadataLock_); MetaDataValue metadata; - int errCode = GetMetaDataValue(dev, metadata, isNeedHash); + int errCode = GetMetaDataValue(dev, userId, metadata, isNeedHash); if (errCode == -E_NOT_FOUND) { LOGD("[Metadata] not found meta value"); return E_OK; @@ -707,41 +752,41 @@ void Metadata::ClearMetaDataValue(uint32_t innerClearAction, MetaDataValue &meta } } -int Metadata::SetAbilitySyncFinishMark(const std::string &deviceId, bool finish) +int Metadata::SetAbilitySyncFinishMark(const std::string &deviceId, const std::string &userId, bool finish) { - return SetSyncMark(deviceId, SyncMark::SYNC_MARK_ABILITY_SYNC, finish); + return SetSyncMark(deviceId, userId, SyncMark::SYNC_MARK_ABILITY_SYNC, finish); } -bool Metadata::IsAbilitySyncFinish(const std::string &deviceId) +bool Metadata::IsAbilitySyncFinish(const std::string &deviceId, const std::string &userId) { - return IsContainSyncMark(deviceId, SyncMark::SYNC_MARK_ABILITY_SYNC); + return IsContainSyncMark(deviceId, userId, SyncMark::SYNC_MARK_ABILITY_SYNC); } -int Metadata::SetTimeSyncFinishMark(const std::string &deviceId, bool finish) +int Metadata::SetTimeSyncFinishMark(const std::string &deviceId, const std::string &userId, bool finish) { - return SetSyncMark(deviceId, SyncMark::SYNC_MARK_TIME_SYNC, finish); + return SetSyncMark(deviceId, userId, SyncMark::SYNC_MARK_TIME_SYNC, finish); } -int Metadata::SetTimeChangeMark(const std::string &deviceId, bool change) +int Metadata::SetTimeChangeMark(const std::string &deviceId, const std::string &userId, bool change) { - return SetSyncMark(deviceId, SyncMark::SYNC_MARK_TIME_CHANGE, change); + return SetSyncMark(deviceId, userId, SyncMark::SYNC_MARK_TIME_CHANGE, change); } -bool Metadata::IsTimeSyncFinish(const std::string &deviceId) +bool Metadata::IsTimeSyncFinish(const std::string &deviceId, const std::string &userId) { - return IsContainSyncMark(deviceId, SyncMark::SYNC_MARK_TIME_SYNC); + return IsContainSyncMark(deviceId, userId, SyncMark::SYNC_MARK_TIME_SYNC); } -bool Metadata::IsTimeChange(const std::string &deviceId) +bool Metadata::IsTimeChange(const std::string &deviceId, const std::string &userId) { - return IsContainSyncMark(deviceId, SyncMark::SYNC_MARK_TIME_CHANGE); + return IsContainSyncMark(deviceId, userId, SyncMark::SYNC_MARK_TIME_CHANGE); } -int Metadata::SetSyncMark(const std::string &deviceId, SyncMark syncMark, bool finish) +int Metadata::SetSyncMark(const std::string &deviceId, const std::string &userId, SyncMark syncMark, bool finish) { MetaDataValue metadata; std::lock_guard lockGuard(metadataLock_); - GetMetaDataValue(deviceId, metadata, true); + GetMetaDataValue(deviceId, userId, metadata, true); auto mark = static_cast(syncMark); if (finish) { metadata.syncMark |= mark; @@ -750,56 +795,56 @@ int Metadata::SetSyncMark(const std::string &deviceId, SyncMark syncMark, bool f } LOGD("[Metadata] Mark:%" PRIx64 " sync finish:%d sync mark:%" PRIu64, mark, static_cast(finish), metadata.syncMark); - return SaveMetaDataValue(deviceId, metadata); + return SaveMetaDataValue(deviceId, userId, metadata); } -bool Metadata::IsContainSyncMark(const std::string &deviceId, SyncMark syncMark) +bool Metadata::IsContainSyncMark(const std::string &deviceId, const std::string &userId, SyncMark syncMark) { MetaDataValue metadata; std::lock_guard lockGuard(metadataLock_); - GetMetaDataValue(deviceId, metadata, true); + GetMetaDataValue(deviceId, userId, metadata, true); auto mark = static_cast(syncMark); return (metadata.syncMark & mark) == mark; } -int Metadata::SetRemoteSchemaVersion(const std::string &deviceId, uint64_t schemaVersion) +int Metadata::SetRemoteSchemaVersion(const std::string &deviceId, const std::string &userId, uint64_t schemaVersion) { MetaDataValue metadata; std::lock_guard lockGuard(metadataLock_); - GetMetaDataValue(deviceId, metadata, true); + GetMetaDataValue(deviceId, userId, metadata, true); metadata.remoteSchemaVersion = schemaVersion; LOGI("[Metadata] Set %.3s schema version %" PRIu64, deviceId.c_str(), schemaVersion); - int errCode = SaveMetaDataValue(deviceId, metadata); + int errCode = SaveMetaDataValue(deviceId, userId, metadata); if (errCode != E_OK) { LOGW("[Metadata] Set remote schema version failed"); } return errCode; } -uint64_t Metadata::GetRemoteSchemaVersion(const std::string &deviceId) +uint64_t Metadata::GetRemoteSchemaVersion(const std::string &deviceId, const std::string &userId) { MetaDataValue metadata; std::lock_guard lockGuard(metadataLock_); - GetMetaDataValue(deviceId, metadata, true); + GetMetaDataValue(deviceId, userId, metadata, true); LOGI("[Metadata] Get %.3s schema version %" PRIu64, deviceId.c_str(), metadata.remoteSchemaVersion); return metadata.remoteSchemaVersion; } -int Metadata::SetSystemTimeOffset(const std::string &deviceId, int64_t systemTimeOffset) +int Metadata::SetSystemTimeOffset(const std::string &deviceId, const std::string &userId, int64_t systemTimeOffset) { MetaDataValue metadata; std::lock_guard lockGuard(metadataLock_); - GetMetaDataValue(deviceId, metadata, true); + GetMetaDataValue(deviceId, userId, metadata, true); metadata.systemTimeOffset = systemTimeOffset; LOGI("[Metadata] Set %.3s systemTimeOffset %" PRId64, deviceId.c_str(), systemTimeOffset); - return SaveMetaDataValue(deviceId, metadata); + return SaveMetaDataValue(deviceId, userId, metadata); } -int64_t Metadata::GetSystemTimeOffset(const std::string &deviceId) +int64_t Metadata::GetSystemTimeOffset(const std::string &deviceId, const std::string &userId) { MetaDataValue metadata; std::lock_guard lockGuard(metadataLock_); - GetMetaDataValue(deviceId, metadata, true); + GetMetaDataValue(deviceId, userId, metadata, true); LOGI("[Metadata] Get %.3s systemTimeOffset %" PRId64, deviceId.c_str(), metadata.systemTimeOffset); return metadata.systemTimeOffset; } @@ -939,11 +984,12 @@ int Metadata::InitLocalMetaData() return errCode; } -int Metadata::GetMetaDataValueFromDB(const std::string &deviceId, bool isNeedHash, MetaDataValue &metaDataValue) +int Metadata::GetMetaDataValueFromDB(const std::string &deviceId, const std::string &userId, bool isNeedHash, + MetaDataValue &metaDataValue) { DeviceID hashDeviceId; Key devKey; - GetHashDeviceId(deviceId, hashDeviceId, isNeedHash); + GetHashDeviceId(deviceId, userId, hashDeviceId, isNeedHash); DBCommon::StringToVector(hashDeviceId, devKey); return GetMetaDataValueFromDB(devKey, metaDataValue); @@ -960,21 +1006,52 @@ int Metadata::GetMetaDataValueFromDB(const Key &key, MetaDataValue &metaDataValu return DeSerializeMetaData(value, metaDataValue); } -uint64_t Metadata::GetRemoteSoftwareVersion(const std::string &deviceId) +int Metadata::GetMetaDataFromDBByPrefixKey(const std::string &deviceId, bool isNeedHash, + std::map &metaData) +{ + DeviceID hashId; + Key keyPrefix; + GetHashDeviceId(deviceId, "", hashId, isNeedHash); + DBCommon::StringToVector(hashId, keyPrefix); + + std::map data; + int errCode = GetMetadataFromDbByPrefixKey(keyPrefix, data); + if (errCode != E_OK) { + if (errCode == -E_NOT_FOUND) { + MetaDataValue oneMetaData; + metaData[keyPrefix] = oneMetaData; + return E_OK; + } + LOGE("[Metadata] Get metadata from db by prefix key failed %d", errCode); + return errCode; + } + for (const auto &oneData : data) { + MetaDataValue metaDataValue; + errCode = DeSerializeMetaData(oneData.second, metaDataValue); + if (errCode != E_OK) { + LOGE("[Metadata] DeSerialize meta data failed %d", errCode); + return errCode; + } + metaData[oneData.first] = metaDataValue; + } + return E_OK; +} + +uint64_t Metadata::GetRemoteSoftwareVersion(const std::string &deviceId, const std::string &userId) { MetaDataValue metadata; std::lock_guard lockGuard(metadataLock_); - GetMetaDataValue(deviceId, metadata, true); + GetMetaDataValue(deviceId, userId, metadata, true); return metadata.remoteSoftwareVersion; } -int Metadata::SetRemoteSoftwareVersion(const std::string &deviceId, uint64_t version) +int Metadata::SetRemoteSoftwareVersion(const std::string &deviceId, const std::string &userId, uint64_t version) { MetaDataValue metadata; std::lock_guard lockGuard(metadataLock_); - GetMetaDataValue(deviceId, metadata, true); + GetMetaDataValue(deviceId, userId, metadata, true); metadata.remoteSoftwareVersion = version; LOGI("[Metadata] Set %.3s version %" PRId64, deviceId.c_str(), version); - return SaveMetaDataValue(deviceId, metadata); + return SaveMetaDataValue(deviceId, userId, metadata); } } // namespace DistributedDB \ No newline at end of file diff --git a/frameworks/libs/distributeddb/syncer/src/device/meta_data.h b/frameworks/libs/distributeddb/syncer/src/device/meta_data.h index 4df789a01199af3004e6152f069ee368705bd8a0..038747e68a2231a67c46c0e89199b9e8db71c68a 100644 --- a/frameworks/libs/distributeddb/syncer/src/device/meta_data.h +++ b/frameworks/libs/distributeddb/syncer/src/device/meta_data.h @@ -67,17 +67,17 @@ public: int Initialize(ISyncInterface *storage); - int SaveTimeOffset(const DeviceID &deviceId, TimeOffset inValue); + int SaveTimeOffset(const DeviceID &deviceId, const DeviceID &userId, TimeOffset inValue); - void GetTimeOffset(const DeviceID &deviceId, TimeOffset &outValue); + void GetTimeOffset(const DeviceID &deviceId, const DeviceID &userId, TimeOffset &outValue); - virtual void GetLocalWaterMark(const DeviceID &deviceId, uint64_t &outValue); + virtual void GetLocalWaterMark(const DeviceID &deviceId, const DeviceID &userId, uint64_t &outValue); - int SaveLocalWaterMark(const DeviceID &deviceId, uint64_t inValue); + int SaveLocalWaterMark(const DeviceID &deviceId, const DeviceID &userId, uint64_t inValue); - void GetPeerWaterMark(const DeviceID &deviceId, uint64_t &outValue, bool isNeedHash = true); + void GetPeerWaterMark(const DeviceID &deviceId, const DeviceID &userId, uint64_t &outValue, bool isNeedHash = true); - int SavePeerWaterMark(const DeviceID &deviceId, uint64_t inValue, bool isNeedHash); + int SavePeerWaterMark(const DeviceID &deviceId, const DeviceID &userId, uint64_t inValue, bool isNeedHash); int SaveLocalTimeOffset(TimeOffset timeOffset, bool saveIntoDb = true); @@ -85,52 +85,56 @@ public: int EraseDeviceWaterMark(const std::string &deviceId, bool isNeedHash); - int EraseDeviceWaterMark(const std::string &deviceId, bool isNeedHash, const std::string &tableName); + int EraseDeviceWaterMark(const std::string &deviceId, const std::string &userId, bool isNeedHash, + const std::string &tableName); void SetLastLocalTime(Timestamp lastLocalTime); Timestamp GetLastLocalTime() const; int SetSendQueryWaterMark(const std::string &queryIdentify, - const std::string &deviceId, const WaterMark &waterMark); + const std::string &deviceId, const std::string &userId, const WaterMark &waterMark); // the querySync's sendWatermark will increase by the device watermark // if the sendWatermark less than device watermark int GetSendQueryWaterMark(const std::string &queryIdentify, - const std::string &deviceId, WaterMark &waterMark, bool isAutoLift = true); + const std::string &deviceId, const std::string &userId, WaterMark &waterMark, bool isAutoLift = true); int SetRecvQueryWaterMark(const std::string &queryIdentify, - const std::string &deviceId, const WaterMark &waterMark); + const std::string &deviceId, const std::string &userId, const WaterMark &waterMark); // the querySync's recvWatermark will increase by the device watermark // if the watermark less than device watermark int GetRecvQueryWaterMark(const std::string &queryIdentify, - const std::string &deviceId, WaterMark &waterMark); + const std::string &deviceId, const std::string &userId, WaterMark &waterMark); virtual int SetLastQueryTime(const std::string &queryIdentify, const std::string &deviceId, - const Timestamp ×tamp); + const std::string &userId, const Timestamp ×tamp); - virtual int GetLastQueryTime(const std::string &queryIdentify, const std::string &deviceId, Timestamp ×tamp); + virtual int GetLastQueryTime(const std::string &queryIdentify, const std::string &deviceId, + const std::string &userId, Timestamp ×tamp); - int SetSendDeleteSyncWaterMark(const std::string &deviceId, const WaterMark &waterMark); + int SetSendDeleteSyncWaterMark(const std::string &deviceId, const std::string &userId, const WaterMark &waterMark); // the deleteSync's sendWatermark will increase by the device watermark // if the sendWatermark less than device watermark - int GetSendDeleteSyncWaterMark(const std::string &deviceId, WaterMark &waterMark, bool isAutoLift = true); + int GetSendDeleteSyncWaterMark(const std::string &deviceId, const std::string &userId, WaterMark &waterMark, + bool isAutoLift = true); - int SetRecvDeleteSyncWaterMark(const std::string &deviceId, const WaterMark &waterMark, bool isNeedHash = true); + int SetRecvDeleteSyncWaterMark(const std::string &deviceId, const std::string &userId, const WaterMark &waterMark, + bool isNeedHash = true); // the deleteSync's recvWatermark will increase by the device watermark // if the recvWatermark less than device watermark - int GetRecvDeleteSyncWaterMark(const std::string &deviceId, WaterMark &waterMark); + int GetRecvDeleteSyncWaterMark(const std::string &deviceId, const std::string &userId, WaterMark &waterMark); - void GetDbCreateTime(const DeviceID &deviceId, uint64_t &outValue); + void GetDbCreateTime(const DeviceID &deviceId, const DeviceID &userId, uint64_t &outValue); - int SetDbCreateTime(const DeviceID &deviceId, uint64_t inValue, bool isNeedHash); + int SetDbCreateTime(const DeviceID &deviceId, const DeviceID &userId, uint64_t inValue, bool isNeedHash); - int ResetMetaDataAfterRemoveData(const DeviceID &deviceId); + int ResetMetaDataAfterRemoveData(const DeviceID &deviceId, const DeviceID &userId); - void GetRemoveDataMark(const DeviceID &deviceId, uint64_t &outValue); + void GetRemoveDataMark(const DeviceID &deviceId, const DeviceID &userId, uint64_t &outValue); // always get value from db, value updated from storage trigger uint64_t GetQueryLastTimestamp(const DeviceID &deviceId, const std::string &queryId) const; @@ -145,45 +149,46 @@ public: void UnlockWaterMark() const; - int GetWaterMarkInfoFromDB(const std::string &dev, bool isNeedHash, WatermarkInfo &info); + int GetWaterMarkInfoFromDB(const std::string &dev, const std::string &userId, bool isNeedHash, WatermarkInfo &info); int ClearAllAbilitySyncFinishMark(); - int SetAbilitySyncFinishMark(const std::string &deviceId, bool finish); + int SetAbilitySyncFinishMark(const std::string &deviceId, const std::string &userId, bool finish); - bool IsAbilitySyncFinish(const std::string &deviceId); + bool IsAbilitySyncFinish(const std::string &deviceId, const std::string &userId); int ClearAllTimeSyncFinishMark(); - int SetTimeSyncFinishMark(const std::string &deviceId, bool finish); + int SetTimeSyncFinishMark(const std::string &deviceId, const std::string &userId, bool finish); - int SetTimeChangeMark(const std::string &deviceId, bool change); + int SetTimeChangeMark(const std::string &deviceId, const std::string &userId, bool change); - bool IsTimeSyncFinish(const std::string &deviceId); + bool IsTimeSyncFinish(const std::string &deviceId, const std::string &userId); - bool IsTimeChange(const std::string &deviceId); + bool IsTimeChange(const std::string &deviceId, const std::string &userId); - int SetRemoteSchemaVersion(const std::string &deviceId, uint64_t schemaVersion); + int SetRemoteSchemaVersion(const std::string &deviceId, const std::string &userId, uint64_t schemaVersion); - uint64_t GetRemoteSchemaVersion(const std::string &deviceId); + uint64_t GetRemoteSchemaVersion(const std::string &deviceId, const std::string &userId); - int SetSystemTimeOffset(const std::string &deviceId, int64_t systemTimeOffset); + int SetSystemTimeOffset(const std::string &deviceId, const std::string &userId, int64_t systemTimeOffset); - int64_t GetSystemTimeOffset(const std::string &deviceId); + int64_t GetSystemTimeOffset(const std::string &deviceId, const std::string &userId); std::pair GetLocalSchemaVersion(); int SetLocalSchemaVersion(uint64_t schemaVersion); - uint64_t GetRemoteSoftwareVersion(const std::string &deviceId); + uint64_t GetRemoteSoftwareVersion(const std::string &deviceId, const std::string &userId); - int SetRemoteSoftwareVersion(const std::string &deviceId, uint64_t version); + int SetRemoteSoftwareVersion(const std::string &deviceId, const std::string &userId, uint64_t version); private: - int SaveMetaDataValue(const DeviceID &deviceId, const MetaDataValue &inValue, bool isNeedHash = true); + int SaveMetaDataValue(const DeviceID &deviceId, const DeviceID &userId, const MetaDataValue &inValue, + bool isNeedHash = true); // sync module need hash devices id - int GetMetaDataValue(const DeviceID &deviceId, MetaDataValue &outValue, bool isNeedHash); + int GetMetaDataValue(const DeviceID &deviceId, const DeviceID &userId, MetaDataValue &outValue, bool isNeedHash); static int SerializeMetaData(const MetaDataValue &inValue, std::vector &outValue); @@ -191,6 +196,8 @@ private: int GetMetadataFromDb(const std::vector &key, std::vector &outValue) const; + int GetMetadataFromDbByPrefixKey(const Key &keyPrefix, std::map &data) const; + int SetMetadataToDb(const std::vector &key, const std::vector &inValue); int64_t StringToLong(const std::vector &value) const; @@ -199,14 +206,15 @@ private: int LoadAllMetadata(); - void GetHashDeviceId(const DeviceID &deviceId, DeviceID &hashDeviceId, bool isNeedHash); + void GetHashDeviceId(const DeviceID &deviceId, const DeviceID &userId, DeviceID &hashDeviceId, bool isNeedHash); // reset the waterMark to zero - int ResetRecvQueryWaterMark(const DeviceID &deviceId, const std::string &tableName, bool isNeedHash); + int ResetRecvQueryWaterMark(const DeviceID &deviceId, const DeviceID &userId, const std::string &tableName, + bool isNeedHash); - int SetSyncMark(const std::string &deviceId, SyncMark syncMark, bool finish); + int SetSyncMark(const std::string &deviceId, const std::string &userId, SyncMark syncMark, bool finish); - bool IsContainSyncMark(const std::string &deviceId, SyncMark syncMark); + bool IsContainSyncMark(const std::string &deviceId, const std::string &userId, SyncMark syncMark); int SaveLocalMetaData(const LocalMetaData &localMetaData); @@ -233,9 +241,12 @@ private: int InitLocalMetaData(); - int GetMetaDataValueFromDB(const std::string &deviceId, bool isNeedHash, MetaDataValue &metaDataValue); + int GetMetaDataValueFromDB(const std::string &deviceId, const std::string &userId, bool isNeedHash, + MetaDataValue &metaDataValue); int GetMetaDataValueFromDB(const Key &key, MetaDataValue &metaDataValue); + int GetMetaDataFromDBByPrefixKey(const std::string &deviceId, bool isNeedHash, + std::map &metaData); // store localTimeOffset in ram; if change, should add a lock first, change here and metadata, // then release lock @@ -246,7 +257,7 @@ private: // if changed, it should be locked from save-to-db to change-in-memory.save to db must be first, // if save to db fail, it will not be changed in memory. mutable std::mutex metadataLock_; - std::map deviceIdToHashDeviceIdMap_; + std::map deviceIdToHashDeviceIdMap_; // store localTimeOffset in ram, used to make timestamp increase mutable std::mutex lastLocalTimeLock_; diff --git a/frameworks/libs/distributeddb/syncer/src/device/multiver/multi_ver_sync_state_machine.cpp b/frameworks/libs/distributeddb/syncer/src/device/multiver/multi_ver_sync_state_machine.cpp index 49df30b6eea4f5afff3cc5bd12f7f1b3ae8b5103..e658e17be855e7255fa5f7d298c085926da58669 100644 --- a/frameworks/libs/distributeddb/syncer/src/device/multiver/multi_ver_sync_state_machine.cpp +++ b/frameworks/libs/distributeddb/syncer/src/device/multiver/multi_ver_sync_state_machine.cpp @@ -74,7 +74,8 @@ int MultiVerSyncStateMachine::Initialize(ISyncTaskContext *context, ISyncInterfa multiVerDataSync_ = std::make_unique(); valueSliceSync_ = std::make_unique(); - errCode = timeSync_->Initialize(communicator, metadata, syncInterface, context->GetDeviceId()); + errCode = timeSync_->Initialize(communicator, metadata, syncInterface, context->GetDeviceId(), + context->GetTargetUserId()); if (errCode != E_OK) { LOGE("timeSync_->Initialize failed err %d", errCode); goto ERROR_OUT; diff --git a/frameworks/libs/distributeddb/syncer/src/device/query_sync_water_mark_helper.cpp b/frameworks/libs/distributeddb/syncer/src/device/query_sync_water_mark_helper.cpp index c708137cc914a706b7ac5d7a64df1b9737c766e1..61b961abbf526e5a00c51df5b7d6b28f6b2938ed 100644 --- a/frameworks/libs/distributeddb/syncer/src/device/query_sync_water_mark_helper.cpp +++ b/frameworks/libs/distributeddb/syncer/src/device/query_sync_water_mark_helper.cpp @@ -50,6 +50,14 @@ int QuerySyncWaterMarkHelper::GetMetadataFromDb(const std::vector &key, return storage_->GetMetaData(key, outValue); } +int QuerySyncWaterMarkHelper::GetMetadataByPrefixKeyFromDb(const Key &prefixKey, std::map &data) +{ + if (storage_ == nullptr) { + return -E_INVALID_DB; + } + return storage_->GetMetaDataByPrefixKey(prefixKey, data); +} + int QuerySyncWaterMarkHelper::SetMetadataToDb(const std::vector &key, const std::vector &inValue) { if (storage_ == nullptr) { @@ -105,25 +113,25 @@ int QuerySyncWaterMarkHelper::GetQueryWaterMarkInCacheAndDb(const std::string &c } int QuerySyncWaterMarkHelper::GetQueryWaterMark(const std::string &queryIdentify, const std::string &deviceId, - QueryWaterMark &queryWaterMark) + const std::string &userId, QueryWaterMark &queryWaterMark) { - std::string cacheKey = GetHashQuerySyncDeviceId(deviceId, queryIdentify); + std::string cacheKey = GetHashQuerySyncDeviceId(deviceId, userId, queryIdentify); std::lock_guard autoLock(queryWaterMarkLock_); return GetQueryWaterMarkInCacheAndDb(cacheKey, queryWaterMark); } int QuerySyncWaterMarkHelper::SetRecvQueryWaterMark(const std::string &queryIdentify, - const std::string &deviceId, const WaterMark &waterMark) + const std::string &deviceId, const std::string &userId, const WaterMark &waterMark) { - std::string cacheKey = GetHashQuerySyncDeviceId(deviceId, queryIdentify); + std::string cacheKey = GetHashQuerySyncDeviceId(deviceId, userId, queryIdentify); std::lock_guard autoLock(queryWaterMarkLock_); return SetRecvQueryWaterMarkWithoutLock(cacheKey, waterMark); } int QuerySyncWaterMarkHelper::SetLastQueryTime(const std::string &queryIdentify, - const std::string &deviceId, const Timestamp ×tamp) + const std::string &deviceId, const std::string &userId, const Timestamp ×tamp) { - std::string cacheKey = GetHashQuerySyncDeviceId(deviceId, queryIdentify); + std::string cacheKey = GetHashQuerySyncDeviceId(deviceId, userId, queryIdentify); std::lock_guard autoLock(queryWaterMarkLock_); QueryWaterMark queryWaterMark; int errCode = GetQueryWaterMarkInCacheAndDb(cacheKey, queryWaterMark); @@ -147,9 +155,9 @@ int QuerySyncWaterMarkHelper::SetRecvQueryWaterMarkWithoutLock(const std::string } int QuerySyncWaterMarkHelper::SetSendQueryWaterMark(const std::string &queryIdentify, - const std::string &deviceId, const WaterMark &waterMark) + const std::string &deviceId, const std::string &userId, const WaterMark &waterMark) { - std::string cacheKey = GetHashQuerySyncDeviceId(deviceId, queryIdentify); + std::string cacheKey = GetHashQuerySyncDeviceId(deviceId, userId, queryIdentify); QueryWaterMark queryWaterMark; std::lock_guard autoLock(queryWaterMarkLock_); int errCode = GetQueryWaterMarkInCacheAndDb(cacheKey, queryWaterMark); @@ -265,31 +273,36 @@ uint64_t QuerySyncWaterMarkHelper::CalculateQueryWaterMarkSize(const QueryWaterM return length; } -DeviceID QuerySyncWaterMarkHelper::GetHashQuerySyncDeviceId(const DeviceID &deviceId, const DeviceID &queryId) +DeviceID QuerySyncWaterMarkHelper::GetHashQuerySyncDeviceId(const DeviceID &deviceId, const DeviceID &userId, + const DeviceID &queryId) { std::lock_guard autoLock(queryWaterMarkLock_); DeviceID hashQuerySyncId; - if (deviceIdToHashQuerySyncIdMap_[deviceId].count(queryId) == 0) { + DeviceSyncTarget deviceInfo(deviceId, userId); + if (deviceIdToHashQuerySyncIdMap_[deviceInfo].count(queryId) == 0) { // do not modify this - hashQuerySyncId = DBConstant::QUERY_SYNC_PREFIX_KEY + DBCommon::TransferHashString(deviceId) + queryId; - deviceIdToHashQuerySyncIdMap_[deviceId][queryId] = hashQuerySyncId; + hashQuerySyncId = DBConstant::QUERY_SYNC_PREFIX_KEY + DBCommon::TransferHashString(deviceId) + queryId + + DBConstant::USERID_PREFIX_KEY + userId; + deviceIdToHashQuerySyncIdMap_[deviceInfo][queryId] = hashQuerySyncId; } else { - hashQuerySyncId = deviceIdToHashQuerySyncIdMap_[deviceId][queryId]; + hashQuerySyncId = deviceIdToHashQuerySyncIdMap_[deviceInfo][queryId]; } return hashQuerySyncId; } -int QuerySyncWaterMarkHelper::GetDeleteSyncWaterMark(const std::string &deviceId, DeleteWaterMark &deleteWaterMark) +int QuerySyncWaterMarkHelper::GetDeleteSyncWaterMark(const std::string &deviceId, const std::string &userId, + DeleteWaterMark &deleteWaterMark) { - std::string hashId = GetHashDeleteSyncDeviceId(deviceId); + std::string hashId = GetHashDeleteSyncDeviceId(deviceId, userId); // lock prevent different thread visit deleteSyncCache_ std::lock_guard autoLock(deleteSyncLock_); return GetDeleteWaterMarkFromCache(hashId, deleteWaterMark); } -int QuerySyncWaterMarkHelper::SetSendDeleteSyncWaterMark(const DeviceID &deviceId, const WaterMark &waterMark) +int QuerySyncWaterMarkHelper::SetSendDeleteSyncWaterMark(const DeviceID &deviceId, const std::string &userId, + const WaterMark &waterMark) { - std::string hashId = GetHashDeleteSyncDeviceId(deviceId); + std::string hashId = GetHashDeleteSyncDeviceId(deviceId, userId); DeleteWaterMark deleteWaterMark; // lock prevent different thread visit deleteSyncCache_ std::lock_guard autoLock(deleteSyncLock_); @@ -301,19 +314,35 @@ int QuerySyncWaterMarkHelper::SetSendDeleteSyncWaterMark(const DeviceID &deviceI return UpdateDeleteSyncCacheAndSave(hashId, deleteWaterMark); } -int QuerySyncWaterMarkHelper::SetRecvDeleteSyncWaterMark(const DeviceID &deviceId, const WaterMark &waterMark, - bool isNeedHash) +int QuerySyncWaterMarkHelper::SetRecvDeleteSyncWaterMark(const DeviceID &deviceId, const std::string &userId, + const WaterMark &waterMark, bool isNeedHash) { - std::string hashId = GetHashDeleteSyncDeviceId(deviceId, isNeedHash); - DeleteWaterMark deleteWaterMark; + std::string hashId = GetHashDeleteSyncDeviceId(deviceId, userId, isNeedHash); // lock prevent different thread visit deleteSyncCache_ std::lock_guard autoLock(deleteSyncLock_); - int errCode = GetDeleteWaterMarkFromCache(hashId, deleteWaterMark); + int errCode = E_OK; + std::map deleteWaterMarks; + if (!userId.empty()) { + DeleteWaterMark deleteWaterMark; + Key dbKey; + DBCommon::StringToVector(hashId, dbKey); + errCode = GetDeleteWaterMarkFromCache(hashId, deleteWaterMark); + deleteWaterMark.recvWaterMark = waterMark; + deleteWaterMarks[dbKey] = deleteWaterMark; + } else { + errCode = GetDeleteWatersMarkFromDB(hashId, deleteWaterMarks); + } if (errCode != E_OK) { return errCode; } - deleteWaterMark.recvWaterMark = waterMark; - return UpdateDeleteSyncCacheAndSave(hashId, deleteWaterMark); + for (auto &deleteWaterMark : deleteWaterMarks) { + deleteWaterMark.second.recvWaterMark = waterMark; + errCode = UpdateDeleteSyncCacheAndSave(hashId, deleteWaterMark.second); + if (errCode != E_OK) { + return errCode; + } + } + return E_OK; } int QuerySyncWaterMarkHelper::UpdateDeleteSyncCacheAndSave(const std::string &dbKey, @@ -354,6 +383,34 @@ int QuerySyncWaterMarkHelper::GetDeleteWaterMarkFromDB(const DeviceID &hashDevic return DeSerializeDeleteWaterMark(dbValue, deleteWaterMark); } +int QuerySyncWaterMarkHelper::GetDeleteWatersMarkFromDB(const DeviceID &hashId, + std::map &deleteWaterMarks) +{ + Key dbKeyPrefix; + DBCommon::StringToVector(hashId, dbKeyPrefix); + // search in db + std::map dbData; + int errCode = GetMetadataByPrefixKeyFromDb(dbKeyPrefix, dbData); + if (errCode == -E_NOT_FOUND) { + DeleteWaterMark deleteWaterMark; + deleteWaterMarks[dbKeyPrefix] = deleteWaterMark; + return E_OK; + } + if (errCode != E_OK) { + return errCode; + } + // serialize value + for (const auto &oneDbData : dbData) { + DeleteWaterMark deleteWaterMark; + errCode = DeSerializeDeleteWaterMark(oneDbData.second, deleteWaterMark); + if (errCode != E_OK) { + return errCode; + } + deleteWaterMarks[oneDbData.first] = deleteWaterMark; + } + return E_OK; +} + int QuerySyncWaterMarkHelper::SaveDeleteWaterMarkToDB(const DeviceID &hashDeviceId, const DeleteWaterMark &deleteWaterMark) { @@ -373,16 +430,18 @@ int QuerySyncWaterMarkHelper::SaveDeleteWaterMarkToDB(const DeviceID &hashDevice return errCode; } -DeviceID QuerySyncWaterMarkHelper::GetHashDeleteSyncDeviceId(const DeviceID &deviceId, bool isNeedHash) +DeviceID QuerySyncWaterMarkHelper::GetHashDeleteSyncDeviceId(const DeviceID &deviceId, const DeviceID &userId, + bool isNeedHash) { DeviceID hashDeleteSyncId; + DeviceSyncTarget deviceInfo(deviceId, userId); std::lock_guard autoLock(deleteSyncLock_); - if (deviceIdToHashDeleteSyncIdMap_.count(deviceId) == 0) { + if (deviceIdToHashDeleteSyncIdMap_.count(deviceInfo) == 0) { hashDeleteSyncId = DBConstant::DELETE_SYNC_PREFIX_KEY + - (isNeedHash ? DBCommon::TransferHashString(deviceId) : deviceId); - deviceIdToHashDeleteSyncIdMap_.insert(std::pair(deviceId, hashDeleteSyncId)); + (isNeedHash ? DBCommon::TransferHashString(deviceId) : deviceId) + DBConstant::USERID_PREFIX_KEY + userId; + deviceIdToHashDeleteSyncIdMap_.insert(std::pair(deviceInfo, hashDeleteSyncId)); } else { - hashDeleteSyncId = deviceIdToHashDeleteSyncIdMap_[deviceId]; + hashDeleteSyncId = deviceIdToHashDeleteSyncIdMap_[deviceInfo]; } return hashDeleteSyncId; } @@ -484,8 +543,8 @@ int QuerySyncWaterMarkHelper::RemoveLeastUsedQuerySyncItems(const std::vector autoLock(queryWaterMarkLock_); @@ -496,6 +555,9 @@ int QuerySyncWaterMarkHelper::ResetRecvQueryWaterMark(const DeviceID &deviceId, std::string hexTableName = DBCommon::TransferStringToHex(hashTableName); prefixKeyStr += hexTableName; } + if (!userId.empty()) { + prefixKeyStr += DBConstant::USERID_PREFIX_KEY + userId; + } // remove in db Key prefixKey; diff --git a/frameworks/libs/distributeddb/syncer/src/device/query_sync_water_mark_helper.h b/frameworks/libs/distributeddb/syncer/src/device/query_sync_water_mark_helper.h index 6c576a2b91d81ec192b6ea0f83bd4211131b3346..1e96e746f7f3e5eca270167678977413c558b8ea 100644 --- a/frameworks/libs/distributeddb/syncer/src/device/query_sync_water_mark_helper.h +++ b/frameworks/libs/distributeddb/syncer/src/device/query_sync_water_mark_helper.h @@ -50,23 +50,25 @@ public: int Initialize(ISyncInterface *storage); - int GetQueryWaterMark(const std::string &queryIdentify, const std::string &deviceId, + int GetQueryWaterMark(const std::string &queryIdentify, const std::string &deviceId, const std::string &userId, QueryWaterMark &queryWaterMark); int SetSendQueryWaterMark(const std::string &queryIdentify, - const std::string &deviceId, const WaterMark &waterMark); + const std::string &deviceId, const std::string &userId, const WaterMark &waterMark); int SetRecvQueryWaterMark(const std::string &queryIdentify, - const std::string &deviceId, const WaterMark &waterMark); + const std::string &deviceId, const std::string &userId, const WaterMark &waterMark); int SetLastQueryTime(const std::string &queryIdentify, - const std::string &deviceId, const Timestamp ×tamp); + const std::string &deviceId, const std::string &userId, const Timestamp ×tamp); - int GetDeleteSyncWaterMark(const std::string &deviceId, DeleteWaterMark &deleteWaterMark); + int GetDeleteSyncWaterMark(const std::string &deviceId, const std::string &userId, + DeleteWaterMark &deleteWaterMark); - int SetSendDeleteSyncWaterMark(const std::string &deviceId, const WaterMark &waterMark); + int SetSendDeleteSyncWaterMark(const std::string &deviceId, const std::string &userId, const WaterMark &waterMark); - int SetRecvDeleteSyncWaterMark(const std::string &deviceId, const WaterMark &waterMark, bool isNeedHash); + int SetRecvDeleteSyncWaterMark(const std::string &deviceId, const std::string &userId, const WaterMark &waterMark, + bool isNeedHash); // this function will read deleteWaterMark from db by it's deleteWaterMarkKey // and then serialize it and put to cache @@ -76,7 +78,8 @@ public: int RemoveLeastUsedQuerySyncItems(const std::vector &querySyncIds); // reset the waterMark to zero - int ResetRecvQueryWaterMark(const DeviceID &deviceId, const std::string &tableName, bool isNeedHash); + int ResetRecvQueryWaterMark(const DeviceID &deviceId, const DeviceID &userId, const std::string &tableName, + bool isNeedHash); static std::string GetQuerySyncPrefixKey(); @@ -86,6 +89,8 @@ private: int GetMetadataFromDb(const std::vector &key, std::vector &outValue); + int GetMetadataByPrefixKeyFromDb(const Key &prefixKey, std::map &data); + int SetMetadataToDb(const std::vector &key, const std::vector &inValue); int DeleteMetaDataFromDB(const std::vector &keys) const; @@ -107,7 +112,7 @@ private: // get the querySync hashId in cache_ or generate one and then put it in to cache_ // the hashId is made up of "QUERY_SYNC_PREFIX_KEY" + hash(deviceId) + queryId - DeviceID GetHashQuerySyncDeviceId(const DeviceID &deviceId, const DeviceID &queryId); + DeviceID GetHashQuerySyncDeviceId(const DeviceID &deviceId, const DeviceID &userId, const DeviceID &queryId); // put queryWaterMark to lru cache_ and then save to db int UpdateCacheAndSave(const std::string &cacheKey, QueryWaterMark &queryWaterMark); @@ -118,12 +123,14 @@ private: // get the deleteSync hashId in cache_ or generate one and then put it in to cache_ // the hashId is made up of "DELETE_SYNC_PREFIX_KEY" + hash(deviceId) - DeviceID GetHashDeleteSyncDeviceId(const DeviceID &deviceId, bool isNeedHash = true); + DeviceID GetHashDeleteSyncDeviceId(const DeviceID &deviceId, const DeviceID &userId, bool isNeedHash = true); int SaveDeleteWaterMarkToDB(const DeviceID &hashDeviceId, const DeleteWaterMark &deleteWaterMark); int GetDeleteWaterMarkFromDB(const DeviceID &hashDeviceId, DeleteWaterMark &deleteWaterMark); + int GetDeleteWatersMarkFromDB(const DeviceID &hashId, std::map &deleteWaterMarks); + // put queryWaterMark to lru cache_ and then save to db int UpdateDeleteSyncCacheAndSave(const std::string &dbKey, const DeleteWaterMark &deleteWaterMark); @@ -143,11 +150,11 @@ private: // because it will change the eliminationChain // and the queryWaterMark use a LRU Map to store in ram std::mutex queryWaterMarkLock_; - std::map> deviceIdToHashQuerySyncIdMap_; + std::map> deviceIdToHashQuerySyncIdMap_; // also store deleteKeyWaterMark should add a lock std::mutex deleteSyncLock_; - std::map deviceIdToHashDeleteSyncIdMap_; + std::map deviceIdToHashDeleteSyncIdMap_; ISyncInterface *storage_; }; diff --git a/frameworks/libs/distributeddb/syncer/src/device/singlever/single_ver_data_sync.cpp b/frameworks/libs/distributeddb/syncer/src/device/singlever/single_ver_data_sync.cpp index 84f35ce37e35470336c6d7e2e57f29813a3a5d66..41931efa6b3addfbce4edd38c2aa9f7e4f4d358d 100644 --- a/frameworks/libs/distributeddb/syncer/src/device/singlever/single_ver_data_sync.cpp +++ b/frameworks/libs/distributeddb/syncer/src/device/singlever/single_ver_data_sync.cpp @@ -181,9 +181,11 @@ int SingleVerDataSync::TryContinueSync(SingleVerSyncTaskContext *context, const } if (context->IsQuerySync() && storage_->GetInterfaceType() == ISyncInterface::SYNC_RELATION) { Timestamp dbLastQueryTime = 0; - int errCode = metadata_->GetLastQueryTime(context->GetQuerySyncId(), context->GetDeviceId(), dbLastQueryTime); + int errCode = metadata_->GetLastQueryTime(context->GetQuerySyncId(), context->GetDeviceId(), + context->GetTargetUserId(), dbLastQueryTime); if (errCode == E_OK && dbLastQueryTime < lastQueryTime) { - errCode = metadata_->SetLastQueryTime(context->GetQuerySyncId(), context->GetDeviceId(), lastQueryTime); + errCode = metadata_->SetLastQueryTime(context->GetQuerySyncId(), context->GetDeviceId(), + context->GetTargetUserId(), lastQueryTime); } if (errCode != E_OK) { return errCode; @@ -350,7 +352,7 @@ int SingleVerDataSync::GetUnsyncData(SingleVerSyncTaskContext *context, std::vec GetLocalDeleteSyncWaterMark(context, deletedStartMark); Timestamp lastQueryTimestamp = 0; int errCode = metadata_->GetLastQueryTime(context->GetQuerySyncId(), context->GetDeviceId(), - lastQueryTimestamp); + context->GetTargetUserId(), lastQueryTimestamp); if (errCode != E_OK) { return errCode; } @@ -473,7 +475,7 @@ int SingleVerDataSync::SaveLocalWaterMark(SyncType syncType, const SingleVerSync return E_OK; } } - errCode = metadata_->SaveLocalWaterMark(deviceId, dataTimeRange.endTime); + errCode = metadata_->SaveLocalWaterMark(deviceId, context->GetTargetUserId(), dataTimeRange.endTime); } else { bool isNeedUpdateMark = true; bool isNeedUpdateDeleteMark = true; @@ -490,7 +492,8 @@ int SingleVerDataSync::SaveLocalWaterMark(SyncType syncType, const SingleVerSync } if (isNeedUpdateMark) { LOGD("label=%s,dev=%s,endTime=%" PRIu64, label_.c_str(), STR_MASK(GetDeviceId()), dataTimeRange.endTime); - errCode = metadata_->SetSendQueryWaterMark(queryId, deviceId, dataTimeRange.endTime); + errCode = metadata_->SetSendQueryWaterMark(queryId, deviceId, context->GetTargetUserId(), + dataTimeRange.endTime); if (errCode != E_OK) { LOGE("[DataSync][SaveLocalWaterMark] save query metadata watermark failed,errCode=%d", errCode); return errCode; @@ -499,7 +502,8 @@ int SingleVerDataSync::SaveLocalWaterMark(SyncType syncType, const SingleVerSync if (isNeedUpdateDeleteMark) { LOGD("label=%s,dev=%s,deleteEndTime=%" PRIu64, label_.c_str(), STR_MASK(GetDeviceId()), dataTimeRange.deleteEndTime); - errCode = metadata_->SetSendDeleteSyncWaterMark(context->GetDeleteSyncId(), dataTimeRange.deleteEndTime); + errCode = metadata_->SetSendDeleteSyncWaterMark(context->GetDeleteSyncId(), context->GetTargetUserId(), + dataTimeRange.deleteEndTime); } } if (errCode != E_OK) { @@ -509,34 +513,36 @@ int SingleVerDataSync::SaveLocalWaterMark(SyncType syncType, const SingleVerSync } void SingleVerDataSync::GetPeerWaterMark(SyncType syncType, const std::string &queryIdentify, - const DeviceID &deviceId, WaterMark &waterMark) const + const DeviceID &deviceId, const DeviceID &userId, WaterMark &waterMark) const { if (syncType != SyncType::QUERY_SYNC_TYPE) { - metadata_->GetPeerWaterMark(deviceId, waterMark); + metadata_->GetPeerWaterMark(deviceId, userId, waterMark); return; } - metadata_->GetRecvQueryWaterMark(queryIdentify, deviceId, waterMark); + metadata_->GetRecvQueryWaterMark(queryIdentify, deviceId, userId, waterMark); } -void SingleVerDataSync::GetPeerDeleteSyncWaterMark(const DeviceID &deviceId, WaterMark &waterMark) +void SingleVerDataSync::GetPeerDeleteSyncWaterMark(const DeviceID &deviceId, const DeviceID &userId, + WaterMark &waterMark) { - metadata_->GetRecvDeleteSyncWaterMark(deviceId, waterMark); + metadata_->GetRecvDeleteSyncWaterMark(deviceId, userId, waterMark); } void SingleVerDataSync::GetLocalDeleteSyncWaterMark(const SingleVerSyncTaskContext *context, WaterMark &waterMark) const { - metadata_->GetSendDeleteSyncWaterMark(context->GetDeleteSyncId(), waterMark, context->IsAutoLiftWaterMark()); + metadata_->GetSendDeleteSyncWaterMark(context->GetDeleteSyncId(), context->GetTargetUserId(), waterMark, + context->IsAutoLiftWaterMark()); } void SingleVerDataSync::GetLocalWaterMark(SyncType syncType, const std::string &queryIdentify, const SingleVerSyncTaskContext *context, WaterMark &waterMark) const { if (syncType != SyncType::QUERY_SYNC_TYPE) { - metadata_->GetLocalWaterMark(context->GetDeviceId(), waterMark); + metadata_->GetLocalWaterMark(context->GetDeviceId(), context->GetTargetUserId(), waterMark); return; } - metadata_->GetSendQueryWaterMark(queryIdentify, context->GetDeviceId(), + metadata_->GetSendQueryWaterMark(queryIdentify, context->GetDeviceId(), context->GetTargetUserId(), waterMark, context->IsAutoLiftWaterMark()); } @@ -547,7 +553,7 @@ int SingleVerDataSync::RemoveDeviceDataHandle(SingleVerSyncTaskContext *context, std::lock_guard autoLock(removeDeviceDataLock_); if (context->GetRemoteSoftwareVersion() > SOFTWARE_VERSION_RELEASE_3_0) { uint64_t clearDeviceDataMark = 0; - metadata_->GetRemoveDataMark(context->GetDeviceId(), clearDeviceDataMark); + metadata_->GetRemoveDataMark(context->GetDeviceId(), context->GetTargetUserId(), clearDeviceDataMark); isNeedClearRemoteData = (clearDeviceDataMark == REMOVE_DEVICE_DATA_MARK); } else { const DataRequestPacket *packet = message->GetObject(); @@ -558,7 +564,8 @@ int SingleVerDataSync::RemoveDeviceDataHandle(SingleVerSyncTaskContext *context, SyncType curType = SyncOperation::GetSyncType(packet->GetMode()); WaterMark packetLocalMark = packet->GetLocalWaterMark(); WaterMark peerMark = 0; - GetPeerWaterMark(curType, context->GetQuerySyncId(), context->GetDeviceId(), peerMark); + GetPeerWaterMark(curType, context->GetQuerySyncId(), context->GetDeviceId(), context->GetTargetUserId(), + peerMark); isNeedClearRemoteData = ((packetLocalMark == 0) && (peerMark != 0)); } if (!isNeedClearRemoteData) { @@ -574,11 +581,11 @@ int SingleVerDataSync::RemoveDeviceDataHandle(SingleVerSyncTaskContext *context, } if (context->GetRemoteSoftwareVersion() == SOFTWARE_VERSION_EARLIEST) { // avoid repeat clear in ack - metadata_->SaveLocalWaterMark(context->GetDeviceId(), 0); + metadata_->SaveLocalWaterMark(context->GetDeviceId(), context->GetTargetUserId(), 0); } } if (context->GetRemoteSoftwareVersion() > SOFTWARE_VERSION_RELEASE_3_0) { - errCode = metadata_->ResetMetaDataAfterRemoveData(context->GetDeviceId()); + errCode = metadata_->ResetMetaDataAfterRemoveData(context->GetDeviceId(), context->GetTargetUserId()); if (errCode != E_OK) { (void)SendDataAck(context, message, errCode, maxSendDataTime); return errCode; @@ -595,7 +602,7 @@ int SingleVerDataSync::DealRemoveDeviceDataByAck(SingleVerSyncTaskContext *conte SyncType curType = (context->IsQuerySync()) ? SyncType::QUERY_SYNC_TYPE : SyncType::MANUAL_FULL_SYNC_TYPE; if (context->GetRemoteSoftwareVersion() > SOFTWARE_VERSION_RELEASE_3_0) { uint64_t clearDeviceDataMark = 0; - metadata_->GetRemoveDataMark(context->GetDeviceId(), clearDeviceDataMark); + metadata_->GetRemoveDataMark(context->GetDeviceId(), context->GetTargetUserId(), clearDeviceDataMark); isNeedClearRemoteData = (clearDeviceDataMark != 0); } else if (reserved.empty()) { WaterMark localMark = 0; @@ -604,7 +611,7 @@ int SingleVerDataSync::DealRemoveDeviceDataByAck(SingleVerSyncTaskContext *conte } else { WaterMark peerMark = 0; GetPeerWaterMark(curType, context->GetQuerySyncId(), - context->GetDeviceId(), peerMark); + context->GetDeviceId(), context->GetTargetUserId(), peerMark); isNeedClearRemoteData = ((reserved[ACK_PACKET_RESERVED_INDEX_LOCAL_WATER_MARK] == 0) && (peerMark != 0)); } if (!isNeedClearRemoteData) { @@ -618,7 +625,7 @@ int SingleVerDataSync::DealRemoveDeviceDataByAck(SingleVerSyncTaskContext *conte return errCode; } if (context->GetRemoteSoftwareVersion() > SOFTWARE_VERSION_RELEASE_3_0) { - errCode = metadata_->ResetMetaDataAfterRemoveData(context->GetDeviceId()); + errCode = metadata_->ResetMetaDataAfterRemoveData(context->GetDeviceId(), context->GetTargetUserId()); } return errCode; } @@ -669,7 +676,7 @@ void SingleVerDataSync::FillDataRequestPacket(DataRequestPacket *packet, SingleV (void)storage_->GetCompressionOption(needCompressOnSync, compressionRate); std::string id = context->GetQuerySyncId(); GetLocalWaterMark(curType, id, context, localMark); - GetPeerWaterMark(curType, id, context->GetDeviceId(), peerMark); + GetPeerWaterMark(curType, id, context->GetDeviceId(), context->GetTargetUserId(), peerMark); GetLocalDeleteSyncWaterMark(context, deleteMark); if (((mode != SyncModeType::RESPONSE_PULL && sendCode == E_OK)) || (mode == SyncModeType::RESPONSE_PULL && sendCode == SEND_FINISHED)) { @@ -802,7 +809,7 @@ int SingleVerDataSync::PullRequestStart(SingleVerSyncTaskContext *context) WaterMark localMark = 0; WaterMark deleteMark = 0; GetPeerWaterMark(syncType, context->GetQuerySyncId(), - context->GetDeviceId(), peerMark); + context->GetDeviceId(), context->GetTargetUserId(), peerMark); GetLocalWaterMark(syncType, context->GetQuerySyncId(), context, localMark); GetLocalDeleteSyncWaterMark(context, deleteMark); uint32_t version = std::min(context->GetRemoteSoftwareVersion(), SOFTWARE_VERSION_CURRENT); @@ -892,11 +899,12 @@ void SingleVerDataSync::UpdatePeerWaterMark(SyncType syncType, const std::string } int errCode = E_OK; if (syncType != SyncType::QUERY_SYNC_TYPE) { - errCode = metadata_->SavePeerWaterMark(context->GetDeviceId(), peerWatermark, true); + errCode = metadata_->SavePeerWaterMark(context->GetDeviceId(), context->GetTargetUserId(), peerWatermark, true); } else { if (peerWatermark != 0) { LOGD("label=%s,dev=%s,endTime=%" PRIu64, label_.c_str(), STR_MASK(GetDeviceId()), peerWatermark); - errCode = metadata_->SetRecvQueryWaterMark(queryId, context->GetDeviceId(), peerWatermark); + errCode = metadata_->SetRecvQueryWaterMark(queryId, context->GetDeviceId(), context->GetTargetUserId(), + peerWatermark); if (errCode != E_OK) { LOGE("[DataSync][UpdatePeerWaterMark] save query peer water mark failed,errCode=%d", errCode); } @@ -904,7 +912,8 @@ void SingleVerDataSync::UpdatePeerWaterMark(SyncType syncType, const std::string if (peerDeletedWatermark != 0) { LOGD("label=%s,dev=%s,peerDeletedTime=%" PRIu64, label_.c_str(), STR_MASK(GetDeviceId()), peerDeletedWatermark); - errCode = metadata_->SetRecvDeleteSyncWaterMark(context->GetDeleteSyncId(), peerDeletedWatermark); + errCode = metadata_->SetRecvDeleteSyncWaterMark(context->GetDeleteSyncId(), context->GetTargetUserId(), + peerDeletedWatermark); } } if (errCode != E_OK) { @@ -1293,7 +1302,7 @@ void SingleVerDataSync::GetPullEndWatermark(const SingleVerSyncTaskContext *cont if ((mode == SyncModeType::PULL) || (mode == SyncModeType::PUSH_AND_PULL)) { WaterMark endMark = packet->GetEndWaterMark(); TimeOffset offset; - metadata_->GetTimeOffset(context->GetDeviceId(), offset); + metadata_->GetTimeOffset(context->GetDeviceId(), context->GetTargetUserId(), offset); pullEndWatermark = endMark - static_cast(offset); LOGD("[DataSync][PullEndWatermark] packetEndMark=%" PRIu64 ",offset=%" PRId64 ",endWaterMark=%" PRIu64 "," "label=%s,dev=%s", endMark, offset, pullEndWatermark, label_.c_str(), STR_MASK(GetDeviceId())); @@ -1542,9 +1551,9 @@ bool SingleVerDataSync::WaterMarkErrHandle(SyncType syncType, SingleVerSyncTaskC WaterMark packetDeletedMark = packet->GetDeletedWaterMark(); WaterMark peerMark = 0; WaterMark deletedMark = 0; - GetPeerWaterMark(syncType, packet->GetQueryId(), context->GetDeviceId(), peerMark); + GetPeerWaterMark(syncType, packet->GetQueryId(), context->GetDeviceId(), context->GetTargetUserId(), peerMark); if (syncType == SyncType::QUERY_SYNC_TYPE) { - GetPeerDeleteSyncWaterMark(context->GetDeleteSyncId(), deletedMark); + GetPeerDeleteSyncWaterMark(context->GetDeleteSyncId(), context->GetTargetUserId(), deletedMark); } if (syncType != SyncType::QUERY_SYNC_TYPE && packetLocalMark > peerMark) { LOGI("[DataSync][DataRequestRecv] packetLocalMark=%" PRIu64 ",current=%" PRIu64, packetLocalMark, peerMark); @@ -1569,7 +1578,7 @@ int SingleVerDataSync::CheckSchemaStrategy(SingleVerSyncTaskContext *context, co if (packet == nullptr) { return -E_INVALID_ARGS; } - if (metadata_->IsAbilitySyncFinish(deviceId_)) { + if (metadata_->IsAbilitySyncFinish(deviceId_, context->GetTargetUserId())) { return E_OK; } auto query = packet->GetQuery(); @@ -1620,7 +1629,7 @@ void SingleVerDataSync::SetAckPacket(DataAckPacket &ackPacket, SingleVerSyncTask ackPacket.SetData(maxSendDataTime + 1); // + 1 to next start } else if (recvCode != WATER_MARK_INVALID) { WaterMark mark = 0; - GetPeerWaterMark(curType, packet->GetQueryId(), context->GetDeviceId(), mark); + GetPeerWaterMark(curType, packet->GetQueryId(), context->GetDeviceId(), context->GetTargetUserId(), mark); if (recvCode == -E_NEED_ABILITY_SYNC && packet->GetLocalWaterMark() < mark) { LOGI("[DataSync][SetAckPacket] packetLocalMark=%" PRIu64 ",lockMark=%" PRIu64, packet->GetLocalWaterMark(), mark); @@ -1642,7 +1651,7 @@ void SingleVerDataSync::SetAckPacket(DataAckPacket &ackPacket, SingleVerSyncTask // while recv is not E_OK, data is peerMark, reserve[2] is deletedPeerMark value if (curType == SyncType::QUERY_SYNC_TYPE && recvCode != WATER_MARK_INVALID) { WaterMark deletedPeerMark; - GetPeerDeleteSyncWaterMark(context->GetDeleteSyncId(), deletedPeerMark); + GetPeerDeleteSyncWaterMark(context->GetDeleteSyncId(), context->GetTargetUserId(), deletedPeerMark); if (recvCode == -E_NEED_ABILITY_SYNC && packet->GetDeletedWaterMark() < deletedPeerMark) { LOGI("[DataSync][SetAckPacket] packetDeletedMark=%" PRIu64 ",deletedMark=%" PRIu64, packet->GetDeletedWaterMark(), deletedPeerMark); @@ -1725,7 +1734,7 @@ int SingleVerDataSync::RemoveDeviceDataIfNeed(SingleVerSyncTaskContext *context) } uint64_t clearRemoteDataMark = 0; std::lock_guard autoLock(removeDeviceDataLock_); - metadata_->GetRemoveDataMark(context->GetDeviceId(), clearRemoteDataMark); + metadata_->GetRemoveDataMark(context->GetDeviceId(), context->GetTargetUserId(), clearRemoteDataMark); if (clearRemoteDataMark == 0) { return E_OK; } @@ -1738,7 +1747,7 @@ int SingleVerDataSync::RemoveDeviceDataIfNeed(SingleVerSyncTaskContext *context) } } if (clearRemoteDataMark == REMOVE_DEVICE_DATA_MARK) { - errCode = metadata_->ResetMetaDataAfterRemoveData(context->GetDeviceId()); + errCode = metadata_->ResetMetaDataAfterRemoveData(context->GetDeviceId(), context->GetTargetUserId()); if (errCode != E_OK) { LOGE("set %s removeDataWaterMark to false failed,errCode=%d", STR_MASK(GetDeviceId()), errCode); return errCode; @@ -1758,7 +1767,7 @@ void SingleVerDataSync::FillRequestReSendPacket(SingleVerSyncTaskContext *contex SingleVerDataSyncUtils::SetDataRequestCommonInfo(*context, *storage_, *packet, metadata_); SyncType curType = (context->IsQuerySync()) ? SyncType::QUERY_SYNC_TYPE : SyncType::MANUAL_FULL_SYNC_TYPE; WaterMark peerMark = 0; - GetPeerWaterMark(curType, context->GetQuerySyncId(), context->GetDeviceId(), + GetPeerWaterMark(curType, context->GetQuerySyncId(), context->GetDeviceId(), context->GetTargetUserId(), peerMark); uint32_t version = std::min(context->GetRemoteSoftwareVersion(), SOFTWARE_VERSION_CURRENT); // transfer reSend mode, RESPONSE_PULL transfer to push or query push diff --git a/frameworks/libs/distributeddb/syncer/src/device/singlever/single_ver_data_sync.h b/frameworks/libs/distributeddb/syncer/src/device/singlever/single_ver_data_sync.h index 1e07eb1a9955de6cc38aef76929300f7172b0fad..ec1279f25bd60e4f1cb8eef5ff2c7a17870351cc 100644 --- a/frameworks/libs/distributeddb/syncer/src/device/singlever/single_ver_data_sync.h +++ b/frameworks/libs/distributeddb/syncer/src/device/singlever/single_ver_data_sync.h @@ -174,9 +174,9 @@ protected: SyncTimeRange dataTimeRange, bool isCheckBeforUpdate = false) const; void GetPeerWaterMark(SyncType syncType, const std::string &queryIdentify, const DeviceID &deviceId, - WaterMark &waterMark) const; + const DeviceID &userId, WaterMark &waterMark) const; - void GetPeerDeleteSyncWaterMark(const DeviceID &deviceId, WaterMark &waterMark); + void GetPeerDeleteSyncWaterMark(const DeviceID &deviceId, const DeviceID &userId, WaterMark &waterMark); int RemoveDeviceDataHandle(SingleVerSyncTaskContext *context, const Message *message, WaterMark maxSendDataTime); diff --git a/frameworks/libs/distributeddb/syncer/src/device/singlever/single_ver_data_sync_utils.cpp b/frameworks/libs/distributeddb/syncer/src/device/singlever/single_ver_data_sync_utils.cpp index 986d841b9a50a813aac5e548e40ea3ec0d4c1f80..6ef144cb60ae15bb0707083eaa98ba919273f4f6 100644 --- a/frameworks/libs/distributeddb/syncer/src/device/singlever/single_ver_data_sync_utils.cpp +++ b/frameworks/libs/distributeddb/syncer/src/device/singlever/single_ver_data_sync_utils.cpp @@ -536,7 +536,7 @@ void SingleVerDataSyncUtils::SetDataRequestCommonInfo(const SingleVerSyncTaskCon const SyncGenericInterface &storage, DataRequestPacket &packet, std::shared_ptr &metadata) { packet.SetSenderTimeOffset(metadata->GetLocalTimeOffset()); - packet.SetSystemTimeOffset(metadata->GetSystemTimeOffset(context.GetDeviceId())); + packet.SetSystemTimeOffset(metadata->GetSystemTimeOffset(context.GetDeviceId(), context.GetTargetUserId())); if (context.GetRemoteSoftwareVersion() < SOFTWARE_VERSION_RELEASE_9_0) { return; } @@ -564,7 +564,7 @@ int SingleVerDataSyncUtils::SchemaVersionMatchCheck(const SingleVerSyncTaskConte if (context.GetRemoteSoftwareVersion() < SOFTWARE_VERSION_RELEASE_9_0) { return E_OK; } - auto remoteSchemaVersion = metadata->GetRemoteSchemaVersion(context.GetDeviceId()); + auto remoteSchemaVersion = metadata->GetRemoteSchemaVersion(context.GetDeviceId(), context.GetTargetUserId()); if (remoteSchemaVersion != packet.GetSchemaVersion()) { LOGE("[DataSync] remote schema version misMatch, need ability sync again, packet %" PRIu64 " cache %" PRIu64, packet.GetSchemaVersion(), remoteSchemaVersion); diff --git a/frameworks/libs/distributeddb/syncer/src/device/singlever/single_ver_kv_syncer.cpp b/frameworks/libs/distributeddb/syncer/src/device/singlever/single_ver_kv_syncer.cpp index 31ac7c4b1ceaee17fc1e62a38fe67b4cf80d7df3..13292937782975fb05e411c69b71a8ea6ba03494 100644 --- a/frameworks/libs/distributeddb/syncer/src/device/singlever/single_ver_kv_syncer.cpp +++ b/frameworks/libs/distributeddb/syncer/src/device/singlever/single_ver_kv_syncer.cpp @@ -266,7 +266,8 @@ void SingleVerKVSyncer::TriggerSubQuerySync(const std::vector &devi std::string queryId = query.GetIdentify(); WaterMark queryWaterMark = 0; uint64_t lastTimestamp = metadata->GetQueryLastTimestamp(device, queryId); - errCode = metadata->GetSendQueryWaterMark(queryId, device, queryWaterMark, false); + // Auto sync does not support multi-user sync, The userId param is set to "". + errCode = metadata->GetSendQueryWaterMark(queryId, device, "", queryWaterMark, false); if (errCode != E_OK) { LOGE("[Syncer] get queryId=%s,dev=%s watermark failed", STR_MASK(queryId), STR_MASK(device)); continue; diff --git a/frameworks/libs/distributeddb/syncer/src/device/singlever/single_ver_sync_state_machine.cpp b/frameworks/libs/distributeddb/syncer/src/device/singlever/single_ver_sync_state_machine.cpp index 205ca3da104c0163660ce6198d849bd3469f22c7..c50514c53404e6a5dc05c4e5a712f49e3839e1bc 100644 --- a/frameworks/libs/distributeddb/syncer/src/device/singlever/single_ver_sync_state_machine.cpp +++ b/frameworks/libs/distributeddb/syncer/src/device/singlever/single_ver_sync_state_machine.cpp @@ -138,7 +138,8 @@ int SingleVerSyncStateMachine::Initialize(ISyncTaskContext *context, ISyncInterf return -E_OUT_OF_MEMORY; } - errCode = timeSync_->Initialize(communicator, metaData, syncInterface, context->GetDeviceId()); + errCode = timeSync_->Initialize(communicator, metaData, syncInterface, context->GetDeviceId(), + context->GetTargetUserId()); if (errCode != E_OK) { goto ERROR_OUT; } @@ -1244,15 +1245,15 @@ void SingleVerSyncStateMachine::ControlAckRecvErrCodeHandle(int errCode) } } -void SingleVerSyncStateMachine::GetLocalWaterMark(const DeviceID &deviceId, uint64_t &outValue) +void SingleVerSyncStateMachine::GetLocalWaterMark(const DeviceID &deviceId, const DeviceID &userId, uint64_t &outValue) { - metadata_->GetLocalWaterMark(deviceId, outValue); + metadata_->GetLocalWaterMark(deviceId, userId, outValue); } -int SingleVerSyncStateMachine::GetSendQueryWaterMark(const std::string &queryId, const DeviceID &deviceId, - bool isAutoLift, uint64_t &outValue) +int SingleVerSyncStateMachine::GetSendQueryWaterMark(const std::string &queryId, const DeviceID &deviceId, + const DeviceID &userId, bool isAutoLift, uint64_t &outValue) { - return metadata_->GetSendQueryWaterMark(queryId, deviceId, outValue, isAutoLift); + return metadata_->GetSendQueryWaterMark(queryId, deviceId, userId, outValue, isAutoLift); } void SingleVerSyncStateMachine::ResponsePullError(int errCode, bool ignoreInnerErr) diff --git a/frameworks/libs/distributeddb/syncer/src/device/singlever/single_ver_sync_state_machine.h b/frameworks/libs/distributeddb/syncer/src/device/singlever/single_ver_sync_state_machine.h index f026d9761a3efad1ed70d55a1f1e98a4361021f3..5a417f92b64b33d3f89b461c79c91c2ca30b3fe2 100644 --- a/frameworks/libs/distributeddb/syncer/src/device/singlever/single_ver_sync_state_machine.h +++ b/frameworks/libs/distributeddb/syncer/src/device/singlever/single_ver_sync_state_machine.h @@ -92,10 +92,10 @@ public: bool IsNeedTriggerQueryAutoSync(Message *inMsg, QuerySyncObject &query) override; - void GetLocalWaterMark(const DeviceID &deviceId, uint64_t &outValue); + void GetLocalWaterMark(const DeviceID &deviceId, const DeviceID &userId, uint64_t &outValue); - int GetSendQueryWaterMark(const std::string &queryId, const DeviceID &deviceId, bool isAutoLift, - uint64_t &outValue); + int GetSendQueryWaterMark(const std::string &queryId, const DeviceID &deviceId, const DeviceID &userId, + bool isAutoLift, uint64_t &outValue); void InnerErrorAbort(uint32_t sessionId) override; diff --git a/frameworks/libs/distributeddb/syncer/src/device/singlever/single_ver_sync_task_context.cpp b/frameworks/libs/distributeddb/syncer/src/device/singlever/single_ver_sync_task_context.cpp index 9ef6398943108adea8fd05e11afa50fa96629e2a..e72dfa41585d64a3e628a855d12e45dda81631e1 100644 --- a/frameworks/libs/distributeddb/syncer/src/device/singlever/single_ver_sync_task_context.cpp +++ b/frameworks/libs/distributeddb/syncer/src/device/singlever/single_ver_sync_task_context.cpp @@ -39,10 +39,10 @@ SingleVerSyncTaskContext::~SingleVerSyncTaskContext() subManager_ = nullptr; } -int SingleVerSyncTaskContext::Initialize(const std::string &deviceId, ISyncInterface *syncInterface, +int SingleVerSyncTaskContext::Initialize(const DeviceSyncTarget &target, ISyncInterface *syncInterface, const std::shared_ptr &metadata, ICommunicator *communicator) { - if (deviceId.empty() || syncInterface == nullptr || metadata == nullptr || + if (target.device.empty() || syncInterface == nullptr || metadata == nullptr || communicator == nullptr) { LOGE("[SingleVerSyncTaskContext] [Initialize] parameter is invalid."); return -E_INVALID_ARGS; @@ -52,7 +52,8 @@ int SingleVerSyncTaskContext::Initialize(const std::string &deviceId, ISyncInter LOGE("[SingleVerSyncTaskContext] [Initialize] stateMachine_ is nullptr."); return -E_OUT_OF_MEMORY; } - deviceId_ = deviceId; + deviceId_ = target.device; + targetUserId_ = target.userId; std::vector dbIdentifier = syncInterface->GetIdentifier(); dbIdentifier.resize(3); // only show 3 bytes syncActionName_ = DBDfxAdapter::SYNC_ACTION + "_" + @@ -518,14 +519,14 @@ int SingleVerSyncTaskContext::GetCorrectedSendWaterMarkForCurrentTask(const Sync if (operation != nullptr && operation->IsQuerySync()) { LOGD("Is QuerySync"); int errCode = static_cast(stateMachine_)->GetSendQueryWaterMark( - operation->GetQueryId(), deviceId_, + operation->GetQueryId(), deviceId_, targetUserId_, lastFullSyncTaskStatus_ == SyncOperation::OP_FINISHED_ALL, waterMark); if (errCode != E_OK) { return errCode; } } else { LOGD("Not QuerySync"); - static_cast(stateMachine_)->GetLocalWaterMark(deviceId_, waterMark); + static_cast(stateMachine_)->GetLocalWaterMark(deviceId_, targetUserId_, waterMark); } return E_OK; } diff --git a/frameworks/libs/distributeddb/syncer/src/device/singlever/single_ver_sync_task_context.h b/frameworks/libs/distributeddb/syncer/src/device/singlever/single_ver_sync_task_context.h index 0cb30f5165a523a0af228ddd1e6367eba263104a..66efa6acfbc2fd98235eb3122faba99c3577b41c 100644 --- a/frameworks/libs/distributeddb/syncer/src/device/singlever/single_ver_sync_task_context.h +++ b/frameworks/libs/distributeddb/syncer/src/device/singlever/single_ver_sync_task_context.h @@ -40,7 +40,7 @@ public: DISABLE_COPY_ASSIGN_MOVE(SingleVerSyncTaskContext); // Init SingleVerSyncTaskContext - int Initialize(const std::string &deviceId, ISyncInterface *syncInterface, + int Initialize(const DeviceSyncTarget &target, ISyncInterface *syncInterface, const std::shared_ptr &metadata, ICommunicator *communicator) override; // Add a sync task target with the operation to the queue diff --git a/frameworks/libs/distributeddb/syncer/src/device/singlever/single_ver_syncer.cpp b/frameworks/libs/distributeddb/syncer/src/device/singlever/single_ver_syncer.cpp index 322f2dca6ba8f76176759e699476546f4d65b382..b7e63c9063283343d2b810770a0355c593e42d56 100644 --- a/frameworks/libs/distributeddb/syncer/src/device/singlever/single_ver_syncer.cpp +++ b/frameworks/libs/distributeddb/syncer/src/device/singlever/single_ver_syncer.cpp @@ -66,7 +66,7 @@ int SingleVerSyncer::EraseDeviceWaterMark(const std::string &deviceId, bool isNe storage = syncInterface_; storage->IncRefCount(); } - int errCode = metadata->EraseDeviceWaterMark(deviceId, isNeedHash, tableName); + int errCode = metadata->EraseDeviceWaterMark(deviceId, "", isNeedHash, tableName); storage->DecRefCount(); return errCode; } diff --git a/frameworks/libs/distributeddb/syncer/src/device/sync_engine.cpp b/frameworks/libs/distributeddb/syncer/src/device/sync_engine.cpp index 5d4a60e550188b6b9f8608ec0e03498a5bb23587..1eb4565a9d87d397ffcac7360febc8cc8cda28e3 100644 --- a/frameworks/libs/distributeddb/syncer/src/device/sync_engine.cpp +++ b/frameworks/libs/distributeddb/syncer/src/device/sync_engine.cpp @@ -322,14 +322,23 @@ int SyncEngine::InitComunicator(const ISyncInterface *syncInterface) int SyncEngine::AddSyncOperForContext(const std::string &deviceId, SyncOperation *operation) { + if (syncInterface_ == nullptr) { + LOGE("[SyncEngine][AddSyncOperForContext] sync interface has not initialized"); + return -E_INVALID_DB; + } + bool isSyncDualTupleMode = syncInterface_->GetDbProperties().GetBoolProp(DBProperties::SYNC_DUAL_TUPLE_MODE, false); + std::string targetUserId = DBConstant::DEFAULT_USER; + if (isSyncDualTupleMode) { + targetUserId = GetTargetUserId(deviceId); + } int errCode = E_OK; ISyncTaskContext *context = nullptr; { std::lock_guard lock(contextMapLock_); - context = FindSyncTaskContext(deviceId); + context = FindSyncTaskContext({deviceId, targetUserId}); if (context == nullptr) { if (!IsKilled()) { - context = GetSyncTaskContext(deviceId, errCode); + context = GetSyncTaskContext({deviceId, targetUserId}, errCode); } if (context == nullptr) { return errCode; @@ -417,7 +426,7 @@ int SyncEngine::DealMsgUtilQueueEmpty() // it will deal with the first message in queue, we should increase object reference counts and sure that resources // could be prevented from destroying by other threads. do { - ISyncTaskContext *nextContext = GetContextForMsg(inMsg->GetTarget(), errCode); + ISyncTaskContext *nextContext = GetContextForMsg({inMsg->GetTarget(), inMsg->GetSenderUserId()}, errCode); if (errCode != E_OK) { break; } @@ -434,12 +443,12 @@ int SyncEngine::DealMsgUtilQueueEmpty() return errCode; } -ISyncTaskContext *SyncEngine::GetContextForMsg(const std::string &targetDev, int &errCode) +ISyncTaskContext *SyncEngine::GetContextForMsg(const DeviceSyncTarget &target, int &errCode) { ISyncTaskContext *context = nullptr; { std::lock_guard lock(contextMapLock_); - context = FindSyncTaskContext(targetDev); + context = FindSyncTaskContext(target); if (context != nullptr) { // LCOV_EXCL_BR_LINE if (context->IsKilled()) { errCode = -E_OBJ_IS_KILLED; @@ -450,7 +459,7 @@ ISyncTaskContext *SyncEngine::GetContextForMsg(const std::string &targetDev, int errCode = -E_OBJ_IS_KILLED; return nullptr; } - context = GetSyncTaskContext(targetDev, errCode); + context = GetSyncTaskContext(target, errCode); if (context == nullptr) { return nullptr; } @@ -544,7 +553,7 @@ int SyncEngine::MessageReciveCallbackInner(const std::string &targetDev, Message } int errCode = E_OK; - ISyncTaskContext *nextContext = GetContextForMsg(targetDev, errCode); + ISyncTaskContext *nextContext = GetContextForMsg({targetDev, inMsg->GetSenderUserId()}, errCode); if (errCode != E_OK) { return errCode; } @@ -598,9 +607,16 @@ int SyncEngine::GetMsgSize(const Message *inMsg) const } } -ISyncTaskContext *SyncEngine::FindSyncTaskContext(const std::string &deviceId) +ISyncTaskContext *SyncEngine::FindSyncTaskContext(const DeviceSyncTarget &target) { - auto iter = syncTaskContextMap_.find(deviceId); + if (target.userId == DBConstant::DEFAULT_USER) { + for (auto &[key, value] : syncTaskContextMap_) { + if (key.device == target.device) { + return value; + } + } + } + auto iter = syncTaskContextMap_.find(target); if (iter != syncTaskContextMap_.end()) { ISyncTaskContext *context = iter->second; return context; @@ -608,24 +624,30 @@ ISyncTaskContext *SyncEngine::FindSyncTaskContext(const std::string &deviceId) return nullptr; } -ISyncTaskContext *SyncEngine::GetSyncTaskContextAndInc(const std::string &deviceId) +std::vector SyncEngine::GetSyncTaskContextAndInc(const std::string &deviceId) { - ISyncTaskContext *context = nullptr; + std::vector contexts; std::lock_guard lock(contextMapLock_); - context = FindSyncTaskContext(deviceId); - if (context == nullptr) { - LOGI("[SyncEngine] dev=%s, context is null, no need to clear sync operation", STR_MASK(deviceId)); - return nullptr; - } - if (context->IsKilled()) { // LCOV_EXCL_BR_LINE - LOGI("[SyncEngine] context is killing"); - return nullptr; + for (const auto &iter : syncTaskContextMap_) { + if (iter.first.device != deviceId) { + continue; + } + if (iter.second == nullptr) { + LOGI("[SyncEngine] dev=%s, user=%s, context is null, no need to clear sync operation", STR_MASK(deviceId), + iter.first.userId.c_str()); + continue; + } + if (iter.second->IsKilled()) { // LCOV_EXCL_BR_LINE + LOGI("[SyncEngine] context is killing"); + continue; + } + RefObject::IncObjRef(iter.second); + contexts.push_back(iter.second); } - RefObject::IncObjRef(context); - return context; + return contexts; } -ISyncTaskContext *SyncEngine::GetSyncTaskContext(const std::string &deviceId, int &errCode) +ISyncTaskContext *SyncEngine::GetSyncTaskContext(const DeviceSyncTarget &target, int &errCode) { auto storage = GetAndIncSyncInterface(); if (storage == nullptr) { @@ -639,19 +661,19 @@ ISyncTaskContext *SyncEngine::GetSyncTaskContext(const std::string &deviceId, in LOGE("[SyncEngine] SyncTaskContext alloc failed, may be no memory available!"); return nullptr; } - errCode = context->Initialize(deviceId, storage, metadata_, communicatorProxy_); + errCode = context->Initialize(target, storage, metadata_, communicatorProxy_); if (errCode != E_OK) { - LOGE("[SyncEngine] context init failed err %d, dev %s", errCode, STR_MASK(deviceId)); + LOGE("[SyncEngine] context init failed err %d, dev %s", errCode, STR_MASK(target.device)); RefObject::DecObjRef(context); storage->DecRefCount(); context = nullptr; return nullptr; } - syncTaskContextMap_.insert(std::pair(deviceId, context)); + syncTaskContextMap_.insert(std::pair(target, context)); // IncRef for SyncEngine to make sure SyncEngine is valid when context access RefObject::IncObjRef(this); - context->OnLastRef([this, deviceId, storage]() { - LOGD("[SyncEngine] SyncTaskContext for id %s finalized", STR_MASK(deviceId)); + context->OnLastRef([this, target, storage]() { + LOGD("[SyncEngine] SyncTaskContext for id %s finalized", STR_MASK(target.device)); RefObject::DecObjRef(this); storage->DecRefCount(); }); @@ -678,6 +700,13 @@ int SyncEngine::ExecSyncTask(ISyncTaskContext *context) context->ClearSyncOperation(); continue; } + if (context->GetTargetUserId().empty()) { + LOGE("[SyncEngine] No target user found."); + context->SetTaskErrCode(-E_NO_TRUSTED_USER); + context->SetOperationStatus(SyncOperation::OP_FAILED); + context->ClearSyncOperation(); + continue; + } if (context->IsCurrentSyncTaskCanBeSkipped()) { // LCOV_EXCL_BR_LINE context->SetOperationStatus(SyncOperation::OP_FINISHED_ALL); context->ClearSyncOperation(); @@ -860,33 +889,37 @@ void SyncEngine::OfflineHandleByDevice(const std::string &deviceId, ISyncInterfa static_cast(storage)->GetDBInfo(dbInfo); RuntimeContext::GetInstance()->RemoveRemoteSubscribe(dbInfo, deviceId); // get context and Inc context if context is not nullptr - ISyncTaskContext *context = GetSyncTaskContextAndInc(deviceId); - { - std::lock_guard lock(communicatorProxyLock_); - if (communicatorProxy_ == nullptr) { - return; + std::vector contexts = GetSyncTaskContextAndInc(deviceId); + for (const auto &context : contexts) { + { + std::lock_guard lock(communicatorProxyLock_); + if (communicatorProxy_ == nullptr) { + return; + } + if (communicatorProxy_->IsDeviceOnline(deviceId)) { // LCOV_EXCL_BR_LINE + LOGI("[SyncEngine] target dev=%s is online, no need to clear task.", STR_MASK(deviceId)); + RefObject::DecObjRef(context); + return; + } } - if (communicatorProxy_->IsDeviceOnline(deviceId)) { // LCOV_EXCL_BR_LINE - LOGI("[SyncEngine] target dev=%s is online, no need to clear task.", STR_MASK(deviceId)); + // means device is offline, clear local subscribe + subManager_->ClearLocalSubscribeQuery(deviceId); + // clear sync task + if (context != nullptr) { + context->ClearAllSyncTask(); RefObject::DecObjRef(context); - return; } } - // means device is offline, clear local subscribe - subManager_->ClearLocalSubscribeQuery(deviceId); - // clear sync task - if (context != nullptr) { - context->ClearAllSyncTask(); - RefObject::DecObjRef(context); - } } void SyncEngine::ClearAllSyncTaskByDevice(const std::string &deviceId) { - ISyncTaskContext *context = GetSyncTaskContextAndInc(deviceId); - if (context != nullptr) { - context->ClearAllSyncTask(); - RefObject::DecObjRef(context); + std::vector contexts = GetSyncTaskContextAndInc(deviceId); + for (const auto &context : contexts) { + if (context != nullptr) { + context->ClearAllSyncTask(); + RefObject::DecObjRef(context); + } } } @@ -1376,4 +1409,29 @@ uint32_t SyncEngine::GetTimeout(const std::string &dev) RefObject::DecObjRef(communicator); return timeout; } + +std::string SyncEngine::GetTargetUserId(const std::string &dev) +{ + std::string targetUserId; + ICommunicator *communicator = nullptr; + { + std::lock_guard autoLock(communicatorProxyLock_); + if (communicatorProxy_ == nullptr) { + LOGW("[SyncEngine] Communicator is null when get target user"); + return targetUserId; + } + communicator = communicatorProxy_; + RefObject::IncObjRef(communicator); + } + DBProperties properties = syncInterface_->GetDbProperties(); + ExtendInfo extendInfo; + extendInfo.appId = properties.GetStringProp(DBProperties::APP_ID, ""); + extendInfo.userId = properties.GetStringProp(DBProperties::USER_ID, ""); + extendInfo.storeId = properties.GetStringProp(DBProperties::STORE_ID, ""); + extendInfo.dstTarget = dev; + extendInfo.subUserId = properties.GetStringProp(DBProperties::SUB_USER, ""); + targetUserId = communicator->GetTargetUserId(extendInfo); + RefObject::DecObjRef(communicator); + return targetUserId; +} } // namespace DistributedDB diff --git a/frameworks/libs/distributeddb/syncer/src/device/sync_engine.h b/frameworks/libs/distributeddb/syncer/src/device/sync_engine.h index 78c93192234325c4bf43ef4c157617084054d2a3..cbed36ed923853f83ccab3fc54e2cef266a2be55 100644 --- a/frameworks/libs/distributeddb/syncer/src/device/sync_engine.h +++ b/frameworks/libs/distributeddb/syncer/src/device/sync_engine.h @@ -142,8 +142,8 @@ protected: virtual ISyncTaskContext *CreateSyncTaskContext(const ISyncInterface &syncInterface) = 0; // Find SyncTaskContext from the map - ISyncTaskContext *FindSyncTaskContext(const std::string &deviceId); - ISyncTaskContext *GetSyncTaskContextAndInc(const std::string &deviceId); + ISyncTaskContext *FindSyncTaskContext(const DeviceSyncTarget &target); + std::vector GetSyncTaskContextAndInc(const std::string &deviceId); void GetQueryAutoSyncParam(const std::string &device, const QuerySyncObject &query, InternalSyncParma &outParam); void GetSubscribeSyncParam(const std::string &device, const QuerySyncObject &query, InternalSyncParma &outParam); @@ -151,12 +151,12 @@ protected: ISyncInterface *GetAndIncSyncInterface(); void SetSyncInterface(ISyncInterface *syncInterface); - ISyncTaskContext *GetSyncTaskContext(const std::string &deviceId, int &errCode); + ISyncTaskContext *GetSyncTaskContext(const DeviceSyncTarget &target, int &errCode); std::mutex storageMutex_; ISyncInterface *syncInterface_; // Used to store all send sync task infos (such as pull sync response, and push sync request) - std::map syncTaskContextMap_; + std::map syncTaskContextMap_; std::mutex contextMapLock_; std::shared_ptr subManager_; std::function queryAutoSyncCallback_; @@ -201,7 +201,7 @@ private: // Handle message in order. int ScheduleDealMsg(ISyncTaskContext *context, Message *inMsg); - ISyncTaskContext *GetContextForMsg(const std::string &targetDev, int &errCode); + ISyncTaskContext *GetContextForMsg(const DeviceSyncTarget &target, int &errCode); ICommunicator *AllocCommunicator(const std::string &identifier, int &errCode, std::string userId = ""); @@ -237,6 +237,7 @@ private: uint32_t GetTimeout(const std::string &dev); + std::string GetTargetUserId(const std::string &dev); ICommunicator *communicator_; DeviceManager *deviceManager_; std::function onRemoteDataChanged_; diff --git a/frameworks/libs/distributeddb/syncer/src/device/sync_task_context.cpp b/frameworks/libs/distributeddb/syncer/src/device/sync_task_context.cpp index 4fd93de50f11932d034806f7f0b20e29309c2b8e..63fb64aa5bd3f453d0a4760801d107be653f15e5 100644 --- a/frameworks/libs/distributeddb/syncer/src/device/sync_task_context.cpp +++ b/frameworks/libs/distributeddb/syncer/src/device/sync_task_context.cpp @@ -285,6 +285,16 @@ std::string SyncTaskContext::GetDeviceId() const return deviceId_; } +std::string SyncTaskContext::GetTargetUserId() const +{ + return targetUserId_; +} + +void SyncTaskContext::SetTargetUserId(const std::string &userId) +{ + targetUserId_ = userId; +} + void SyncTaskContext::SetTaskExecStatus(int status) { taskExecStatus_ = status; diff --git a/frameworks/libs/distributeddb/syncer/src/device/sync_task_context.h b/frameworks/libs/distributeddb/syncer/src/device/sync_task_context.h index 42d53e7dc59ca8896b35112575acf5d3ef9ac365..7885b91fea90381835af6fa5a06d49b23309213a 100644 --- a/frameworks/libs/distributeddb/syncer/src/device/sync_task_context.h +++ b/frameworks/libs/distributeddb/syncer/src/device/sync_task_context.h @@ -78,6 +78,10 @@ public: // Get the current task deviceId. std::string GetDeviceId() const override; + std::string GetTargetUserId() const override; + + void SetTargetUserId(const std::string &userId) override; + // Set the sync task queue exec status void SetTaskExecStatus(int status) override; @@ -260,6 +264,7 @@ protected: volatile int status_; volatile int taskExecStatus_; std::string deviceId_; + std::string targetUserId_; std::string syncActionName_; ISyncInterface *syncInterface_; ICommunicator *communicator_; diff --git a/frameworks/libs/distributeddb/syncer/src/device/time_sync.cpp b/frameworks/libs/distributeddb/syncer/src/device/time_sync.cpp index 622c532b8d5245f8561f5d6c64830c4e4a1e322a..d8bcdcc790f1d9e00f0e152009355faa0bfb189a 100644 --- a/frameworks/libs/distributeddb/syncer/src/device/time_sync.cpp +++ b/frameworks/libs/distributeddb/syncer/src/device/time_sync.cpp @@ -179,7 +179,7 @@ int TimeSync::RegisterTransformFunc() } int TimeSync::Initialize(ICommunicator *communicator, const std::shared_ptr &metadata, - const ISyncInterface *storage, const DeviceID &deviceId) + const ISyncInterface *storage, const DeviceID &deviceId, const DeviceID &userId) { if ((communicator == nullptr) || (storage == nullptr) || (metadata == nullptr)) { return -E_INVALID_ARGS; @@ -191,6 +191,7 @@ int TimeSync::Initialize(ICommunicator *communicator, const std::shared_ptr(); int errCode = timeHelper_->Initialize(storage, metadata_); @@ -205,7 +206,7 @@ int TimeSync::Initialize(ICommunicator *communicator, const std::shared_ptrIsTimeSyncFinish(deviceId_); + isSynced_ = metadata_->IsTimeSyncFinish(deviceId_, userId_); return errCode; } @@ -446,9 +447,9 @@ int TimeSync::RequestRecv(const Message *message) return errCode; } -int TimeSync::SaveTimeOffset(const DeviceID &deviceID, TimeOffset timeOffset) +int TimeSync::SaveTimeOffset(const DeviceID &deviceID, const DeviceID &userId, TimeOffset timeOffset) { - return metadata_->SaveTimeOffset(deviceID, timeOffset); + return metadata_->SaveTimeOffset(deviceID, userId, timeOffset); } std::pair TimeSync::CalculateTimeOffset(const TimeSyncPacket &timeSyncInfo) @@ -546,7 +547,7 @@ int TimeSync::GetTimeOffset(TimeOffset &outOffset, uint32_t timeout, uint32_t se return -E_BUSY; } retryTime_ = 0; - metadata_->GetTimeOffset(deviceId_, outOffset); + metadata_->GetTimeOffset(deviceId_, userId_, outOffset); return E_OK; } @@ -692,16 +693,16 @@ void TimeSync::ReTimeSyncIfNeed(const TimeSyncPacket &ackPacket) } // reset time change by time sync - int errCode = metadata_->SetTimeChangeMark(deviceId_, false); + int errCode = metadata_->SetTimeChangeMark(deviceId_, userId_, false); if (errCode != E_OK) { - LOGW("[TimeSync] Mark dev %.3s no time change failed %d", deviceId_.c_str(), errCode); + LOGW("[TimeSync] Mark dev %.3s_%.3s no time change failed %d", deviceId_.c_str(), userId_.c_str(), errCode); } } bool TimeSync::CheckReTimeSyncIfNeedWithLowVersion(TimeOffset timeOffsetIgnoreRtt) { TimeOffset metadataTimeOffset; - metadata_->GetTimeOffset(deviceId_, metadataTimeOffset); + metadata_->GetTimeOffset(deviceId_, userId_, metadataTimeOffset); return (std::abs(metadataTimeOffset) >= INT64_MAX / 2) || // 2 is half of INT64_MAX (std::abs(metadataTimeOffset - timeOffsetIgnoreRtt) > MAX_TIME_OFFSET_NOISE); } @@ -719,10 +720,11 @@ int TimeSync::SaveOffsetWithAck(const TimeSyncPacket &ackPacket) // calculate timeoffset of two devices auto [offset, rtt] = CalculateTimeOffset(ackPacket); TimeOffset rawOffset = CalculateRawTimeOffset(ackPacket, offset); - LOGD("TimeSync::AckRecv, dev = %s{private}, sEnd = %" PRIu64 ", tEnd = %" PRIu64 ", sBegin = %" PRIu64 + LOGD("TimeSync::AckRecv, dev = %s{private}_%s{private}, sEnd = %" PRIu64 ", tEnd = %" PRIu64 ", sBegin = %" PRIu64 ", tBegin = %" PRIu64 ", offset = %" PRId64 ", rawOffset = %" PRId64 ", requestLocalOffset = %" PRId64 ", responseLocalOffset = %" PRId64, deviceId_.c_str(), + userId_.c_str(), ackPacket.GetSourceTimeEnd(), ackPacket.GetTargetTimeEnd(), ackPacket.GetSourceTimeBegin(), @@ -733,11 +735,11 @@ int TimeSync::SaveOffsetWithAck(const TimeSyncPacket &ackPacket) ackPacket.GetResponseLocalOffset()); // save timeoffset into metadata, maybe a block action - int errCode = SaveTimeOffset(deviceId_, offset); + int errCode = SaveTimeOffset(deviceId_, userId_, offset); if (errCode != E_OK) { return errCode; } - errCode = metadata_->SetSystemTimeOffset(deviceId_, rawOffset); + errCode = metadata_->SetSystemTimeOffset(deviceId_, userId_, rawOffset); if (errCode != E_OK) { return errCode; } @@ -793,7 +795,7 @@ void TimeSync::SetTimeSyncFinishIfNeed() if (errCode != E_OK) { return; } - int64_t systemTimeOffset = metadata_->GetSystemTimeOffset(deviceId_); + int64_t systemTimeOffset = metadata_->GetSystemTimeOffset(deviceId_, userId_); LOGD("[TimeSync] Check db offset %" PRId64 " cache offset %" PRId64, systemTimeOffset, info.systemTimeOffset); if (!CheckSkipTimeSync(info) || (IsNeedSync() && std::abs(systemTimeOffset - info.systemTimeOffset) >= MAX_TIME_OFFSET_NOISE)) { @@ -804,7 +806,7 @@ void TimeSync::SetTimeSyncFinishIfNeed() SetTimeSyncFinishInner(true); } if (systemTimeOffset != info.systemTimeOffset) { - errCode = metadata_->SetSystemTimeOffset(deviceId_, info.systemTimeOffset); + errCode = metadata_->SetSystemTimeOffset(deviceId_, userId_, info.systemTimeOffset); if (errCode != E_OK) { return; } @@ -825,7 +827,7 @@ int TimeSync::GenerateTimeOffsetIfNeed(TimeOffset systemOffset, TimeOffset sende } auto [errCode, info] = RuntimeContext::GetInstance()->GetDeviceTimeInfo(deviceId_); bool syncFinish = !IsNeedSync(); - bool timeChange = metadata_->IsTimeChange(deviceId_); + bool timeChange = metadata_->IsTimeChange(deviceId_, userId_); // avoid local time change but remote record time sync finish // should return re time sync, after receive time sync request, reset time change mark // we think offset is ok when local time sync to remote @@ -842,11 +844,11 @@ int TimeSync::GenerateTimeOffsetIfNeed(TimeOffset systemOffset, TimeOffset sende // Sender's deltaTime = Sender's systemOffset - requestLocalOffset + responseLocalOffset // Receiver's deltaTime = -Sender's deltaTime = -Sender's systemOffset + requestLocalOffset - responseLocalOffset TimeOffset offset = -systemOffset + senderLocalOffset - metadata_->GetLocalTimeOffset(); - errCode = metadata_->SetSystemTimeOffset(deviceId_, -systemOffset); + errCode = metadata_->SetSystemTimeOffset(deviceId_, userId_, -systemOffset); if (errCode != E_OK) { return errCode; } - errCode = metadata_->SaveTimeOffset(deviceId_, offset); + errCode = metadata_->SaveTimeOffset(deviceId_, userId_, offset); if (errCode != E_OK) { return errCode; } @@ -863,10 +865,10 @@ void TimeSync::SetTimeSyncFinishInner(bool finish) if (IsRemoteLowVersion(SOFTWARE_VERSION_RELEASE_9_0)) { return; } - int errCode = metadata_->SetTimeSyncFinishMark(deviceId_, finish); + int errCode = metadata_->SetTimeSyncFinishMark(deviceId_, userId_, finish); if (errCode != E_OK) { - LOGW("[TimeSync] Set %.3s time sync finish %d mark failed %d", deviceId_.c_str(), static_cast(finish), - errCode); + LOGW("[TimeSync] Set %.3s_%.3s time sync finish %d mark failed %d", deviceId_.c_str(), userId_.c_str(), + static_cast(finish), errCode); } } } // namespace DistributedDB \ No newline at end of file diff --git a/frameworks/libs/distributeddb/syncer/src/device/time_sync.h b/frameworks/libs/distributeddb/syncer/src/device/time_sync.h index b8ec799191ed1a955b9c370aa7339d94cb96a7aa..33023603c377df4302ebdfbf5b1bd53f9bad5436 100644 --- a/frameworks/libs/distributeddb/syncer/src/device/time_sync.h +++ b/frameworks/libs/distributeddb/syncer/src/device/time_sync.h @@ -82,7 +82,7 @@ public: static int DeSerialization(const uint8_t *buffer, uint32_t length, Message *inMsg); // register to communicator int Initialize(ICommunicator *communicator, const std::shared_ptr &metadata, - const ISyncInterface *storage, const DeviceID &deviceId); + const ISyncInterface *storage, const DeviceID &deviceId, const DeviceID &userId); virtual int SyncStart(const CommErrHandler &handler = nullptr, uint32_t sessionId = 0); // send timesync request @@ -121,7 +121,7 @@ protected: void Finalize(); - int SaveTimeOffset(const DeviceID &deviceID, TimeOffset timeOffset); + int SaveTimeOffset(const DeviceID &deviceID, const DeviceID &userId, TimeOffset timeOffset); int SendPacket(const DeviceID &deviceId, const Message *message, const CommErrHandler &handler = nullptr); @@ -153,6 +153,7 @@ protected: std::shared_ptr metadata_; std::unique_ptr timeHelper_; DeviceID deviceId_; + DeviceID userId_; int retryTime_; TimerId driverTimerId_; TimerAction driverCallback_; diff --git a/frameworks/libs/distributeddb/test/BUILD.gn b/frameworks/libs/distributeddb/test/BUILD.gn index 8ac0ef3f127cb3200c97bf2bb3644c0ea1dd56fd..7dc84b45911734383fb01fb48106ac1e82500b05 100644 --- a/frameworks/libs/distributeddb/test/BUILD.gn +++ b/frameworks/libs/distributeddb/test/BUILD.gn @@ -881,6 +881,16 @@ distributeddb_unittest("DistributedDBKVDataStatusTest") { ] } +distributeddb_unittest("DistributedDBKvMultiUserSyncTest") { + sources = + [ "unittest/common/store_test/kv/distracteddb_kv_multi_user_sync_test.cpp" ] +} + +distributeddb_unittest("DistributedDBRDBMultiUserSyncTest") { + sources = + [ "unittest/common/store_test/rdb/distracteddb_rdb_multi_user_sync_test.cpp" ] +} + distributeddb_unittest("DistributedDBBasicRDBTest") { sources = [ "unittest/common/store_test/rdb/distributeddb_basic_rdb_test.cpp" ] } @@ -1016,6 +1026,8 @@ group("unittest") { ":DistributedDBInterfacesTransactionTest", ":DistributedDBJsonPrecheckUnitTest", ":DistributedDBKVDataStatusTest", + ":DistributedDBKvMultiUserSyncTest", + ":DistributedDBRDBMultiUserSyncTest", ":DistributedDBMetaDataTest", ":DistributedDBMockSyncModuleTest", ":DistributedDBMultiVerP2PSyncTest", diff --git a/frameworks/libs/distributeddb/test/unittest/common/common/basic_unit_test.h b/frameworks/libs/distributeddb/test/unittest/common/common/basic_unit_test.h index 17a82eeb6d1296d7dc97968acf7e1c9fd1fee91a..fb049f1ded5db7748d6f8d735ed8278a4136d6a5 100644 --- a/frameworks/libs/distributeddb/test/unittest/common/common/basic_unit_test.h +++ b/frameworks/libs/distributeddb/test/unittest/common/common/basic_unit_test.h @@ -39,15 +39,9 @@ protected: static std::string GetTestDir(); static StoreInfo GetStoreInfo1(); static StoreInfo GetStoreInfo2(); - struct StoreComparator { - bool operator() (const StoreInfo &source, const StoreInfo &target) const - { - return source.userId < target.userId || source.appId < target.appId || source.storeId < target.storeId; - } - }; VirtualCommunicatorAggregator *communicatorAggregator_ = nullptr; mutable std::mutex deviceMutex_; - std::map deviceMap_; + std::map deviceMap_; }; } #endif // BASIC_UNIT_TEST_H diff --git a/frameworks/libs/distributeddb/test/unittest/common/common/kv_general_ut.h b/frameworks/libs/distributeddb/test/unittest/common/common/kv_general_ut.h index 19836ae9560d2a06d83685076ffd327fb6cfe1c4..3c633d5614127e0c2d5560eca32e0c02f012c3d6 100644 --- a/frameworks/libs/distributeddb/test/unittest/common/common/kv_general_ut.h +++ b/frameworks/libs/distributeddb/test/unittest/common/common/kv_general_ut.h @@ -39,7 +39,7 @@ protected: static KvStoreConfig GetKvStoreConfig(); mutable std::mutex storeMutex_; std::optional option_; - std::map stores_; + std::map stores_; DistributedDBUnitTest::DistributedDBToolsUnitTest tool_; std::shared_ptr virtualCloudDb_; }; diff --git a/frameworks/libs/distributeddb/test/unittest/common/common/rdb_general_ut.h b/frameworks/libs/distributeddb/test/unittest/common/common/rdb_general_ut.h index 8bd647a1bf11f7d60aa015a1318b33e04eea9ffa..be3b412fa22c9264ae14c959c19aa1f45675a166 100644 --- a/frameworks/libs/distributeddb/test/unittest/common/common/rdb_general_ut.h +++ b/frameworks/libs/distributeddb/test/unittest/common/common/rdb_general_ut.h @@ -80,9 +80,9 @@ protected: int GetCloudDataCount(const std::string &tableName) const; mutable std::mutex storeMutex_; - std::map stores_; - std::map sqliteDb_; - std::map schemaInfoMap_; + std::map stores_; + std::map sqliteDb_; + std::map schemaInfoMap_; std::shared_ptr virtualCloudDb_ = nullptr; std::shared_ptr virtualAssetLoader_ = nullptr; RelationalStoreDelegate::Option option_; diff --git a/frameworks/libs/distributeddb/test/unittest/common/communicator/adapter_stub.cpp b/frameworks/libs/distributeddb/test/unittest/common/communicator/adapter_stub.cpp index 0d2f5c9d28c955321019ebdcc5e2e18175f671e4..23d977cc052047eff42eee86fa03ea9bd59085cd 100644 --- a/frameworks/libs/distributeddb/test/unittest/common/communicator/adapter_stub.cpp +++ b/frameworks/libs/distributeddb/test/unittest/common/communicator/adapter_stub.cpp @@ -209,7 +209,11 @@ void AdapterStub::DeliverBytes(const std::string &srcTarget, const uint8_t *byte uint32_t headLength = 0; GetDataHeadInfo(bytes, headLength); std::vector userInfos; - GetDataUserInfo(bytes, userInfos); + if (userInfo_.empty()) { + GetDataUserInfo(bytes, userInfos); + } else { + userInfos = userInfo_; + } std::shared_ptr processCommunicator = std::make_shared(); processCommunicator->SetDataUserInfo(userInfos); @@ -242,6 +246,7 @@ void AdapterStub::GetDataUserInfo(const uint8_t *data, std::vector &us break; } userInfo.receiveUser.push_back(info->userId[i]); + userInfo.sendUser.push_back(info->userId[i]); } userInfos.push_back(userInfo); } @@ -449,4 +454,14 @@ void AdapterStub::ApplySendBitError(const uint8_t *bytes, uint32_t length) phyHeader->checkSum = HostToNet(CalculateXorSum(bytes + LENGTH_BEFORE_SUM_RANGE, length - LENGTH_BEFORE_SUM_RANGE)); } +} + +void AdapterStub::SetUserInfo(const std::vector &userInfo) +{ + userInfo_ = userInfo; +} + +std::vector AdapterStub::GetUserInfo() +{ + return userInfo_; } \ No newline at end of file diff --git a/frameworks/libs/distributeddb/test/unittest/common/communicator/adapter_stub.h b/frameworks/libs/distributeddb/test/unittest/common/communicator/adapter_stub.h index 13c8396f315132e199d018502a914f9254222223..8fa5f71d319a5fd5c59e01fdb6d5e672a691f01d 100644 --- a/frameworks/libs/distributeddb/test/unittest/common/communicator/adapter_stub.h +++ b/frameworks/libs/distributeddb/test/unittest/common/communicator/adapter_stub.h @@ -85,6 +85,9 @@ public: void SimulateSendBitErrorInPaddingLenField(bool doFlag, uint8_t inPaddingLen); void SimulateSendBitErrorInMessageIdField(bool doFlag, uint32_t inMessageId); void ForkSendBytes(const OnSendBytes &onSendBytes); + + void SetUserInfo(const std::vector &userInfo); + std::vector GetUserInfo(); private: void Connect(AdapterStub *inStub); void Disconnect(AdapterStub *inStub); @@ -137,6 +140,8 @@ private: std::mutex sendBytesMutex_; OnSendBytes onSendBytes_; + + std::vector userInfo_; }; } diff --git a/frameworks/libs/distributeddb/test/unittest/common/communicator/distributeddb_communicator_send_receive_test.cpp b/frameworks/libs/distributeddb/test/unittest/common/communicator/distributeddb_communicator_send_receive_test.cpp index c409df9db92316086d52683ceeb37f21e12cdcb9..d81470b60965b7aedd500988d1a324cfb378ed65 100644 --- a/frameworks/libs/distributeddb/test/unittest/common/communicator/distributeddb_communicator_send_receive_test.cpp +++ b/frameworks/libs/distributeddb/test/unittest/common/communicator/distributeddb_communicator_send_receive_test.cpp @@ -786,6 +786,8 @@ HWTEST_F(DistributedDBCommunicatorSendReceiveTest, SendAndReceiveWithExtendHead0 */ Message *msgForAA = BuildAppLayerFrameMessage(); ASSERT_NE(msgForAA, nullptr); + UserInfo userInfo = {"", "userId"}; + g_envDeviceB.adapterHandle->SetUserInfo({userInfo}); SendConfig conf = {false, true, 0, {"appId", "storeId", "", "DeviceB"}}; int errCode = g_commAA->SendMessage(DEVICE_NAME_B, msgForAA, conf); EXPECT_EQ(errCode, E_OK); diff --git a/frameworks/libs/distributeddb/test/unittest/common/storage/cloud/distributeddb_cloud_meta_data_test.cpp b/frameworks/libs/distributeddb/test/unittest/common/storage/cloud/distributeddb_cloud_meta_data_test.cpp index c96cb2f113ad5f0bb9ebfc9d63039aa3c9255865..c5f5d056513615f6e3a59d957bcef73fb8dbbe18 100644 --- a/frameworks/libs/distributeddb/test/unittest/common/storage/cloud/distributeddb_cloud_meta_data_test.cpp +++ b/frameworks/libs/distributeddb/test/unittest/common/storage/cloud/distributeddb_cloud_meta_data_test.cpp @@ -337,7 +337,7 @@ namespace { std::vector keys; EXPECT_EQ(obj.DeleteMetaData(keys), -E_INVALID_DB); EXPECT_EQ(obj.GetAllMetaKeys(keys), -E_INVALID_DB); - Key key; + Key key = {'k'}; Value value; EXPECT_EQ(obj.GetMetaData(key, value), -E_INVALID_DB); EXPECT_EQ(obj.PutMetaData(key, value), -E_INVALID_DB); diff --git a/frameworks/libs/distributeddb/test/unittest/common/store_test/kv/distracteddb_kv_multi_user_sync_test.cpp b/frameworks/libs/distributeddb/test/unittest/common/store_test/kv/distracteddb_kv_multi_user_sync_test.cpp new file mode 100644 index 0000000000000000000000000000000000000000..94228fee4fa99a6c0ab75229fe3066bb4a496be4 --- /dev/null +++ b/frameworks/libs/distributeddb/test/unittest/common/store_test/kv/distracteddb_kv_multi_user_sync_test.cpp @@ -0,0 +1,236 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "kv_general_ut.h" + +namespace DistributedDB { +using namespace testing::ext; +using namespace DistributedDB; +using namespace DistributedDBUnitTest; + +class DistributedDBKvMultiUserSyncTest : public KVGeneralUt { +protected: + void PrepareData(); + void SyncStep1(); + void SyncStep2(); + void SyncStep3(); + static void SetTargetUserId(const std::string &deviceId, const std::string &userId); + static constexpr const char *DEVICE_A = "DEVICE_A"; + static constexpr const char *DEVICE_B = "DEVICE_B"; + static constexpr const char *USER_ID_1 = "USER_ID_1"; + static constexpr const char *USER_ID_2 = "USER_ID_2"; +}; + +void CheckData(KvStoreNbDelegate *delegate, const Key &key, const Value &expectValue) +{ + Value actualValue; + if (expectValue.empty()) { + EXPECT_EQ(delegate->Get(key, actualValue), NOT_FOUND); + } else { + EXPECT_EQ(delegate->Get(key, actualValue), OK); + EXPECT_EQ(actualValue, expectValue); + } +} + +void DistributedDBKvMultiUserSyncTest::SetTargetUserId(const std::string &deviceId, const std::string &userId) +{ + ICommunicatorAggregator *communicatorAggregator = nullptr; + RuntimeContext::GetInstance()->GetCommunicatorAggregator(communicatorAggregator); + ASSERT_NE(communicatorAggregator, nullptr); + auto virtualCommunicatorAggregator = static_cast(communicatorAggregator); + auto communicator = static_cast(virtualCommunicatorAggregator->GetCommunicator(deviceId)); + ASSERT_NE(communicator, nullptr); + communicator->SetTargetUserId(userId); +} + +void DistributedDBKvMultiUserSyncTest::PrepareData() +{ + KvStoreNbDelegate::Option option; + option.syncDualTupleMode = true; + SetOption(option); + + StoreInfo storeInfo1 = {USER_ID_1, STORE_ID_1, APP_ID}; + ASSERT_EQ(BasicUnitTest::InitDelegate(storeInfo1, DEVICE_A), E_OK); + auto store1 = GetDelegate(storeInfo1); + ASSERT_NE(store1, nullptr); + + StoreInfo storeInfo2 = {USER_ID_2, STORE_ID_1, APP_ID}; + ASSERT_EQ(BasicUnitTest::InitDelegate(storeInfo2, DEVICE_A), E_OK); + auto store2 = GetDelegate(storeInfo2); + ASSERT_NE(store2, nullptr); + + EXPECT_EQ(store1->Put(KEY_1, VALUE_1), OK); + EXPECT_EQ(store1->Put(KEY_2, VALUE_2), OK); + EXPECT_EQ(store1->Put(KEY_3, VALUE_3), OK); + EXPECT_EQ(store2->Put(KEY_4, VALUE_4), OK); + + CheckData(store1, KEY_1, VALUE_1); + CheckData(store1, KEY_2, VALUE_2); + CheckData(store1, KEY_3, VALUE_3); + CheckData(store2, KEY_4, VALUE_4); + ASSERT_EQ(KVGeneralUt::CloseDelegate(storeInfo1), E_OK); + ASSERT_EQ(KVGeneralUt::CloseDelegate(storeInfo2), E_OK); +} + +void DistributedDBKvMultiUserSyncTest::SyncStep1() +{ + StoreInfo storeInfo1 = {USER_ID_1, STORE_ID_1, APP_ID}; + ASSERT_EQ(BasicUnitTest::InitDelegate(storeInfo1, DEVICE_A), E_OK); + auto store1 = GetDelegate(storeInfo1); + ASSERT_NE(store1, nullptr); + + StoreInfo storeInfo3 = {USER_ID_1, STORE_ID_2, APP_ID}; + ASSERT_EQ(BasicUnitTest::InitDelegate(storeInfo3, DEVICE_B), E_OK); + auto store3 = GetDelegate(storeInfo3); + ASSERT_NE(store3, nullptr); + + SetTargetUserId(DEVICE_A, USER_ID_1); + SetTargetUserId(DEVICE_B, USER_ID_1); + BlockPush(storeInfo1, storeInfo3); + + CheckData(store3, KEY_1, VALUE_1); + CheckData(store3, KEY_2, VALUE_2); + CheckData(store3, KEY_3, VALUE_3); + + ASSERT_EQ(KVGeneralUt::CloseDelegate(storeInfo1), E_OK); + ASSERT_EQ(KVGeneralUt::CloseDelegate(storeInfo3), E_OK); +} + +void DistributedDBKvMultiUserSyncTest::SyncStep2() +{ + StoreInfo storeInfo2 = {USER_ID_2, STORE_ID_1, APP_ID}; + ASSERT_EQ(BasicUnitTest::InitDelegate(storeInfo2, DEVICE_A), E_OK); + auto store2 = GetDelegate(storeInfo2); + ASSERT_NE(store2, nullptr); + + StoreInfo storeInfo4 = {USER_ID_2, STORE_ID_2, APP_ID}; + ASSERT_EQ(BasicUnitTest::InitDelegate(storeInfo4, DEVICE_B), E_OK); + auto store4 = GetDelegate(storeInfo4); + ASSERT_NE(store4, nullptr); + + SetTargetUserId(DEVICE_A, USER_ID_2); + SetTargetUserId(DEVICE_B, USER_ID_2); + BlockPush(storeInfo2, storeInfo4); + + CheckData(store4, KEY_1, {}); + CheckData(store4, KEY_2, {}); + CheckData(store4, KEY_3, {}); + CheckData(store4, KEY_4, VALUE_4); + + ASSERT_EQ(KVGeneralUt::CloseDelegate(storeInfo2), E_OK); + ASSERT_EQ(KVGeneralUt::CloseDelegate(storeInfo4), E_OK); +} + +void DistributedDBKvMultiUserSyncTest::SyncStep3() +{ + StoreInfo storeInfo1 = {USER_ID_1, STORE_ID_1, APP_ID}; + ASSERT_EQ(BasicUnitTest::InitDelegate(storeInfo1, DEVICE_A), E_OK); + auto store1 = GetDelegate(storeInfo1); + ASSERT_NE(store1, nullptr); + + StoreInfo storeInfo4 = {USER_ID_2, STORE_ID_2, APP_ID}; + ASSERT_EQ(BasicUnitTest::InitDelegate(storeInfo4, DEVICE_B), E_OK); + auto store4 = GetDelegate(storeInfo4); + ASSERT_NE(store4, nullptr); + + SetTargetUserId(DEVICE_A, USER_ID_2); + SetTargetUserId(DEVICE_B, USER_ID_1); + BlockPush(storeInfo1, storeInfo4); + + CheckData(store4, KEY_1, VALUE_1); + CheckData(store4, KEY_2, VALUE_2); + CheckData(store4, KEY_3, VALUE_3); + CheckData(store4, KEY_4, VALUE_4); + + ASSERT_EQ(KVGeneralUt::CloseDelegate(storeInfo1), E_OK); + ASSERT_EQ(KVGeneralUt::CloseDelegate(storeInfo4), E_OK); +} + +/** + * @tc.name: NormalSyncTest001 + * @tc.desc: Test normal sync. + * @tc.type: FUNC + * @tc.require: + * @tc.author: liaoyonghuang + */ +HWTEST_F(DistributedDBKvMultiUserSyncTest, NormalSyncTest001, TestSize.Level1) +{ + /** + * @tc.steps: step1. (devA, user1) put 3 records, (devA, user2) put 1 record + * @tc.expected: step1. OK. + */ + PrepareData(); + /** + * @tc.steps: step2. (devA, user1) sync to (devB, user1) + * @tc.expected: step2. OK. + */ + SyncStep1(); + /** + * @tc.steps: step3. (devA, user2) put 3 records, (devB, user2) put 1 record + * @tc.expected: step3. OK. + */ + SyncStep2(); + /** + * @tc.steps: step4. (devA, user1) put 3 records, (devB, user2) put 1 record + * @tc.expected: step4. OK. + */ + SyncStep3(); +} + +/** + * @tc.name: InvalidSync001 + * @tc.desc: Test sync with empty target user. + * @tc.type: FUNC + * @tc.require: + * @tc.author: liaoyonghuang + */ +HWTEST_F(DistributedDBKvMultiUserSyncTest, InvalidSync001, TestSize.Level0) +{ + /** + * @tc.steps: step1. (devA, user1) put 3 records, (devA, user2) put 1 record + * @tc.expected: step1. OK. + */ + KvStoreNbDelegate::Option option; + option.syncDualTupleMode = true; + SetOption(option); + StoreInfo storeInfo1 = {USER_ID_1, STORE_ID_1, APP_ID}; + ASSERT_EQ(BasicUnitTest::InitDelegate(storeInfo1, DEVICE_A), E_OK); + auto store1 = GetDelegate(storeInfo1); + ASSERT_NE(store1, nullptr); + + StoreInfo storeInfo2 = {USER_ID_2, STORE_ID_1, APP_ID}; + ASSERT_EQ(BasicUnitTest::InitDelegate(storeInfo2, DEVICE_B), E_OK); + auto store2 = GetDelegate(storeInfo2); + ASSERT_NE(store2, nullptr); + + EXPECT_EQ(store1->Put(KEY_1, VALUE_1), OK); + EXPECT_EQ(store1->Put(KEY_2, VALUE_2), OK); + EXPECT_EQ(store1->Put(KEY_3, VALUE_3), OK); + EXPECT_EQ(store2->Put(KEY_4, VALUE_4), OK); + + CheckData(store1, KEY_1, VALUE_1); + CheckData(store1, KEY_2, VALUE_2); + CheckData(store1, KEY_3, VALUE_3); + CheckData(store2, KEY_4, VALUE_4); + /** + * @tc.steps: step2. set empty target user and sync + * @tc.expected: step2. return DB_ERROR. + */ + SetTargetUserId(DEVICE_A, ""); + BlockPush(storeInfo1, storeInfo2, DB_ERROR); + ASSERT_EQ(KVGeneralUt::CloseDelegate(storeInfo1), E_OK); + ASSERT_EQ(KVGeneralUt::CloseDelegate(storeInfo2), E_OK); +} +} \ No newline at end of file diff --git a/frameworks/libs/distributeddb/test/unittest/common/store_test/rdb/distracteddb_rdb_multi_user_sync_test.cpp b/frameworks/libs/distributeddb/test/unittest/common/store_test/rdb/distracteddb_rdb_multi_user_sync_test.cpp new file mode 100644 index 0000000000000000000000000000000000000000..1086afd1dafb66ac300c4b55cb5f3a457d1688ec --- /dev/null +++ b/frameworks/libs/distributeddb/test/unittest/common/store_test/rdb/distracteddb_rdb_multi_user_sync_test.cpp @@ -0,0 +1,141 @@ +/* + * Copyright (c) 2025 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "rdb_general_ut.h" + +namespace DistributedDB { + using namespace testing::ext; + using namespace DistributedDB; + using namespace DistributedDBUnitTest; + +class DistributedDBRDBMultiUserSyncTest : public RDBGeneralUt { +public: + void SetUp() override; +protected: + static constexpr const char *DEVICE_SYNC_TABLE = "DEVICE_SYNC_TABLE"; + static constexpr const char *DEVICE_A = "DEVICE_A"; + static constexpr const char *DEVICE_B = "DEVICE_B"; + static constexpr const char *USER_ID_1 = "userId1"; + static constexpr const char *USER_ID_2 = "userId2"; + static UtDateBaseSchemaInfo GetDefaultSchema(); + static UtTableSchemaInfo GetTableSchema(const std::string &table, bool noPk = false); + static void SetTargetUserId(const std::string &deviceId, const std::string &userId); +}; + +void DistributedDBRDBMultiUserSyncTest::SetUp() +{ + RDBGeneralUt::SetUp(); + RelationalStoreDelegate::Option option; + option.syncDualTupleMode = true; + option.tableMode = DistributedTableMode::COLLABORATION; + SetOption(option); +} + +UtDateBaseSchemaInfo DistributedDBRDBMultiUserSyncTest::GetDefaultSchema() +{ + UtDateBaseSchemaInfo info; + info.tablesInfo.push_back(GetTableSchema(DEVICE_SYNC_TABLE)); + return info; +} + +UtTableSchemaInfo DistributedDBRDBMultiUserSyncTest::GetTableSchema(const std::string &table, bool noPk) +{ + UtTableSchemaInfo tableSchema; + tableSchema.name = table; + UtFieldInfo fieldId; + fieldId.field.colName = "id"; + fieldId.field.type = TYPE_INDEX; + if (!noPk) { + fieldId.field.primary = true; + } + tableSchema.fieldInfo.push_back(fieldId); + UtFieldInfo fieldName; + fieldName.field.colName = "name"; + fieldName.field.type = TYPE_INDEX; + tableSchema.fieldInfo.push_back(fieldName); + return tableSchema; +} + +void DistributedDBRDBMultiUserSyncTest::SetTargetUserId(const std::string &deviceId, const std::string &userId) +{ + ICommunicatorAggregator *communicatorAggregator = nullptr; + RuntimeContext::GetInstance()->GetCommunicatorAggregator(communicatorAggregator); + ASSERT_NE(communicatorAggregator, nullptr); + auto virtualCommunicatorAggregator = static_cast(communicatorAggregator); + auto communicator = static_cast(virtualCommunicatorAggregator->GetCommunicator(deviceId)); + ASSERT_NE(communicator, nullptr); + communicator->SetTargetUserId(userId); +} + +HWTEST_F(DistributedDBRDBMultiUserSyncTest, NormalSyncTest001, TestSize.Level0) +{ + /** + * @tc.steps: step1. Prepare db and data. + * @tc.expected: step1. Ok + */ + StoreInfo deviceAStore1 = {USER_ID_1, APP_ID, STORE_ID_1}; + StoreInfo deviceAStore2 = {USER_ID_2, APP_ID, STORE_ID_2}; + StoreInfo deviceBStore = {USER_ID_1, APP_ID, STORE_ID_3}; + + SetSchemaInfo(deviceAStore1, GetDefaultSchema()); + SetSchemaInfo(deviceAStore2, GetDefaultSchema()); + SetSchemaInfo(deviceBStore, GetDefaultSchema()); + + ASSERT_EQ(BasicUnitTest::InitDelegate(deviceAStore1, DEVICE_A), E_OK); + ASSERT_EQ(BasicUnitTest::InitDelegate(deviceAStore2, DEVICE_A), E_OK); + ASSERT_EQ(BasicUnitTest::InitDelegate(deviceBStore, DEVICE_B), E_OK); + + ASSERT_EQ(SetDistributedTables(deviceAStore1, {DEVICE_SYNC_TABLE}), E_OK); + ASSERT_EQ(SetDistributedTables(deviceAStore2, {DEVICE_SYNC_TABLE}), E_OK); + ASSERT_EQ(SetDistributedTables(deviceBStore, {DEVICE_SYNC_TABLE}), E_OK); + + InsertLocalDBData(0, 1, deviceAStore1); + InsertLocalDBData(0, 1, deviceAStore2); + sqlite3 *dbA2 = GetSqliteHandle(deviceAStore2); + std::string updateSql = "update " + std::string(DEVICE_SYNC_TABLE) + " set name = 'new_name' where id = 0;"; + ASSERT_EQ(SQLiteUtils::ExecuteRawSQL(dbA2, updateSql), E_OK); + + ASSERT_EQ(RDBGeneralUt::CloseDelegate(deviceAStore1), OK); + ASSERT_EQ(RDBGeneralUt::CloseDelegate(deviceAStore2), OK); + /** + * @tc.steps: step2. Sync from db2 of deviceA to deviceB. + * @tc.expected: step2. Ok + */ + ASSERT_EQ(BasicUnitTest::InitDelegate(deviceAStore2, DEVICE_A), E_OK); + SetTargetUserId(DEVICE_A, USER_ID_1); + SetTargetUserId(DEVICE_B, USER_ID_2); + BlockPush(deviceAStore2, deviceBStore, DEVICE_SYNC_TABLE); + ASSERT_EQ(RDBGeneralUt::CloseDelegate(deviceAStore2), OK); + /** + * @tc.steps: step3. Sync from db1 of deviceA to deviceB. + * @tc.expected: step3. Ok + */ + ASSERT_EQ(BasicUnitTest::InitDelegate(deviceAStore1, DEVICE_A), E_OK); + SetTargetUserId(DEVICE_A, USER_ID_1); + SetTargetUserId(DEVICE_B, USER_ID_1); + BlockPush(deviceAStore1, deviceBStore, DEVICE_SYNC_TABLE); + ASSERT_EQ(RDBGeneralUt::CloseDelegate(deviceAStore1), OK); + /** + * @tc.steps: step4. Check data in deviceB. + * @tc.expected: step4. Ok + */ + std::string checkSql = "select count(*) from " + std::string(DEVICE_SYNC_TABLE) + " where name = 'new_name';"; + sqlite3 *dbB = GetSqliteHandle(deviceBStore); + int actualCount = 0; + ASSERT_EQ(SQLiteUtils::GetCountBySql(dbB, checkSql, actualCount), E_OK); + EXPECT_EQ(actualCount, 1); + ASSERT_EQ(RDBGeneralUt::CloseDelegate(deviceBStore), OK); +} +} \ No newline at end of file diff --git a/frameworks/libs/distributeddb/test/unittest/common/syncer/distributeddb_meta_data_test.cpp b/frameworks/libs/distributeddb/test/unittest/common/syncer/distributeddb_meta_data_test.cpp index e8fd625cf7061f8b93b67f1388f16d26ab27c405..f6da76587ab11bd46ab10a568aa014900de5dfc2 100644 --- a/frameworks/libs/distributeddb/test/unittest/common/syncer/distributeddb_meta_data_test.cpp +++ b/frameworks/libs/distributeddb/test/unittest/common/syncer/distributeddb_meta_data_test.cpp @@ -28,6 +28,8 @@ using namespace DistributedDBUnitTest; namespace { constexpr const char *DEVICE_A = "deviceA"; constexpr const char *DEVICE_B = "deviceB"; +constexpr const char *USER_A = "userA"; +constexpr const char *USER_B = "userB"; class DistributedDBMetaDataTest : public testing::Test { public: static void SetUpTestCase(); @@ -104,43 +106,43 @@ HWTEST_F(DistributedDBMetaDataTest, MetadataTest001, TestSize.Level0) * @tc.steps: step1. Check ability sync finish before set mark. * @tc.expected: step1. Default all ability sync finish is false. */ - EXPECT_FALSE(metadata_->IsAbilitySyncFinish(DEVICE_A)); - EXPECT_FALSE(metadata_->IsAbilitySyncFinish(DEVICE_B)); + EXPECT_FALSE(metadata_->IsAbilitySyncFinish(DEVICE_A, "")); + EXPECT_FALSE(metadata_->IsAbilitySyncFinish(DEVICE_B, "")); /** * @tc.steps: step2. Set A ability sync finish. * @tc.expected: step2. A is finish B is not finish. */ - EXPECT_EQ(metadata_->SetAbilitySyncFinishMark(DEVICE_A, true), E_OK); - EXPECT_TRUE(metadata_->IsAbilitySyncFinish(DEVICE_A)); - EXPECT_FALSE(metadata_->IsAbilitySyncFinish(DEVICE_B)); + EXPECT_EQ(metadata_->SetAbilitySyncFinishMark(DEVICE_A, "", true), E_OK); + EXPECT_TRUE(metadata_->IsAbilitySyncFinish(DEVICE_A, "")); + EXPECT_FALSE(metadata_->IsAbilitySyncFinish(DEVICE_B, "")); /** * @tc.steps: step3. Set B ability sync finish. * @tc.expected: step3. A and B is finish. */ - EXPECT_EQ(metadata_->SetAbilitySyncFinishMark(DEVICE_B, true), E_OK); - EXPECT_TRUE(metadata_->IsAbilitySyncFinish(DEVICE_A)); - EXPECT_TRUE(metadata_->IsAbilitySyncFinish(DEVICE_B)); + EXPECT_EQ(metadata_->SetAbilitySyncFinishMark(DEVICE_B, "", true), E_OK); + EXPECT_TRUE(metadata_->IsAbilitySyncFinish(DEVICE_A, "")); + EXPECT_TRUE(metadata_->IsAbilitySyncFinish(DEVICE_B, "")); /** * @tc.steps: step4. Set A ability sync not finish. * @tc.expected: step4. A is not finish B is finish. */ - EXPECT_EQ(metadata_->SetAbilitySyncFinishMark(DEVICE_A, false), E_OK); - EXPECT_FALSE(metadata_->IsAbilitySyncFinish(DEVICE_A)); - EXPECT_TRUE(metadata_->IsAbilitySyncFinish(DEVICE_B)); + EXPECT_EQ(metadata_->SetAbilitySyncFinishMark(DEVICE_A, "", false), E_OK); + EXPECT_FALSE(metadata_->IsAbilitySyncFinish(DEVICE_A, "")); + EXPECT_TRUE(metadata_->IsAbilitySyncFinish(DEVICE_B, "")); /** * @tc.steps: step5. Clear all time sync finish. * @tc.expected: step5. A and B is finish. */ EXPECT_EQ(metadata_->ClearAllTimeSyncFinishMark(), E_OK); - EXPECT_FALSE(metadata_->IsAbilitySyncFinish(DEVICE_A)); - EXPECT_TRUE(metadata_->IsAbilitySyncFinish(DEVICE_B)); + EXPECT_FALSE(metadata_->IsAbilitySyncFinish(DEVICE_A, "")); + EXPECT_TRUE(metadata_->IsAbilitySyncFinish(DEVICE_B, "")); /** * @tc.steps: step6. Clear all ability sync finish. * @tc.expected: step6. A and B is not finish. */ EXPECT_EQ(metadata_->ClearAllAbilitySyncFinishMark(), E_OK); - EXPECT_FALSE(metadata_->IsAbilitySyncFinish(DEVICE_A)); - EXPECT_FALSE(metadata_->IsAbilitySyncFinish(DEVICE_B)); + EXPECT_FALSE(metadata_->IsAbilitySyncFinish(DEVICE_A, "")); + EXPECT_FALSE(metadata_->IsAbilitySyncFinish(DEVICE_B, "")); } /** @@ -156,36 +158,36 @@ HWTEST_F(DistributedDBMetaDataTest, MetadataTest002, TestSize.Level0) * @tc.steps: step1. Check time sync finish before set mark. * @tc.expected: step1. Default all time sync finish is false. */ - EXPECT_FALSE(metadata_->IsTimeSyncFinish(DEVICE_A)); - EXPECT_FALSE(metadata_->IsTimeSyncFinish(DEVICE_B)); + EXPECT_FALSE(metadata_->IsTimeSyncFinish(DEVICE_A, "")); + EXPECT_FALSE(metadata_->IsTimeSyncFinish(DEVICE_B, "")); /** * @tc.steps: step2. Set A time sync finish. * @tc.expected: step2. A is finish B is not finish. */ - EXPECT_EQ(metadata_->SetTimeSyncFinishMark(DEVICE_A, true), E_OK); - EXPECT_TRUE(metadata_->IsTimeSyncFinish(DEVICE_A)); - EXPECT_FALSE(metadata_->IsTimeSyncFinish(DEVICE_B)); + EXPECT_EQ(metadata_->SetTimeSyncFinishMark(DEVICE_A, "", true), E_OK); + EXPECT_TRUE(metadata_->IsTimeSyncFinish(DEVICE_A, "")); + EXPECT_FALSE(metadata_->IsTimeSyncFinish(DEVICE_B, "")); /** * @tc.steps: step3. Set B time sync finish. * @tc.expected: step3. A and B is finish. */ - EXPECT_EQ(metadata_->SetTimeSyncFinishMark(DEVICE_B, true), E_OK); - EXPECT_TRUE(metadata_->IsTimeSyncFinish(DEVICE_A)); - EXPECT_TRUE(metadata_->IsTimeSyncFinish(DEVICE_B)); + EXPECT_EQ(metadata_->SetTimeSyncFinishMark(DEVICE_B, "", true), E_OK); + EXPECT_TRUE(metadata_->IsTimeSyncFinish(DEVICE_A, "")); + EXPECT_TRUE(metadata_->IsTimeSyncFinish(DEVICE_B, "")); /** * @tc.steps: step4. Set A time sync not finish. * @tc.expected: step4. A is not finish B is finish. */ - EXPECT_EQ(metadata_->SetTimeSyncFinishMark(DEVICE_A, false), E_OK); - EXPECT_FALSE(metadata_->IsTimeSyncFinish(DEVICE_A)); - EXPECT_TRUE(metadata_->IsTimeSyncFinish(DEVICE_B)); + EXPECT_EQ(metadata_->SetTimeSyncFinishMark(DEVICE_A, "", false), E_OK); + EXPECT_FALSE(metadata_->IsTimeSyncFinish(DEVICE_A, "")); + EXPECT_TRUE(metadata_->IsTimeSyncFinish(DEVICE_B, "")); /** * @tc.steps: step5. Clear all time sync finish. * @tc.expected: step5. A and B is not finish. */ EXPECT_EQ(metadata_->ClearAllTimeSyncFinishMark(), E_OK); - EXPECT_FALSE(metadata_->IsTimeSyncFinish(DEVICE_A)); - EXPECT_FALSE(metadata_->IsTimeSyncFinish(DEVICE_B)); + EXPECT_FALSE(metadata_->IsTimeSyncFinish(DEVICE_A, "")); + EXPECT_FALSE(metadata_->IsTimeSyncFinish(DEVICE_B, "")); } /** @@ -201,22 +203,22 @@ HWTEST_F(DistributedDBMetaDataTest, MetadataTest003, TestSize.Level0) * @tc.steps: step1. Check remote schema version before set version. * @tc.expected: step1. Default all version is zero. */ - EXPECT_EQ(metadata_->GetRemoteSchemaVersion(DEVICE_A), 0u); - EXPECT_EQ(metadata_->GetRemoteSchemaVersion(DEVICE_B), 0u); + EXPECT_EQ(metadata_->GetRemoteSchemaVersion(DEVICE_A, ""), 0u); + EXPECT_EQ(metadata_->GetRemoteSchemaVersion(DEVICE_B, ""), 0u); /** * @tc.steps: step2. Set A schema version. * @tc.expected: step2. A is finish B is not finish. */ - EXPECT_EQ(metadata_->SetRemoteSchemaVersion(DEVICE_A, SOFTWARE_VERSION_CURRENT), E_OK); - EXPECT_EQ(metadata_->GetRemoteSchemaVersion(DEVICE_A), SOFTWARE_VERSION_CURRENT); - EXPECT_EQ(metadata_->GetRemoteSchemaVersion(DEVICE_B), 0u); + EXPECT_EQ(metadata_->SetRemoteSchemaVersion(DEVICE_A, "", SOFTWARE_VERSION_CURRENT), E_OK); + EXPECT_EQ(metadata_->GetRemoteSchemaVersion(DEVICE_A, ""), SOFTWARE_VERSION_CURRENT); + EXPECT_EQ(metadata_->GetRemoteSchemaVersion(DEVICE_B, ""), 0u); /** * @tc.steps: step3. Clear all ability sync finish. * @tc.expected: step3. A and B version is zero. */ EXPECT_EQ(metadata_->ClearAllAbilitySyncFinishMark(), E_OK); - EXPECT_EQ(metadata_->GetRemoteSchemaVersion(DEVICE_A), 0u); - EXPECT_EQ(metadata_->GetRemoteSchemaVersion(DEVICE_B), 0u); + EXPECT_EQ(metadata_->GetRemoteSchemaVersion(DEVICE_A, ""), 0u); + EXPECT_EQ(metadata_->GetRemoteSchemaVersion(DEVICE_B, ""), 0u); } /** @@ -232,23 +234,23 @@ HWTEST_F(DistributedDBMetaDataTest, MetadataTest004, TestSize.Level0) * @tc.steps: step1. Check remote schema version before set version. * @tc.expected: step1. Default all version is zero. */ - EXPECT_EQ(metadata_->GetSystemTimeOffset(DEVICE_A), 0u); - EXPECT_EQ(metadata_->GetSystemTimeOffset(DEVICE_B), 0u); + EXPECT_EQ(metadata_->GetSystemTimeOffset(DEVICE_A, ""), 0u); + EXPECT_EQ(metadata_->GetSystemTimeOffset(DEVICE_B, ""), 0u); /** * @tc.steps: step2. Set A schema version. * @tc.expected: step2. A is finish B is not finish. */ const int64_t offset = 100u; - EXPECT_EQ(metadata_->SetSystemTimeOffset(DEVICE_A, offset), E_OK); - EXPECT_EQ(metadata_->GetSystemTimeOffset(DEVICE_A), offset); - EXPECT_EQ(metadata_->GetSystemTimeOffset(DEVICE_B), 0u); + EXPECT_EQ(metadata_->SetSystemTimeOffset(DEVICE_A, "", offset), E_OK); + EXPECT_EQ(metadata_->GetSystemTimeOffset(DEVICE_A, ""), offset); + EXPECT_EQ(metadata_->GetSystemTimeOffset(DEVICE_B, ""), 0u); /** * @tc.steps: step3. Clear all time sync finish. * @tc.expected: step3. A and B system time offset is zero. */ EXPECT_EQ(metadata_->ClearAllTimeSyncFinishMark(), E_OK); - EXPECT_EQ(metadata_->GetSystemTimeOffset(DEVICE_A), 0u); - EXPECT_EQ(metadata_->GetSystemTimeOffset(DEVICE_B), 0u); + EXPECT_EQ(metadata_->GetSystemTimeOffset(DEVICE_A, ""), 0u); + EXPECT_EQ(metadata_->GetSystemTimeOffset(DEVICE_B, ""), 0u); } /** @@ -290,7 +292,8 @@ HWTEST_F(DistributedDBMetaDataTest, MetadataTest006, TestSize.Level0) * @tc.steps: step1. Set storage ability sync finish. * @tc.expected: step1. A is finish. */ - std::string hashDeviceId = DBConstant::DEVICEID_PREFIX_KEY + DBCommon::TransferHashString(DEVICE_A); + std::string hashDeviceId = DBConstant::DEVICEID_PREFIX_KEY + DBCommon::TransferHashString(DEVICE_A) + + DBConstant::USERID_PREFIX_KEY + ""; MetaDataValue metaDataValue; GetMetaDataValue(hashDeviceId, metaDataValue); EXPECT_EQ(metaDataValue.syncMark & static_cast(SyncMark::SYNC_MARK_ABILITY_SYNC), 0u); @@ -300,13 +303,13 @@ HWTEST_F(DistributedDBMetaDataTest, MetadataTest006, TestSize.Level0) * @tc.steps: step2. Check ability sync finish by meta. * @tc.expected: step2. A is finish because meta data is loaded from db. */ - EXPECT_TRUE(metadata_->IsAbilitySyncFinish(DEVICE_A)); + EXPECT_TRUE(metadata_->IsAbilitySyncFinish(DEVICE_A, "")); /** * @tc.steps: step3. Erase water mark and check again. * @tc.expected: step3. A is finish because meta data is loaded from db. */ EXPECT_EQ(metadata_->EraseDeviceWaterMark(DEVICE_A, true), E_OK); - EXPECT_TRUE(metadata_->IsAbilitySyncFinish(DEVICE_A)); + EXPECT_TRUE(metadata_->IsAbilitySyncFinish(DEVICE_A, "")); } /** @@ -323,7 +326,7 @@ HWTEST_F(DistributedDBMetaDataTest, MetadataTest007, TestSize.Level0) * @tc.expected: step1. B is change because of time change. */ RuntimeContext::GetInstance()->SetTimeChanged(true); - EXPECT_TRUE(metadata_->IsTimeChange(DEVICE_B)); + EXPECT_TRUE(metadata_->IsTimeChange(DEVICE_B, "")); RuntimeContext::GetInstance()->SetTimeChanged(false); RuntimeContext::GetInstance()->StopTimeTickMonitorIfNeed(); } @@ -376,9 +379,512 @@ HWTEST_F(DistributedDBMetaDataTest, MetadataTest009, TestSize.Level0) * @tc.expected: step1. B is change because of time change. */ RuntimeContext::GetInstance()->SetTimeChanged(true); - EXPECT_EQ(metadata_->SetDbCreateTime(DEVICE_B, 10u, true), E_OK); - EXPECT_TRUE(metadata_->IsTimeChange(DEVICE_B)); + EXPECT_EQ(metadata_->SetDbCreateTime(DEVICE_B, "", 10u, true), E_OK); + EXPECT_TRUE(metadata_->IsTimeChange(DEVICE_B, "")); RuntimeContext::GetInstance()->SetTimeChanged(false); RuntimeContext::GetInstance()->StopTimeTickMonitorIfNeed(); } -} \ No newline at end of file + +/** + * @tc.name: MetadataTest010 + * @tc.desc: Test metadata set and get ability sync mark. + * @tc.type: FUNC + * @tc.require: + * @tc.author: suyue + */ +HWTEST_F(DistributedDBMetaDataTest, MetadataTest010, TestSize.Level0) +{ + /** + * @tc.steps: step1. Check ability sync finish before set mark. + * @tc.expected: step1. Default all ability sync finish is false. + */ + EXPECT_FALSE(metadata_->IsAbilitySyncFinish(DEVICE_A, USER_A)); + EXPECT_FALSE(metadata_->IsAbilitySyncFinish(DEVICE_A, USER_B)); + /** + * @tc.steps: step2. Set user A ability sync finish. + * @tc.expected: step2. user A is finish user B is not finish. + */ + EXPECT_EQ(metadata_->SetAbilitySyncFinishMark(DEVICE_A, USER_A, true), E_OK); + EXPECT_TRUE(metadata_->IsAbilitySyncFinish(DEVICE_A, USER_A)); + EXPECT_FALSE(metadata_->IsAbilitySyncFinish(DEVICE_A, USER_B)); + /** + * @tc.steps: step3. Set user B ability sync finish. + * @tc.expected: step3. user A and user B is finish. + */ + EXPECT_EQ(metadata_->SetAbilitySyncFinishMark(DEVICE_A, USER_B, true), E_OK); + EXPECT_TRUE(metadata_->IsAbilitySyncFinish(DEVICE_A, USER_A)); + EXPECT_TRUE(metadata_->IsAbilitySyncFinish(DEVICE_A, USER_B)); + /** + * @tc.steps: step4. Set user A ability sync not finish. + * @tc.expected: step4. user A is not finish user B is finish. + */ + EXPECT_EQ(metadata_->SetAbilitySyncFinishMark(DEVICE_A, USER_A, false), E_OK); + EXPECT_FALSE(metadata_->IsAbilitySyncFinish(DEVICE_A, USER_A)); + EXPECT_TRUE(metadata_->IsAbilitySyncFinish(DEVICE_A, USER_B)); + /** + * @tc.steps: step5. Clear all time sync finish. + * @tc.expected: step5. user A and user B unchanged. + */ + EXPECT_EQ(metadata_->ClearAllTimeSyncFinishMark(), E_OK); + EXPECT_FALSE(metadata_->IsAbilitySyncFinish(DEVICE_A, USER_A)); + EXPECT_TRUE(metadata_->IsAbilitySyncFinish(DEVICE_A, USER_B)); + /** + * @tc.steps: step6. Clear all ability sync finish. + * @tc.expected: step6. user A and user B is not finish. + */ + EXPECT_EQ(metadata_->ClearAllAbilitySyncFinishMark(), E_OK); + EXPECT_FALSE(metadata_->IsAbilitySyncFinish(DEVICE_A, USER_A)); + EXPECT_FALSE(metadata_->IsAbilitySyncFinish(DEVICE_A, USER_B)); +} + +/** + * @tc.name: MetadataTest011 + * @tc.desc: Test metadata set and get time sync mark. + * @tc.type: FUNC + * @tc.require: + * @tc.author: suyue + */ +HWTEST_F(DistributedDBMetaDataTest, MetadataTest011, TestSize.Level0) +{ + /** + * @tc.steps: step1. Check time sync finish before set mark. + * @tc.expected: step1. Default all time sync finish is false. + */ + EXPECT_FALSE(metadata_->IsTimeSyncFinish(DEVICE_A, USER_A)); + EXPECT_FALSE(metadata_->IsTimeSyncFinish(DEVICE_A, USER_B)); + /** + * @tc.steps: step2. Set user A time sync finish. + * @tc.expected: step2. user A is finish user B is not finish. + */ + EXPECT_EQ(metadata_->SetTimeSyncFinishMark(DEVICE_A, USER_A, true), E_OK); + EXPECT_TRUE(metadata_->IsTimeSyncFinish(DEVICE_A, USER_A)); + EXPECT_FALSE(metadata_->IsTimeSyncFinish(DEVICE_A, USER_B)); + /** + * @tc.steps: step3. Set user B time sync finish. + * @tc.expected: step3. user A and user B is finish. + */ + EXPECT_EQ(metadata_->SetTimeSyncFinishMark(DEVICE_A, USER_B, true), E_OK); + EXPECT_TRUE(metadata_->IsTimeSyncFinish(DEVICE_A, USER_A)); + EXPECT_TRUE(metadata_->IsTimeSyncFinish(DEVICE_A, USER_B)); + /** + * @tc.steps: step4. Set user A time sync not finish. + * @tc.expected: step4. user A is not finish user B is finish. + */ + EXPECT_EQ(metadata_->SetTimeSyncFinishMark(DEVICE_A, USER_A, false), E_OK); + EXPECT_FALSE(metadata_->IsTimeSyncFinish(DEVICE_A, USER_A)); + EXPECT_TRUE(metadata_->IsTimeSyncFinish(DEVICE_A, USER_B)); + /** + * @tc.steps: step5. Clear all time sync finish. + * @tc.expected: step5. user A and user B is not finish. + */ + EXPECT_EQ(metadata_->ClearAllTimeSyncFinishMark(), E_OK); + EXPECT_FALSE(metadata_->IsTimeSyncFinish(DEVICE_A, USER_A)); + EXPECT_FALSE(metadata_->IsTimeSyncFinish(DEVICE_A, USER_B)); +} + +/** + * @tc.name: MetadataTest012 + * @tc.desc: Test metadata set remote schema version. + * @tc.type: FUNC + * @tc.require: + * @tc.author: suyue + */ +HWTEST_F(DistributedDBMetaDataTest, MetadataTest012, TestSize.Level0) +{ + /** + * @tc.steps: step1. Check remote schema version before set version. + * @tc.expected: step1. Default all version is zero. + */ + EXPECT_EQ(metadata_->GetRemoteSchemaVersion(DEVICE_A, USER_A), 0u); + EXPECT_EQ(metadata_->GetRemoteSchemaVersion(DEVICE_A, USER_B), 0u); + /** + * @tc.steps: step2. Set user A schema version. + * @tc.expected: step2. user A is finish user B is not finish. + */ + EXPECT_EQ(metadata_->SetRemoteSchemaVersion(DEVICE_A, USER_A, SOFTWARE_VERSION_CURRENT), E_OK); + EXPECT_EQ(metadata_->GetRemoteSchemaVersion(DEVICE_A, USER_A), SOFTWARE_VERSION_CURRENT); + EXPECT_EQ(metadata_->GetRemoteSchemaVersion(DEVICE_A, USER_B), 0u); + /** + * @tc.steps: step3. Clear all ability sync finish. + * @tc.expected: step3. user A and user B version is zero. + */ + EXPECT_EQ(metadata_->ClearAllAbilitySyncFinishMark(), E_OK); + EXPECT_EQ(metadata_->GetRemoteSchemaVersion(DEVICE_A, USER_A), 0u); + EXPECT_EQ(metadata_->GetRemoteSchemaVersion(DEVICE_A, USER_B), 0u); +} + +/** + * @tc.name: MetadataTest013 + * @tc.desc: Test metadata set remote system time off set. + * @tc.type: FUNC + * @tc.require: + * @tc.author: suyue + */ +HWTEST_F(DistributedDBMetaDataTest, MetadataTest013, TestSize.Level0) +{ + /** + * @tc.steps: step1. Check remote schema version before set version. + * @tc.expected: step1. Default all version is zero. + */ + EXPECT_EQ(metadata_->GetSystemTimeOffset(DEVICE_A, USER_A), 0u); + EXPECT_EQ(metadata_->GetSystemTimeOffset(DEVICE_A, USER_B), 0u); + /** + * @tc.steps: step2. Set user A schema version. + * @tc.expected: step2. user A is finish user B is not finish. + */ + const int64_t offset = 100u; + EXPECT_EQ(metadata_->SetSystemTimeOffset(DEVICE_A, USER_A, offset), E_OK); + EXPECT_EQ(metadata_->GetSystemTimeOffset(DEVICE_A, USER_A), offset); + EXPECT_EQ(metadata_->GetSystemTimeOffset(DEVICE_A, USER_B), 0u); + /** + * @tc.steps: step3. Clear all time sync finish. + * @tc.expected: step3. user A and user B system time offset is zero. + */ + EXPECT_EQ(metadata_->ClearAllTimeSyncFinishMark(), E_OK); + EXPECT_EQ(metadata_->GetSystemTimeOffset(DEVICE_A, USER_A), 0u); + EXPECT_EQ(metadata_->GetSystemTimeOffset(DEVICE_A, USER_B), 0u); +} + +/** + * @tc.name: MetadataTest014 + * @tc.desc: Test metadata remove device data with reload. + * @tc.type: FUNC + * @tc.require: + * @tc.author: suyue + */ +HWTEST_F(DistributedDBMetaDataTest, MetadataTest014, TestSize.Level0) +{ + /** + * @tc.steps: step1. Set storage ability sync finish. + * @tc.expected: step1. user A and B finish. + */ + EXPECT_FALSE(metadata_->IsAbilitySyncFinish(DEVICE_A, USER_A)); + EXPECT_FALSE(metadata_->IsAbilitySyncFinish(DEVICE_A, USER_B)); + + /** + * @tc.steps: step2. Check ability sync finish by meta. + * @tc.expected: step2. user A and B is finish because meta data is loaded from db. + */ + std::string hashDeviceIdA = DBConstant::DEVICEID_PREFIX_KEY + DBCommon::TransferHashString(DEVICE_A) + + DBConstant::USERID_PREFIX_KEY + USER_A; + MetaDataValue metaDataValueA; + GetMetaDataValue(hashDeviceIdA, metaDataValueA); + EXPECT_EQ(metaDataValueA.syncMark & static_cast(SyncMark::SYNC_MARK_ABILITY_SYNC), 0u); + metaDataValueA.syncMark = static_cast(SyncMark::SYNC_MARK_ABILITY_SYNC); + PutMetaDataValue(hashDeviceIdA, metaDataValueA); + + std::string hashDeviceIdB = DBConstant::DEVICEID_PREFIX_KEY + DBCommon::TransferHashString(DEVICE_A) + + DBConstant::USERID_PREFIX_KEY + USER_B; + MetaDataValue metaDataValueB; + GetMetaDataValue(hashDeviceIdB, metaDataValueB); + EXPECT_EQ(metaDataValueB.syncMark & static_cast(SyncMark::SYNC_MARK_ABILITY_SYNC), 0u); + metaDataValueB.syncMark = static_cast(SyncMark::SYNC_MARK_ABILITY_SYNC); + PutMetaDataValue(hashDeviceIdB, metaDataValueB); + + EXPECT_TRUE(metadata_->IsAbilitySyncFinish(DEVICE_A, USER_A)); + EXPECT_TRUE(metadata_->IsAbilitySyncFinish(DEVICE_A, USER_B)); + + /** + * @tc.steps: step3. Erase water mark and check again. + * @tc.expected: step3. user A and B is finish because meta data is loaded from db. + */ + EXPECT_EQ(metadata_->EraseDeviceWaterMark(DEVICE_A, true), E_OK); + EXPECT_TRUE(metadata_->IsAbilitySyncFinish(DEVICE_A, USER_A)); + EXPECT_TRUE(metadata_->IsAbilitySyncFinish(DEVICE_A, USER_B)); +} + +/** + * @tc.name: MetadataTest015 + * @tc.desc: Test metadata init with time change if need. + * @tc.type: FUNC + * @tc.require: + * @tc.author: suyue + */ +HWTEST_F(DistributedDBMetaDataTest, MetadataTest015, TestSize.Level0) +{ + /** + * @tc.steps: step1. Check time sync finish by meta. + * @tc.expected: step1. user A and B is change because of time change. + */ + RuntimeContext::GetInstance()->SetTimeChanged(true); + EXPECT_TRUE(metadata_->IsTimeChange(DEVICE_B, USER_A)); + EXPECT_TRUE(metadata_->IsTimeChange(DEVICE_B, USER_B)); + RuntimeContext::GetInstance()->SetTimeChanged(false); + RuntimeContext::GetInstance()->StopTimeTickMonitorIfNeed(); +} + +/** + * @tc.name: MetadataTest016 + * @tc.desc: Test metaData init correctly + * @tc.type: FUNC + * @tc.require: + * @tc.author: suyue + */ +HWTEST_F(DistributedDBMetaDataTest, MetadataTest016, TestSize.Level1) +{ + /** + * @tc.steps: step1. init meta data + * @tc.expected: step1. E_OK + */ + Metadata meta; + VirtualSingleVerSyncDBInterface storage; + WaterMark setWaterMark = 1; + ASSERT_EQ(meta.Initialize(&storage), E_OK); + + /** + * @tc.steps: step2. meta save and get waterMark + * @tc.expected: step2. expect get the same waterMark + */ + EXPECT_EQ(meta.SaveLocalWaterMark(DEVICE_A, USER_A, setWaterMark), E_OK); + EXPECT_EQ(meta.SaveLocalWaterMark(DEVICE_A, USER_B, setWaterMark), E_OK); + WaterMark getWaterMark = 0; + meta.GetLocalWaterMark(DEVICE_A, USER_A, getWaterMark); + EXPECT_EQ(getWaterMark, setWaterMark); + meta.GetLocalWaterMark(DEVICE_A, USER_B, getWaterMark); + EXPECT_EQ(getWaterMark, setWaterMark); + + /** + * @tc.steps: step3. init again + * @tc.expected: step3. E_OK + */ + Metadata anotherMeta; + ASSERT_EQ(anotherMeta.Initialize(&storage), E_OK); + + /** + * @tc.steps: step4. get waterMark again + * @tc.expected: step4. expect get the same waterMark + */ + anotherMeta.GetLocalWaterMark(DEVICE_A, USER_A, getWaterMark); + EXPECT_EQ(getWaterMark, setWaterMark); + anotherMeta.GetLocalWaterMark(DEVICE_A, USER_B, getWaterMark); + EXPECT_EQ(getWaterMark, setWaterMark); +} + +/** + * @tc.name: MetadataTest017 + * @tc.desc: Test metaData save and get queryWaterMark. + * @tc.type: FUNC + * @tc.require: + * @tc.author: suyue + */ +HWTEST_F(DistributedDBMetaDataTest, MetadataTest017, TestSize.Level1) +{ + /** + * @tc.steps: step1. save receive and send watermark + * @tc.expected: step1. E_OK + */ + WaterMark w1 = 1; + EXPECT_EQ(metadata_->SetRecvQueryWaterMark("Q1", DEVICE_A, USER_A, w1), E_OK); + EXPECT_EQ(metadata_->SetSendQueryWaterMark("Q1", DEVICE_A, USER_A, w1), E_OK); + WaterMark w2 = 2; + EXPECT_EQ(metadata_->SetRecvQueryWaterMark("Q1", DEVICE_A, USER_B, w2), E_OK); + EXPECT_EQ(metadata_->SetSendQueryWaterMark("Q1", DEVICE_A, USER_B, w2), E_OK); + /** + * @tc.steps: step2. get receive and send watermark + * @tc.expected: step2. E_OK and get the latest value + */ + WaterMark w = 0; + EXPECT_EQ(metadata_->GetRecvQueryWaterMark("Q1", DEVICE_A, USER_A, w), E_OK); + EXPECT_EQ(w1, w); + EXPECT_EQ(metadata_->GetSendQueryWaterMark("Q1", DEVICE_A, USER_A, w), E_OK); + EXPECT_EQ(w1, w); + EXPECT_EQ(metadata_->GetRecvQueryWaterMark("Q1", DEVICE_A, USER_B, w), E_OK); + EXPECT_EQ(w2, w); + EXPECT_EQ(metadata_->GetSendQueryWaterMark("Q1", DEVICE_A, USER_B, w), E_OK); + EXPECT_EQ(w2, w); + /** + * @tc.steps: step3. set peer and local watermark + * @tc.expected: step3. E_OK + */ + WaterMark w3 = 3; + EXPECT_EQ(metadata_->SaveLocalWaterMark(DEVICE_A, USER_A, w3), E_OK); + EXPECT_EQ(metadata_->SavePeerWaterMark(DEVICE_A, USER_A, w3, true), E_OK); + WaterMark w4 = 4; + EXPECT_EQ(metadata_->SaveLocalWaterMark(DEVICE_A, USER_B, w4), E_OK); + EXPECT_EQ(metadata_->SavePeerWaterMark(DEVICE_A, USER_B, w4, true), E_OK); + /** + * @tc.steps: step4. get receive and send watermark + * @tc.expected: step4. E_OK and get the w1 + */ + EXPECT_EQ(metadata_->GetRecvQueryWaterMark("Q1", DEVICE_A, USER_A, w), E_OK); + EXPECT_EQ(w3, w); + EXPECT_EQ(metadata_->GetSendQueryWaterMark("Q1", DEVICE_A, USER_A, w), E_OK); + EXPECT_EQ(w3, w); + EXPECT_EQ(metadata_->GetRecvQueryWaterMark("Q1", DEVICE_A, USER_B, w), E_OK); + EXPECT_EQ(w4, w); + EXPECT_EQ(metadata_->GetSendQueryWaterMark("Q1", DEVICE_A, USER_B, w), E_OK); + EXPECT_EQ(w4, w); + /** + * @tc.steps: step5. set peer and local watermark + * @tc.expected: step5. E_OK + */ + WaterMark w5 = 5; + EXPECT_EQ(metadata_->SaveLocalWaterMark(DEVICE_B, USER_A, w5), E_OK); + EXPECT_EQ(metadata_->SavePeerWaterMark(DEVICE_B, USER_A, w5, true), E_OK); + WaterMark w6 = 6; + EXPECT_EQ(metadata_->SaveLocalWaterMark(DEVICE_B, USER_B, w6), E_OK); + EXPECT_EQ(metadata_->SavePeerWaterMark(DEVICE_B, USER_B, w6, true), E_OK); + /** + * @tc.steps: step6. get receive and send watermark + * @tc.expected: step6. E_OK and get the w3 + */ + EXPECT_EQ(metadata_->GetRecvQueryWaterMark("Q2", DEVICE_B, USER_A, w), E_OK); + EXPECT_EQ(w5, w); + EXPECT_EQ(metadata_->GetSendQueryWaterMark("Q2", DEVICE_B, USER_A, w), E_OK); + EXPECT_EQ(w5, w); + EXPECT_EQ(metadata_->GetRecvQueryWaterMark("Q2", DEVICE_B, USER_B, w), E_OK); + EXPECT_EQ(w6, w); + EXPECT_EQ(metadata_->GetSendQueryWaterMark("Q2", DEVICE_B, USER_B, w), E_OK); + EXPECT_EQ(w6, w); + /** + * @tc.steps: step7. get not exit receive and send watermark + * @tc.expected: step7. E_OK and get the 0 + */ + EXPECT_EQ(metadata_->GetRecvQueryWaterMark("Q3", "D3", "U3", w), E_OK); + EXPECT_EQ(w, 0u); + EXPECT_EQ(metadata_->GetSendQueryWaterMark("Q3", "D3", "U3", w), E_OK); + EXPECT_EQ(w, 0u); +} + +/** + * @tc.name: MetadataTest018 + * @tc.desc: Test metaData get and set dbCreateTime. + * @tc.type: FUNC + * @tc.require: + * @tc.author: suyue + */ +HWTEST_F(DistributedDBMetaDataTest, MetadataTest018, TestSize.Level1) +{ + /** + * @tc.steps: step1. set dbCreateTime + * @tc.expected: step1. E_OK + */ + EXPECT_EQ(metadata_->SetDbCreateTime(DEVICE_A, USER_A, 10u, true), E_OK); + EXPECT_EQ(metadata_->SetDbCreateTime(DEVICE_A, USER_B, 20u, true), E_OK); + /** + * @tc.steps: step2. check dbCreateTime + * @tc.expected: step2. E_OK + */ + uint64_t curDbCreatTime = 0; + metadata_->GetDbCreateTime(DEVICE_A, USER_A, curDbCreatTime); + EXPECT_EQ(curDbCreatTime, 10u); + metadata_->GetDbCreateTime(DEVICE_A, USER_B, curDbCreatTime); + EXPECT_EQ(curDbCreatTime, 20u); + /** + * @tc.steps: step3. user A change dbCreateTime and check + * @tc.expected: step3. E_OK + */ + EXPECT_EQ(metadata_->SetDbCreateTime(DEVICE_A, USER_A, 30u, true), E_OK); + uint64_t clearDeviceDataMark = INT_MAX; + metadata_->GetRemoveDataMark(DEVICE_A, USER_A, clearDeviceDataMark); + EXPECT_EQ(clearDeviceDataMark, 1u); + EXPECT_EQ(metadata_->ResetMetaDataAfterRemoveData(DEVICE_A, USER_A), E_OK); + metadata_->GetRemoveDataMark(DEVICE_A, USER_A, clearDeviceDataMark); + EXPECT_EQ(clearDeviceDataMark, 0u); + metadata_->GetDbCreateTime(DEVICE_A, USER_A, curDbCreatTime); + EXPECT_EQ(curDbCreatTime, 30u); + + /** + * @tc.steps: step4. user B unchanged dbCreateTime and check + * @tc.expected: step4. E_OK + */ + metadata_->GetRemoveDataMark(DEVICE_A, USER_B, clearDeviceDataMark); + EXPECT_EQ(clearDeviceDataMark, 0u); + metadata_->GetDbCreateTime(DEVICE_A, USER_B, curDbCreatTime); + EXPECT_EQ(curDbCreatTime, 20u); +} + +/** + * @tc.name: MetadataTest019 + * @tc.desc: Test metaData save and get deleteWaterMark. + * @tc.type: FUNC + * @tc.require: + * @tc.author: suyue + */ +HWTEST_F(DistributedDBMetaDataTest, MetadataTest019, TestSize.Level1) +{ + /** + * @tc.steps: step1. save receive and send watermark + * @tc.expected: step1. E_OK + */ + WaterMark w1 = 1; + EXPECT_EQ(metadata_->SetRecvDeleteSyncWaterMark(DEVICE_A, USER_A, w1), E_OK); + EXPECT_EQ(metadata_->SetSendDeleteSyncWaterMark(DEVICE_A, USER_A, w1), E_OK); + WaterMark w2 = 2; + EXPECT_EQ(metadata_->SetRecvDeleteSyncWaterMark(DEVICE_A, USER_B, w2), E_OK); + EXPECT_EQ(metadata_->SetSendDeleteSyncWaterMark(DEVICE_A, USER_B, w2), E_OK); + + /** + * @tc.steps: step2. get receive and send watermark + * @tc.expected: step2. E_OK and get the latest value + */ + WaterMark w = 0; + EXPECT_EQ(metadata_->GetRecvDeleteSyncWaterMark(DEVICE_A, USER_A, w), E_OK); + EXPECT_EQ(w1, w); + EXPECT_EQ(metadata_->GetSendDeleteSyncWaterMark(DEVICE_A, USER_A, w), E_OK); + EXPECT_EQ(w1, w); + EXPECT_EQ(metadata_->GetRecvDeleteSyncWaterMark(DEVICE_A, USER_B, w), E_OK); + EXPECT_EQ(w2, w); + EXPECT_EQ(metadata_->GetSendDeleteSyncWaterMark(DEVICE_A, USER_B, w), E_OK); + EXPECT_EQ(w2, w); + + /** + * @tc.steps: step3. set peer and local watermark + * @tc.expected: step3. E_OK + */ + WaterMark w3 = 3; + WaterMark w4 = 4; + EXPECT_EQ(metadata_->SaveLocalWaterMark(DEVICE_A, USER_A, w3), E_OK); + EXPECT_EQ(metadata_->SavePeerWaterMark(DEVICE_A, USER_A, w4, true), E_OK); + WaterMark w5 = 5; + WaterMark w6 = 6; + EXPECT_EQ(metadata_->SaveLocalWaterMark(DEVICE_A, USER_B, w5), E_OK); + EXPECT_EQ(metadata_->SavePeerWaterMark(DEVICE_A, USER_B, w6, true), E_OK); + + /** + * @tc.steps: step4. get receive and send watermark + * @tc.expected: step4. E_OK and get the w1 + */ + EXPECT_EQ(metadata_->GetSendDeleteSyncWaterMark(DEVICE_A, USER_A, w), E_OK); + EXPECT_EQ(w3, w); + EXPECT_EQ(metadata_->GetRecvDeleteSyncWaterMark(DEVICE_A, USER_A, w), E_OK); + EXPECT_EQ(w4, w); + EXPECT_EQ(metadata_->GetSendDeleteSyncWaterMark(DEVICE_A, USER_B, w), E_OK); + EXPECT_EQ(w5, w); + EXPECT_EQ(metadata_->GetRecvDeleteSyncWaterMark(DEVICE_A, USER_B, w), E_OK); + EXPECT_EQ(w6, w); + + /** + * @tc.steps: step5. set peer and local watermark + * @tc.expected: step5. E_OK + */ + WaterMark w7 = 7; + EXPECT_EQ(metadata_->SaveLocalWaterMark(DEVICE_B, USER_A, w7), E_OK); + EXPECT_EQ(metadata_->SavePeerWaterMark(DEVICE_B, USER_A, w7, true), E_OK); + WaterMark w8 = 8; + EXPECT_EQ(metadata_->SaveLocalWaterMark(DEVICE_B, USER_B, w8), E_OK); + EXPECT_EQ(metadata_->SavePeerWaterMark(DEVICE_B, USER_B, w8, true), E_OK); + + /** + * @tc.steps: step6. get receive and send watermark + * @tc.expected: step6. E_OK and get the w3 + */ + EXPECT_EQ(metadata_->GetRecvDeleteSyncWaterMark(DEVICE_B, USER_A, w), E_OK); + EXPECT_EQ(w7, w); + EXPECT_EQ(metadata_->GetSendDeleteSyncWaterMark(DEVICE_B, USER_A, w), E_OK); + EXPECT_EQ(w7, w); + EXPECT_EQ(metadata_->GetRecvDeleteSyncWaterMark(DEVICE_B, USER_B, w), E_OK); + EXPECT_EQ(w8, w); + EXPECT_EQ(metadata_->GetSendDeleteSyncWaterMark(DEVICE_B, USER_B, w), E_OK); + EXPECT_EQ(w8, w); + + /** + * @tc.steps: step7. get not exit receive and send watermark + * @tc.expected: step7. E_OK and get the 0 + */ + EXPECT_EQ(metadata_->GetRecvDeleteSyncWaterMark("D3", USER_A, w), E_OK); + EXPECT_EQ(w, 0u); + EXPECT_EQ(metadata_->GetSendDeleteSyncWaterMark("D3", USER_A, w), E_OK); + EXPECT_EQ(w, 0u); +} +} diff --git a/frameworks/libs/distributeddb/test/unittest/common/syncer/distributeddb_mock_sync_module_test.cpp b/frameworks/libs/distributeddb/test/unittest/common/syncer/distributeddb_mock_sync_module_test.cpp index 530a32470f4f4092cf70fe29e981d0606a037847..28185119352aed03bd870200caa509bdb4b49994 100644 --- a/frameworks/libs/distributeddb/test/unittest/common/syncer/distributeddb_mock_sync_module_test.cpp +++ b/frameworks/libs/distributeddb/test/unittest/common/syncer/distributeddb_mock_sync_module_test.cpp @@ -108,7 +108,7 @@ void Init(MockSingleVerStateMachine &stateMachine, MockSyncTaskContext &syncTask { std::shared_ptr metadata = std::make_shared(); ASSERT_EQ(metadata->Initialize(&dbSyncInterface), E_OK); - (void)syncTaskContext.Initialize("device", &dbSyncInterface, metadata, &communicator); + (void)syncTaskContext.Initialize({"device", ""}, &dbSyncInterface, metadata, &communicator); (void)stateMachine.Initialize(&syncTaskContext, &dbSyncInterface, metadata, &communicator); } @@ -117,7 +117,7 @@ void Init(MockSingleVerStateMachine &stateMachine, MockSyncTaskContext *syncTask { std::shared_ptr metadata = std::make_shared(); ASSERT_EQ(metadata->Initialize(dbSyncInterface), E_OK); - (void)syncTaskContext->Initialize("device", dbSyncInterface, metadata, &communicator); + (void)syncTaskContext->Initialize({"device", ""}, dbSyncInterface, metadata, &communicator); (void)stateMachine.Initialize(syncTaskContext, dbSyncInterface, metadata, &communicator); } @@ -368,7 +368,7 @@ void TimeSync001() const int timeDriverMs = 100; for (int i = 0; i < loopCount; ++i) { MockTimeSync timeSync; - EXPECT_EQ(timeSync.Initialize(communicator, metadata, storage, "DEVICES_A"), E_OK); + EXPECT_EQ(timeSync.Initialize(communicator, metadata, storage, "DEVICES_A", ""), E_OK); EXPECT_CALL(timeSync, SyncStart).WillRepeatedly(Return(E_OK)); timeSync.ModifyTimer(timeDriverMs); std::this_thread::sleep_for(std::chrono::milliseconds(timeDriverMs)); @@ -781,8 +781,8 @@ HWTEST_F(DistributedDBMockSyncModuleTest, DataSyncCheck003, TestSize.Level1) message->SetCopiedObject(packet); mockSyncTaskContext.SetQuerySync(true); - EXPECT_CALL(*mockMetadata, GetLastQueryTime(_, _, _)).WillOnce(Return(E_OK)); - EXPECT_CALL(*mockMetadata, SetLastQueryTime(_, _, _)) + EXPECT_CALL(*mockMetadata, GetLastQueryTime(_, _, _, _)).WillOnce(Return(E_OK)); + EXPECT_CALL(*mockMetadata, SetLastQueryTime(_, _, _, _)) .WillOnce([&dataTimeRange]( const std::string &queryIdentify, const std::string &deviceId, const Timestamp ×tamp) { EXPECT_EQ(timestamp, dataTimeRange.endTime); @@ -839,7 +839,7 @@ HWTEST_F(DistributedDBMockSyncModuleTest, DataSyncCheck005, TestSize.Level1) std::shared_ptr metadata = std::static_pointer_cast(mockMetadata); mockDataSync.Initialize(&storage, &communicator, metadata, "deviceId"); - EXPECT_CALL(*mockMetadata, GetLocalWaterMark(_, _)).WillOnce(Return()); + EXPECT_CALL(*mockMetadata, GetLocalWaterMark(_, _, _)).WillOnce(Return()); std::vector reserved; mockDataSync.CallDealRemoveDeviceDataByAck(&mockSyncTaskContext, 1, reserved); reserved.push_back(1); @@ -934,14 +934,14 @@ HWTEST_F(DistributedDBMockSyncModuleTest, SyncDataSync003, TestSize.Level1) const std::string deviceId = "deviceId"; dataSync.Initialize(&storage, &communicator, metadata, deviceId); syncTaskContext.SetRemoteSoftwareVersion(SOFTWARE_VERSION_CURRENT); - syncTaskContext.Initialize(deviceId, &storage, metadata, &communicator); + syncTaskContext.Initialize({deviceId, ""}, &storage, metadata, &communicator); syncTaskContext.EnableClearRemoteStaleData(true); /** * @tc.steps: step1. set diff db createtime for rebuild label in meta */ - metadata->SetDbCreateTime(deviceId, 1, true); // 1 is old db createTime - metadata->SetDbCreateTime(deviceId, 2, true); // 1 is new db createTime + metadata->SetDbCreateTime(deviceId, "", 1, true); // 1 is old db createTime + metadata->SetDbCreateTime(deviceId, "", 2, true); // 1 is new db createTime DistributedDB::Key k1 = {'k', '1'}; DistributedDB::Value v1 = {'v', '1'}; @@ -1410,7 +1410,7 @@ HWTEST_F(DistributedDBMockSyncModuleTest, SyncEngineTest004, TestSize.Level0) auto *enginePtr = new (std::nothrow) MockSyncEngine(); ASSERT_NE(enginePtr, nullptr); int errCode = E_OK; - auto *context = enginePtr->CallGetSyncTaskContext("dev", errCode); + auto *context = enginePtr->CallGetSyncTaskContext({"dev", "user"}, errCode); EXPECT_EQ(context, nullptr); EXPECT_EQ(errCode, -E_INVALID_DB); RefObject::KillAndDecObjRef(enginePtr); @@ -1466,6 +1466,53 @@ HWTEST_F(DistributedDBMockSyncModuleTest, SyncEngineTest005, TestSize.Level0) virtualCommunicatorAggregator = nullptr; } +/** + * @tc.name: SyncEngineTest006 + * @tc.desc: Test find context with default user. + * @tc.type: FUNC + * @tc.require: + * @tc.author: liaoyonghuang + */ +HWTEST_F(DistributedDBMockSyncModuleTest, SyncEngineTest006, TestSize.Level0) +{ + /** + * @tc.steps: step1. Init engine. + * @tc.expected: step1. ok + */ + std::unique_ptr enginePtr = std::make_unique(); + MockKvSyncInterface syncDBInterface; + KvDBProperties kvDBProperties; + std::string userId = "user_1"; + kvDBProperties.SetStringProp(DBProperties::USER_ID, userId); + std::vector identifier(COMM_LABEL_LENGTH, 1u); + syncDBInterface.SetIdentifier(identifier); + syncDBInterface.SetDbProperties(kvDBProperties); + std::shared_ptr metaData = std::make_shared(); + metaData->Initialize(&syncDBInterface); + VirtualCommunicatorAggregator *virtualCommunicatorAggregator = new VirtualCommunicatorAggregator(); + ASSERT_NE(virtualCommunicatorAggregator, nullptr); + RuntimeContext::GetInstance()->SetCommunicatorAggregator(virtualCommunicatorAggregator); + ISyncEngine::InitCallbackParam param = { nullptr, nullptr, nullptr }; + enginePtr->Initialize(&syncDBInterface, metaData, param); + /** + * @tc.steps: step2. Insert context with userId. + * @tc.expected: step2. ok + */ + EXPECT_CALL(*enginePtr, CreateSyncTaskContext(_)) + .WillRepeatedly(Return(new (std::nothrow) SingleVerKvSyncTaskContext())); + int errCode = E_OK; + std::string deviceId = "deviceB"; + auto *context1 = enginePtr->CallGetSyncTaskContext({deviceId, userId}, errCode); + ASSERT_NE(context1, nullptr); + /** + * @tc.steps: step3. Find context with default user. + * @tc.expected: step3. ok + */ + auto context2 = enginePtr->CallFindSyncTaskContext({deviceId, DBConstant::DEFAULT_USER}); + EXPECT_EQ(context1, context2); + enginePtr->Close(); +} + /** * @tc.name: remote query packet 001 * @tc.desc: Test RemoteExecutorRequestPacket Serialization And DeSerialization @@ -1727,7 +1774,7 @@ HWTEST_F(DistributedDBMockSyncModuleTest, SyncTaskContextCheck001, TestSize.Leve MockCommunicator communicator; VirtualSingleVerSyncDBInterface dbSyncInterface; std::shared_ptr metadata = std::make_shared(); - (void)syncTaskContext.Initialize("device", &dbSyncInterface, metadata, &communicator); + (void)syncTaskContext.Initialize({"device", ""}, &dbSyncInterface, metadata, &communicator); syncTaskContext.SetLastFullSyncTaskStatus(SyncOperation::Status::OP_FINISHED_ALL); syncTaskContext.CallSetSyncMode(static_cast(SyncModeType::PUSH)); EXPECT_EQ(syncTaskContext.CallIsCurrentSyncTaskCanBeSkipped(), true); @@ -1880,7 +1927,7 @@ HWTEST_F(DistributedDBMockSyncModuleTest, SyncTaskContextCheck005, TestSize.Leve VirtualSingleVerSyncDBInterface dbSyncInterface; std::shared_ptr metadata = std::make_shared(); ASSERT_EQ(metadata->Initialize(&dbSyncInterface), E_OK); - (void)context->Initialize("device", &dbSyncInterface, metadata, &communicator); + (void)context->Initialize({"device", ""}, &dbSyncInterface, metadata, &communicator); (void)stateMachine.Initialize(context, &dbSyncInterface, metadata, &communicator); for (int i = 0; i < 100; ++i) { // 100 sync target @@ -1936,7 +1983,7 @@ HWTEST_F(DistributedDBMockSyncModuleTest, SyncTaskContextCheck006, TestSize.Leve VirtualSingleVerSyncDBInterface dbSyncInterface; std::shared_ptr metadata = std::make_shared(); ASSERT_EQ(metadata->Initialize(&dbSyncInterface), E_OK); - (void)context->Initialize("device", &dbSyncInterface, metadata, communicator); + (void)context->Initialize({"device", ""}, &dbSyncInterface, metadata, communicator); /** * @tc.steps: step2. add sync target into context */ @@ -1976,7 +2023,7 @@ HWTEST_F(DistributedDBMockSyncModuleTest, SyncTaskContextCheck007, TestSize.Leve VirtualRelationalVerSyncDBInterface dbSyncInterface; std::shared_ptr metadata = std::make_shared(); ASSERT_EQ(metadata->Initialize(&dbSyncInterface), E_OK); - (void)context->Initialize("device", &dbSyncInterface, metadata, &communicator); + (void)context->Initialize({"device", ""}, &dbSyncInterface, metadata, &communicator); (void)stateMachine.Initialize(context, &dbSyncInterface, metadata, &communicator); /** * @tc.steps: step2. prepare table and query @@ -2223,7 +2270,7 @@ HWTEST_F(DistributedDBMockSyncModuleTest, SyncerCheck007, TestSize.Level1) MockSingleVerKVSyncer syncer; auto mockMeta = std::make_shared(); auto metadata = std::static_pointer_cast(mockMeta); - EXPECT_CALL(*mockMeta, GetLocalWaterMark).WillRepeatedly([&syncer](const DeviceID &, uint64_t &) { + EXPECT_CALL(*mockMeta, GetLocalWaterMark).WillRepeatedly([&syncer](const DeviceID &, const DeviceID &, uint64_t &) { syncer.TestSyncerLock(); }); syncer.SetMetadata(metadata); @@ -2327,7 +2374,7 @@ HWTEST_F(DistributedDBMockSyncModuleTest, TimeSync002, TestSize.Level1) MockTimeSync timeSync; EXPECT_CALL(timeSync, SyncStart).WillRepeatedly(Return(E_OK)); - EXPECT_EQ(timeSync.Initialize(communicator, metadata, storage, "DEVICES_A"), E_OK); + EXPECT_EQ(timeSync.Initialize(communicator, metadata, storage, "DEVICES_A", ""), E_OK); const int loopCount = 100; const int timeDriverMs = 10; for (int i = 0; i < loopCount; ++i) { @@ -2398,7 +2445,7 @@ HWTEST_F(DistributedDBMockSyncModuleTest, SingleVerDataSyncUtils001, TestSize.Le MockCommunicator communicator; VirtualSingleVerSyncDBInterface dbSyncInterface; std::shared_ptr metadata = std::make_shared(); - (void)context.Initialize("device", &dbSyncInterface, metadata, &communicator); + (void)context.Initialize({"device", ""}, &dbSyncInterface, metadata, &communicator); std::vector data; for (int i = 0; i < 2; ++i) { // loop 2 times diff --git a/frameworks/libs/distributeddb/test/unittest/common/syncer/distributeddb_single_ver_p2p_query_sync_test.cpp b/frameworks/libs/distributeddb/test/unittest/common/syncer/distributeddb_single_ver_p2p_query_sync_test.cpp index 88370d2e4836310a20769bc87a47dd4cd90b3985..cf551b6e71eec8ec10b19f951840b8ec9b6fb330 100644 --- a/frameworks/libs/distributeddb/test/unittest/common/syncer/distributeddb_single_ver_p2p_query_sync_test.cpp +++ b/frameworks/libs/distributeddb/test/unittest/common/syncer/distributeddb_single_ver_p2p_query_sync_test.cpp @@ -792,17 +792,17 @@ HWTEST_F(DistributedDBSingleVerP2PQuerySyncTest, GetQueryWaterMark001, TestSize. * @tc.expected: step2. E_OK */ WaterMark w1 = 1; - EXPECT_EQ(meta.SetRecvQueryWaterMark("Q1", "D1", w1), E_OK); - EXPECT_EQ(meta.SetSendQueryWaterMark("Q1", "D1", w1), E_OK); + EXPECT_EQ(meta.SetRecvQueryWaterMark("Q1", "D1", "", w1), E_OK); + EXPECT_EQ(meta.SetSendQueryWaterMark("Q1", "D1", "", w1), E_OK); /** * @tc.steps: step3. get receive and send watermark * @tc.expected: step3. E_OK and get the latest value */ WaterMark w = 0; - EXPECT_EQ(meta.GetRecvQueryWaterMark("Q1", "D1", w), E_OK); + EXPECT_EQ(meta.GetRecvQueryWaterMark("Q1", "D1", "", w), E_OK); EXPECT_EQ(w1, w); - EXPECT_EQ(meta.GetSendQueryWaterMark("Q1", "D1", w), E_OK); + EXPECT_EQ(meta.GetSendQueryWaterMark("Q1", "D1", "", w), E_OK); EXPECT_EQ(w1, w); /** @@ -810,16 +810,16 @@ HWTEST_F(DistributedDBSingleVerP2PQuerySyncTest, GetQueryWaterMark001, TestSize. * @tc.expected: step4. E_OK */ WaterMark w2 = 2; - EXPECT_EQ(meta.SaveLocalWaterMark("D1", w2), E_OK); - EXPECT_EQ(meta.SavePeerWaterMark("D1", w2, true), E_OK); + EXPECT_EQ(meta.SaveLocalWaterMark("D1", "", w2), E_OK); + EXPECT_EQ(meta.SavePeerWaterMark("D1", "", w2, true), E_OK); /** * @tc.steps: step5. get receive and send watermark * @tc.expected: step5. E_OK and get the w1 */ - EXPECT_EQ(meta.GetRecvQueryWaterMark("Q1", "D1", w), E_OK); + EXPECT_EQ(meta.GetRecvQueryWaterMark("Q1", "D1", "", w), E_OK); EXPECT_EQ(w2, w); - EXPECT_EQ(meta.GetSendQueryWaterMark("Q1", "D1", w), E_OK); + EXPECT_EQ(meta.GetSendQueryWaterMark("Q1", "D1", "", w), E_OK); EXPECT_EQ(w2, w); /** @@ -827,25 +827,25 @@ HWTEST_F(DistributedDBSingleVerP2PQuerySyncTest, GetQueryWaterMark001, TestSize. * @tc.expected: step6. E_OK */ WaterMark w3 = 3; - EXPECT_EQ(meta.SaveLocalWaterMark("D2", w3), E_OK); - EXPECT_EQ(meta.SavePeerWaterMark("D2", w3, true), E_OK); + EXPECT_EQ(meta.SaveLocalWaterMark("D2", "", w3), E_OK); + EXPECT_EQ(meta.SavePeerWaterMark("D2", "", w3, true), E_OK); /** * @tc.steps: step7. get receive and send watermark * @tc.expected: step7. E_OK and get the w3 */ - EXPECT_EQ(meta.GetRecvQueryWaterMark("Q2", "D2", w), E_OK); + EXPECT_EQ(meta.GetRecvQueryWaterMark("Q2", "D2", "", w), E_OK); EXPECT_EQ(w3, w); - EXPECT_EQ(meta.GetSendQueryWaterMark("Q2", "D2", w), E_OK); + EXPECT_EQ(meta.GetSendQueryWaterMark("Q2", "D2", "", w), E_OK); EXPECT_EQ(w3, w); /** * @tc.steps: step8. get not exit receive and send watermark * @tc.expected: step8. E_OK and get the 0 */ - EXPECT_EQ(meta.GetRecvQueryWaterMark("Q3", "D3", w), E_OK); + EXPECT_EQ(meta.GetRecvQueryWaterMark("Q3", "D3", "", w), E_OK); EXPECT_EQ(w, 0u); - EXPECT_EQ(meta.GetSendQueryWaterMark("Q3", "D3", w), E_OK); + EXPECT_EQ(meta.GetSendQueryWaterMark("Q3", "D3", "", w), E_OK); EXPECT_EQ(w, 0u); } @@ -873,25 +873,25 @@ HWTEST_F(DistributedDBSingleVerP2PQuerySyncTest, GetQueryWaterMark002, TestSize. * @tc.expected: step2. E_OK */ WaterMark w1 = 2; - EXPECT_EQ(meta.SaveLocalWaterMark("D1", w1), E_OK); - EXPECT_EQ(meta.SavePeerWaterMark("D1", w1, true), E_OK); + EXPECT_EQ(meta.SaveLocalWaterMark("D1", "", w1), E_OK); + EXPECT_EQ(meta.SavePeerWaterMark("D1", "", w1, true), E_OK); /** * @tc.steps: step2. save receive and send watermark * @tc.expected: step2. E_OK */ WaterMark w2 = 1; - EXPECT_EQ(meta.SetRecvQueryWaterMark("Q1", "D1", w2), E_OK); - EXPECT_EQ(meta.SetSendQueryWaterMark("Q1", "D1", w2), E_OK); + EXPECT_EQ(meta.SetRecvQueryWaterMark("Q1", "D1", "", w2), E_OK); + EXPECT_EQ(meta.SetSendQueryWaterMark("Q1", "D1", "", w2), E_OK); /** * @tc.steps: step3. get receive and send watermark * @tc.expected: step3. E_OK and get the bigger value */ WaterMark w = 0; - EXPECT_EQ(meta.GetRecvQueryWaterMark("Q1", "D1", w), E_OK); + EXPECT_EQ(meta.GetRecvQueryWaterMark("Q1", "D1", "", w), E_OK); EXPECT_EQ(w1, w); - EXPECT_EQ(meta.GetSendQueryWaterMark("Q1", "D1", w), E_OK); + EXPECT_EQ(meta.GetSendQueryWaterMark("Q1", "D1", "", w), E_OK); EXPECT_EQ(w1, w); } @@ -912,13 +912,13 @@ HWTEST_F(DistributedDBSingleVerP2PQuerySyncTest, GetQueryWaterMark003, TestSize. const std::string DEVICE_B = "DEVICE_B"; TimeOffset offset = 100; // 100: offset - meta.SaveTimeOffset(DEVICE_B, offset); + meta.SaveTimeOffset(DEVICE_B, "", offset); WaterMark w1 = 2; // 2: watermark - meta.SavePeerWaterMark(DBCommon::TransferHashString(DEVICE_B), w1, false); + meta.SavePeerWaterMark(DBCommon::TransferHashString(DEVICE_B), "", w1, false); TimeOffset offsetGot; - meta.GetTimeOffset(DEVICE_B, offsetGot); + meta.GetTimeOffset(DEVICE_B, "", offsetGot); EXPECT_EQ(offsetGot, offset); } @@ -949,17 +949,17 @@ HWTEST_F(DistributedDBSingleVerP2PQuerySyncTest, GetDeleteWaterMark001, TestSize const WaterMark maxWaterMark = 1000u; std::thread recvThread([&meta, &device, &maxWaterMark]() { for (WaterMark expectRecv = 0u; expectRecv < maxWaterMark; ++expectRecv) { - EXPECT_EQ(meta.SetRecvDeleteSyncWaterMark(device, expectRecv), E_OK); + EXPECT_EQ(meta.SetRecvDeleteSyncWaterMark(device, "", expectRecv), E_OK); WaterMark actualRecv = 0u; - EXPECT_EQ(meta.GetRecvDeleteSyncWaterMark(device, actualRecv), E_OK); + EXPECT_EQ(meta.GetRecvDeleteSyncWaterMark(device, "", actualRecv), E_OK); EXPECT_EQ(actualRecv, expectRecv); } }); std::thread sendThread([&meta, &device, &maxWaterMark]() { for (WaterMark expectSend = 0u; expectSend < maxWaterMark; ++expectSend) { - EXPECT_EQ(meta.SetSendDeleteSyncWaterMark(device, expectSend), E_OK); + EXPECT_EQ(meta.SetSendDeleteSyncWaterMark(device, "", expectSend), E_OK); WaterMark actualSend = 0u; - EXPECT_EQ(meta.GetSendDeleteSyncWaterMark(device, actualSend), E_OK); + EXPECT_EQ(meta.GetSendDeleteSyncWaterMark(device, "", actualSend), E_OK); EXPECT_EQ(actualSend, expectSend); } }); @@ -991,7 +991,7 @@ HWTEST_F(DistributedDBSingleVerP2PQuerySyncTest, ClearQueryWaterMark001, TestSiz * @tc.expected: step2. E_OK */ WaterMark w1 = 1; - EXPECT_EQ(meta.SetRecvQueryWaterMark("Q1", "D1", w1), E_OK); + EXPECT_EQ(meta.SetRecvQueryWaterMark("Q1", "D1", "", w1), E_OK); /** * @tc.steps: step3. erase peer watermark @@ -1004,7 +1004,7 @@ HWTEST_F(DistributedDBSingleVerP2PQuerySyncTest, ClearQueryWaterMark001, TestSiz * @tc.expected: step4. E_OK receive watermark is zero */ WaterMark w2 = -1; - EXPECT_EQ(meta.GetRecvQueryWaterMark("Q1", "D1", w2), E_OK); + EXPECT_EQ(meta.GetRecvQueryWaterMark("Q1", "D1", "", w2), E_OK); EXPECT_EQ(w2, 0u); /** @@ -1012,14 +1012,14 @@ HWTEST_F(DistributedDBSingleVerP2PQuerySyncTest, ClearQueryWaterMark001, TestSiz * @tc.expected: step5. E_OK */ WaterMark w3 = 2; - EXPECT_EQ(meta.SavePeerWaterMark("D1", w3, true), E_OK); + EXPECT_EQ(meta.SavePeerWaterMark("D1", "", w3, true), E_OK); /** * @tc.steps: step6. get receive watermark * @tc.expected: step6. E_OK receive watermark is peer watermark */ WaterMark w4 = -1; - EXPECT_EQ(meta.GetRecvQueryWaterMark("Q1", "D1", w4), E_OK); + EXPECT_EQ(meta.GetRecvQueryWaterMark("Q1", "D1", "", w4), E_OK); EXPECT_EQ(w4, w3); } @@ -1047,9 +1047,9 @@ HWTEST_F(DistributedDBSingleVerP2PQuerySyncTest, ClearQueryWaterMark002, TestSiz * @tc.expected: step2. E_OK */ WaterMark w1 = 1; - EXPECT_EQ(meta.SetRecvQueryWaterMark("Q1", "D1", w1), E_OK); - EXPECT_EQ(meta.SetRecvQueryWaterMark("Q2", "D1", w1), E_OK); - EXPECT_EQ(meta.SetRecvQueryWaterMark("Q1", "D2", w1), E_OK); + EXPECT_EQ(meta.SetRecvQueryWaterMark("Q1", "D1", "", w1), E_OK); + EXPECT_EQ(meta.SetRecvQueryWaterMark("Q2", "D1", "", w1), E_OK); + EXPECT_EQ(meta.SetRecvQueryWaterMark("Q1", "D2", "", w1), E_OK); /** * @tc.steps: step3. erase peer watermark, make sure data remove in db @@ -1064,13 +1064,13 @@ HWTEST_F(DistributedDBSingleVerP2PQuerySyncTest, ClearQueryWaterMark002, TestSiz * @tc.expected: step4. E_OK receive watermark is zero */ WaterMark w2 = -1; - EXPECT_EQ(anotherMeta.GetRecvQueryWaterMark("Q1", "D1", w2), E_OK); + EXPECT_EQ(anotherMeta.GetRecvQueryWaterMark("Q1", "D1", "", w2), E_OK); EXPECT_EQ(w2, 0u); w2 = -1; - EXPECT_EQ(anotherMeta.GetRecvQueryWaterMark("Q2", "D1", w2), E_OK); + EXPECT_EQ(anotherMeta.GetRecvQueryWaterMark("Q2", "D1", "", w2), E_OK); EXPECT_EQ(w2, 0u); w2 = -1; - EXPECT_EQ(anotherMeta.GetRecvQueryWaterMark("Q1", "D2", w2), E_OK); + EXPECT_EQ(anotherMeta.GetRecvQueryWaterMark("Q1", "D2", "", w2), E_OK); EXPECT_EQ(w2, w1); } @@ -1207,7 +1207,7 @@ HWTEST_F(DistributedDBSingleVerP2PQuerySyncTest, MetaDataExceptionBranch001, Tes uint64_t val = 99; // 99 is the initial value of outValue uint64_t outValue = val; - meta.GetRemoveDataMark("D1", outValue); + meta.GetRemoveDataMark("D1", "", outValue); EXPECT_EQ(outValue, 0u); /** @@ -1215,14 +1215,14 @@ HWTEST_F(DistributedDBSingleVerP2PQuerySyncTest, MetaDataExceptionBranch001, Tes * @tc.expected: step2. out value = 0 */ outValue = val; - meta.GetDbCreateTime("D1", outValue); + meta.GetDbCreateTime("D1", "", outValue); EXPECT_EQ(outValue, 0u); /** * @tc.steps: step3. call ResetMetaDataAfterRemoveData with a device not in map * @tc.expected: step3. return -E_NOT_FOUND */ - EXPECT_EQ(meta.ResetMetaDataAfterRemoveData("D1"), -E_NOT_FOUND); + EXPECT_EQ(meta.ResetMetaDataAfterRemoveData("D1", ""), -E_NOT_FOUND); } /** @@ -1249,17 +1249,17 @@ HWTEST_F(DistributedDBSingleVerP2PQuerySyncTest, GetDeleteKeyWaterMark001, TestS * @tc.expected: step2. E_OK */ WaterMark w1 = 1; - EXPECT_EQ(meta.SetRecvDeleteSyncWaterMark("D1", w1), E_OK); - EXPECT_EQ(meta.SetSendDeleteSyncWaterMark("D1", w1), E_OK); + EXPECT_EQ(meta.SetRecvDeleteSyncWaterMark("D1", "", w1), E_OK); + EXPECT_EQ(meta.SetSendDeleteSyncWaterMark("D1", "", w1), E_OK); /** * @tc.steps: step3. get receive and send watermark * @tc.expected: step3. E_OK and get the latest value */ WaterMark w = 0; - EXPECT_EQ(meta.GetRecvDeleteSyncWaterMark("D1", w), E_OK); + EXPECT_EQ(meta.GetRecvDeleteSyncWaterMark("D1", "", w), E_OK); EXPECT_EQ(w1, w); - EXPECT_EQ(meta.GetSendDeleteSyncWaterMark("D1", w), E_OK); + EXPECT_EQ(meta.GetSendDeleteSyncWaterMark("D1", "", w), E_OK); EXPECT_EQ(w1, w); /** @@ -1267,16 +1267,16 @@ HWTEST_F(DistributedDBSingleVerP2PQuerySyncTest, GetDeleteKeyWaterMark001, TestS * @tc.expected: step4. E_OK */ WaterMark w2 = 2; - EXPECT_EQ(meta.SaveLocalWaterMark("D1", w2), E_OK); - EXPECT_EQ(meta.SavePeerWaterMark("D1", w2, true), E_OK); + EXPECT_EQ(meta.SaveLocalWaterMark("D1", "", w2), E_OK); + EXPECT_EQ(meta.SavePeerWaterMark("D1", "", w2, true), E_OK); /** * @tc.steps: step5. get receive and send watermark * @tc.expected: step5. E_OK and get the w1 */ - EXPECT_EQ(meta.GetRecvDeleteSyncWaterMark("D1", w), E_OK); + EXPECT_EQ(meta.GetRecvDeleteSyncWaterMark("D1", "", w), E_OK); EXPECT_EQ(w2, w); - EXPECT_EQ(meta.GetSendDeleteSyncWaterMark("D1", w), E_OK); + EXPECT_EQ(meta.GetSendDeleteSyncWaterMark("D1", "", w), E_OK); EXPECT_EQ(w2, w); /** @@ -1284,25 +1284,25 @@ HWTEST_F(DistributedDBSingleVerP2PQuerySyncTest, GetDeleteKeyWaterMark001, TestS * @tc.expected: step6. E_OK */ WaterMark w3 = 3; - EXPECT_EQ(meta.SaveLocalWaterMark("D2", w3), E_OK); - EXPECT_EQ(meta.SavePeerWaterMark("D2", w3, true), E_OK); + EXPECT_EQ(meta.SaveLocalWaterMark("D2", "", w3), E_OK); + EXPECT_EQ(meta.SavePeerWaterMark("D2", "", w3, true), E_OK); /** * @tc.steps: step7. get receive and send watermark * @tc.expected: step7. E_OK and get the w3 */ - EXPECT_EQ(meta.GetRecvDeleteSyncWaterMark("D2", w), E_OK); + EXPECT_EQ(meta.GetRecvDeleteSyncWaterMark("D2", "", w), E_OK); EXPECT_EQ(w3, w); - EXPECT_EQ(meta.GetSendDeleteSyncWaterMark("D2", w), E_OK); + EXPECT_EQ(meta.GetSendDeleteSyncWaterMark("D2", "", w), E_OK); EXPECT_EQ(w3, w); /** * @tc.steps: step8. get not exit receive and send watermark * @tc.expected: step8. E_OK and get the 0 */ - EXPECT_EQ(meta.GetRecvDeleteSyncWaterMark("D3", w), E_OK); + EXPECT_EQ(meta.GetRecvDeleteSyncWaterMark("D3", "", w), E_OK); EXPECT_EQ(w, 0u); - EXPECT_EQ(meta.GetSendDeleteSyncWaterMark("D3", w), E_OK); + EXPECT_EQ(meta.GetSendDeleteSyncWaterMark("D3", "", w), E_OK); EXPECT_EQ(w, 0u); } @@ -1330,25 +1330,25 @@ HWTEST_F(DistributedDBSingleVerP2PQuerySyncTest, GetDeleteKeyWaterMark002, TestS * @tc.expected: step2. E_OK */ WaterMark w1 = 3; - EXPECT_EQ(meta.SaveLocalWaterMark("D1", w1), E_OK); - EXPECT_EQ(meta.SavePeerWaterMark("D1", w1, true), E_OK); + EXPECT_EQ(meta.SaveLocalWaterMark("D1", "", w1), E_OK); + EXPECT_EQ(meta.SavePeerWaterMark("D1", "", w1, true), E_OK); /** * @tc.steps: step2. save receive and send watermark * @tc.expected: step2. E_OK */ WaterMark w2 = 1; - EXPECT_EQ(meta.SetRecvDeleteSyncWaterMark("D1", w2), E_OK); - EXPECT_EQ(meta.SetSendDeleteSyncWaterMark("D1", w2), E_OK); + EXPECT_EQ(meta.SetRecvDeleteSyncWaterMark("D1", "", w2), E_OK); + EXPECT_EQ(meta.SetSendDeleteSyncWaterMark("D1", "", w2), E_OK); /** * @tc.steps: step3. get receive and send watermark * @tc.expected: step3. E_OK and get the bigger value */ WaterMark w = 0; - EXPECT_EQ(meta.GetRecvDeleteSyncWaterMark("D1", w), E_OK); + EXPECT_EQ(meta.GetRecvDeleteSyncWaterMark("D1", "", w), E_OK); EXPECT_EQ(w1, w); - EXPECT_EQ(meta.GetSendDeleteSyncWaterMark("D1", w), E_OK); + EXPECT_EQ(meta.GetSendDeleteSyncWaterMark("D1", "", w), E_OK); EXPECT_EQ(w1, w); } @@ -1376,7 +1376,7 @@ HWTEST_F(DistributedDBSingleVerP2PQuerySyncTest, ClearDeleteKeyWaterMark001, Tes * @tc.expected: step2. E_OK */ WaterMark w1 = 1; - EXPECT_EQ(meta.SetRecvDeleteSyncWaterMark("D1", w1), E_OK); + EXPECT_EQ(meta.SetRecvDeleteSyncWaterMark("D1", "", w1), E_OK); /** * @tc.steps: step3. erase peer watermark @@ -1389,7 +1389,7 @@ HWTEST_F(DistributedDBSingleVerP2PQuerySyncTest, ClearDeleteKeyWaterMark001, Tes * @tc.expected: step4. E_OK receive watermark is zero */ WaterMark w2 = -1; - EXPECT_EQ(meta.GetRecvDeleteSyncWaterMark("D1", w2), E_OK); + EXPECT_EQ(meta.GetRecvDeleteSyncWaterMark("D1", "", w2), E_OK); EXPECT_EQ(w2, 0u); /** @@ -1397,14 +1397,14 @@ HWTEST_F(DistributedDBSingleVerP2PQuerySyncTest, ClearDeleteKeyWaterMark001, Tes * @tc.expected: step5. E_OK */ WaterMark w3 = 2; - EXPECT_EQ(meta.SavePeerWaterMark("D1", w3, true), E_OK); + EXPECT_EQ(meta.SavePeerWaterMark("D1", "", w3, true), E_OK); /** * @tc.steps: step6. get receive watermark * @tc.expected: step6. E_OK receive watermark is peer watermark */ WaterMark w4 = -1; - EXPECT_EQ(meta.GetRecvDeleteSyncWaterMark("D1", w4), E_OK); + EXPECT_EQ(meta.GetRecvDeleteSyncWaterMark("D1", "", w4), E_OK); EXPECT_EQ(w4, w3); } @@ -1435,16 +1435,16 @@ HWTEST_F(DistributedDBSingleVerP2PQuerySyncTest, VerifyMetaDataQuerySync001, Tes * @tc.expected: step2. E_OK */ WaterMark deleteWaterMark = 1; - EXPECT_EQ(meta.SetRecvDeleteSyncWaterMark(deviceId, deleteWaterMark), E_OK); - EXPECT_EQ(meta.SetSendDeleteSyncWaterMark(deviceId, deleteWaterMark), E_OK); + EXPECT_EQ(meta.SetRecvDeleteSyncWaterMark(deviceId, "", deleteWaterMark), E_OK); + EXPECT_EQ(meta.SetSendDeleteSyncWaterMark(deviceId, "", deleteWaterMark), E_OK); /** * @tc.steps: step3. save querySync watermark * @tc.expected: step2. E_OK */ WaterMark queryWaterMark = 2; - EXPECT_EQ(meta.SetRecvQueryWaterMark(queryId, deviceId, queryWaterMark), E_OK); - EXPECT_EQ(meta.SetSendQueryWaterMark(queryId, deviceId, queryWaterMark), E_OK); + EXPECT_EQ(meta.SetRecvQueryWaterMark(queryId, deviceId, "", queryWaterMark), E_OK); + EXPECT_EQ(meta.SetSendQueryWaterMark(queryId, deviceId, "", queryWaterMark), E_OK); /** * @tc.steps: step4. initialize meta with storage @@ -1458,18 +1458,18 @@ HWTEST_F(DistributedDBSingleVerP2PQuerySyncTest, VerifyMetaDataQuerySync001, Tes * @tc.expected: step5. E_OK and waterMark equal to deleteWaterMark */ WaterMark waterMark; - EXPECT_EQ(anotherMeta.GetRecvDeleteSyncWaterMark(deviceId, waterMark), E_OK); + EXPECT_EQ(anotherMeta.GetRecvDeleteSyncWaterMark(deviceId, "", waterMark), E_OK); EXPECT_EQ(waterMark, deleteWaterMark); - EXPECT_EQ(anotherMeta.GetSendDeleteSyncWaterMark(deviceId, waterMark), E_OK); + EXPECT_EQ(anotherMeta.GetSendDeleteSyncWaterMark(deviceId, "", waterMark), E_OK); EXPECT_EQ(waterMark, deleteWaterMark); /** * @tc.steps: step6. verify query sync data * @tc.expected: step6. E_OK and waterMark equal to queryWaterMark */ - EXPECT_EQ(anotherMeta.GetRecvQueryWaterMark(queryId, deviceId, waterMark), E_OK); + EXPECT_EQ(anotherMeta.GetRecvQueryWaterMark(queryId, deviceId, "", waterMark), E_OK); EXPECT_EQ(waterMark, queryWaterMark); - EXPECT_EQ(anotherMeta.GetSendQueryWaterMark(queryId, deviceId, waterMark), E_OK); + EXPECT_EQ(anotherMeta.GetSendQueryWaterMark(queryId, deviceId, "", waterMark), E_OK); EXPECT_EQ(waterMark, queryWaterMark); } @@ -1551,12 +1551,12 @@ HWTEST_F(DistributedDBSingleVerP2PQuerySyncTest, VerifyMetaDataInit001, TestSize * @tc.steps: step2. meta save and get waterMark * @tc.expected: step2. expect get the same waterMark */ - EXPECT_EQ(meta.SaveLocalWaterMark(deviceA, setWaterMark), E_OK); - EXPECT_EQ(meta.SaveLocalWaterMark(deviceB, setWaterMark), E_OK); + EXPECT_EQ(meta.SaveLocalWaterMark(deviceA, "", setWaterMark), E_OK); + EXPECT_EQ(meta.SaveLocalWaterMark(deviceB, "", setWaterMark), E_OK); WaterMark getWaterMark = 0; - meta.GetLocalWaterMark(deviceA, getWaterMark); + meta.GetLocalWaterMark(deviceA, "", getWaterMark); EXPECT_EQ(getWaterMark, setWaterMark); - meta.GetLocalWaterMark(deviceB, getWaterMark); + meta.GetLocalWaterMark(deviceB, "", getWaterMark); EXPECT_EQ(getWaterMark, setWaterMark); @@ -1571,9 +1571,9 @@ HWTEST_F(DistributedDBSingleVerP2PQuerySyncTest, VerifyMetaDataInit001, TestSize * @tc.steps: step4. get waterMark again * @tc.expected: step4. expect get the same waterMark */ - anotherMeta.GetLocalWaterMark(deviceA, getWaterMark); + anotherMeta.GetLocalWaterMark(deviceA, "", getWaterMark); EXPECT_EQ(getWaterMark, setWaterMark); - anotherMeta.GetLocalWaterMark(deviceB, getWaterMark); + anotherMeta.GetLocalWaterMark(deviceB, "", getWaterMark); EXPECT_EQ(getWaterMark, setWaterMark); } @@ -1594,7 +1594,7 @@ void InitVerifyStorageEnvironment(Metadata &meta, VirtualSingleVerSyncDBInterfac for (uint32_t i = startCount; i < maxStoreItems; i++) { std::string queryId = std::to_string(i); WaterMark recvWaterMark = i + 1; - EXPECT_EQ(meta.SetRecvQueryWaterMark(queryId, deviceId, recvWaterMark), E_OK); + EXPECT_EQ(meta.SetRecvQueryWaterMark(queryId, deviceId, "", recvWaterMark), E_OK); } } } @@ -1622,7 +1622,7 @@ HWTEST_F(DistributedDBSingleVerP2PQuerySyncTest, VerifyManagerQuerySyncStorage00 */ std::string newQueryId = std::to_string(maxStoreItems); WaterMark newWaterMark = maxStoreItems + 1; - EXPECT_EQ(meta.SetRecvQueryWaterMark(newQueryId, deviceId, newWaterMark), E_OK); + EXPECT_EQ(meta.SetRecvQueryWaterMark(newQueryId, deviceId, "", newWaterMark), E_OK); /** * @tc.steps: step4. touch the first item @@ -1630,7 +1630,7 @@ HWTEST_F(DistributedDBSingleVerP2PQuerySyncTest, VerifyManagerQuerySyncStorage00 */ std::string firstItemKey = std::to_string(startCount); WaterMark firstWaterMark = 11u; - EXPECT_EQ(meta.SetRecvQueryWaterMark(firstItemKey, deviceId, firstWaterMark), E_OK); + EXPECT_EQ(meta.SetRecvQueryWaterMark(firstItemKey, deviceId, "", firstWaterMark), E_OK); /** * @tc.steps: step5. initialize new meta with storage @@ -1644,7 +1644,7 @@ HWTEST_F(DistributedDBSingleVerP2PQuerySyncTest, VerifyManagerQuerySyncStorage00 * @tc.expected: step6. E_OK it still exist */ WaterMark exceptWaterMark; - EXPECT_EQ(newMeta.GetRecvQueryWaterMark(firstItemKey, deviceId, exceptWaterMark), E_OK); + EXPECT_EQ(newMeta.GetRecvQueryWaterMark(firstItemKey, deviceId, "", exceptWaterMark), E_OK); EXPECT_EQ(exceptWaterMark, firstWaterMark); /** @@ -1653,7 +1653,7 @@ HWTEST_F(DistributedDBSingleVerP2PQuerySyncTest, VerifyManagerQuerySyncStorage00 */ WaterMark secondWaterMark; std::string secondQueryId = std::to_string(startCount + 1); - EXPECT_EQ(newMeta.GetRecvQueryWaterMark(secondQueryId, deviceId, secondWaterMark), E_OK); + EXPECT_EQ(newMeta.GetRecvQueryWaterMark(secondQueryId, deviceId, "", secondWaterMark), E_OK); EXPECT_EQ(secondWaterMark, 0u); } @@ -1679,33 +1679,33 @@ HWTEST_F(DistributedDBSingleVerP2PQuerySyncTest, VerifyMetaDbCreateTime001, Test * @tc.expected: step4. E_OK */ WaterMark value = 2; - EXPECT_EQ(meta.SaveLocalWaterMark("D1", value), E_OK); - EXPECT_EQ(meta.SavePeerWaterMark("D1", value, true), E_OK); - EXPECT_EQ(meta.SetDbCreateTime("D1", 10u, true), E_OK); + EXPECT_EQ(meta.SaveLocalWaterMark("D1", "", value), E_OK); + EXPECT_EQ(meta.SavePeerWaterMark("D1", "", value, true), E_OK); + EXPECT_EQ(meta.SetDbCreateTime("D1", "", 10u, true), E_OK); /** * @tc.steps: step3. check peer and local watermark and dbCreateTime * @tc.expected: step4. E_OK */ WaterMark curValue = 0; - meta.GetLocalWaterMark("D1", curValue); + meta.GetLocalWaterMark("D1", "", curValue); EXPECT_EQ(value, curValue); - meta.GetPeerWaterMark("D1", curValue); + meta.GetPeerWaterMark("D1", "", curValue); EXPECT_EQ(value, curValue); uint64_t curDbCreatTime = 0; - meta.GetDbCreateTime("D1", curDbCreatTime); + meta.GetDbCreateTime("D1", "", curDbCreatTime); EXPECT_EQ(curDbCreatTime, 10u); /** * @tc.steps: step3. change dbCreateTime and check * @tc.expected: step4. E_OK */ - EXPECT_EQ(meta.SetDbCreateTime("D1", 20u, true), E_OK); + EXPECT_EQ(meta.SetDbCreateTime("D1", "", 20u, true), E_OK); uint64_t clearDeviceDataMark = INT_MAX; - meta.GetRemoveDataMark("D1", clearDeviceDataMark); + meta.GetRemoveDataMark("D1", "", clearDeviceDataMark); EXPECT_EQ(clearDeviceDataMark, 1u); - EXPECT_EQ(meta.ResetMetaDataAfterRemoveData("D1"), E_OK); - meta.GetRemoveDataMark("D1", clearDeviceDataMark); + EXPECT_EQ(meta.ResetMetaDataAfterRemoveData("D1", ""), E_OK); + meta.GetRemoveDataMark("D1", "", clearDeviceDataMark); EXPECT_EQ(clearDeviceDataMark, 0u); - meta.GetDbCreateTime("D1", curDbCreatTime); + meta.GetDbCreateTime("D1", "", curDbCreatTime); EXPECT_EQ(curDbCreatTime, 20u); } @@ -1750,7 +1750,7 @@ HWTEST_F(DistributedDBSingleVerP2PQuerySyncTest, VerifyManagerQuerySyncStorage00 */ std::string firstItemKey = std::to_string(startCount); WaterMark exceptWaterMark; - EXPECT_EQ(newMeta.GetRecvQueryWaterMark(firstItemKey, deviceId, exceptWaterMark), E_OK); + EXPECT_EQ(newMeta.GetRecvQueryWaterMark(firstItemKey, deviceId, "", exceptWaterMark), E_OK); EXPECT_EQ(exceptWaterMark, 1u); } diff --git a/frameworks/libs/distributeddb/test/unittest/common/syncer/distributeddb_time_sync_test.cpp b/frameworks/libs/distributeddb/test/unittest/common/syncer/distributeddb_time_sync_test.cpp index 4677b008c454a400889563b612381a6d53a38312..3d5c2607ee68fd2768e48bb033d34224c6073f0f 100644 --- a/frameworks/libs/distributeddb/test/unittest/common/syncer/distributeddb_time_sync_test.cpp +++ b/frameworks/libs/distributeddb/test/unittest/common/syncer/distributeddb_time_sync_test.cpp @@ -148,7 +148,7 @@ HWTEST_F(DistributedDBTimeSyncTest, NormalSync001, TestSize.Level0) TimeHelper::GetSysCurrentTime() + TimeHelper::BASE_OFFSET + offsetA, 0); int errCode; // initialize timeSyncA - errCode = g_timeSyncA->Initialize(g_virtualCommunicator, g_metadataA, g_syncInterfaceA, DEVICE_B); + errCode = g_timeSyncA->Initialize(g_virtualCommunicator, g_metadataA, g_syncInterfaceA, DEVICE_B, ""); EXPECT_TRUE(errCode == E_OK); g_metadataB->Initialize(g_syncInterfaceB); @@ -157,13 +157,13 @@ HWTEST_F(DistributedDBTimeSyncTest, NormalSync001, TestSize.Level0) g_syncInterfaceB->PutData(DistributedDBUnitTest::KEY_1, DistributedDBUnitTest::VALUE_1, TimeHelper::GetSysCurrentTime() + TimeHelper::BASE_OFFSET + offsetB, 0); // initialize timeSyncB - errCode = g_timeSyncB->Initialize(g_virtualCommunicator, g_metadataB, g_syncInterfaceB, DEVICE_A); + errCode = g_timeSyncB->Initialize(g_virtualCommunicator, g_metadataB, g_syncInterfaceB, DEVICE_A, ""); EXPECT_TRUE(errCode == E_OK); /** * @tc.steps: step3. Register the OnMessageCallback to virtual communicator */ - g_syncTaskContext->Initialize(DEVICE_B, g_syncInterfaceA, g_metadataA, g_virtualCommunicator); + g_syncTaskContext->Initialize({DEVICE_B, ""}, g_syncInterfaceA, g_metadataA, g_virtualCommunicator); g_virtualCommunicator->SetTimeSync(g_timeSyncA.get(), g_timeSyncB.get(), DEVICE_A, g_syncTaskContext); /** @@ -193,17 +193,17 @@ HWTEST_F(DistributedDBTimeSyncTest, NormalSync002, TestSize.Level0) g_metadataA->Initialize(g_syncInterfaceA); int errCode; // initialize timeSyncA - errCode = g_timeSyncA->Initialize(g_virtualCommunicator, g_metadataA, g_syncInterfaceA, DEVICE_B); + errCode = g_timeSyncA->Initialize(g_virtualCommunicator, g_metadataA, g_syncInterfaceA, DEVICE_B, ""); EXPECT_TRUE(errCode == E_OK); g_metadataB->Initialize(g_syncInterfaceB); // initialize timeSyncB - errCode = g_timeSyncB->Initialize(g_virtualCommunicator, g_metadataB, g_syncInterfaceB, DEVICE_A); + errCode = g_timeSyncB->Initialize(g_virtualCommunicator, g_metadataB, g_syncInterfaceB, DEVICE_A, ""); EXPECT_TRUE(errCode == E_OK); /** * @tc.steps: step2. Register the OnMessageCallback to virtual communicator */ - g_syncTaskContext->Initialize(DEVICE_B, g_syncInterfaceA, g_metadataA, g_virtualCommunicator); + g_syncTaskContext->Initialize({DEVICE_B, ""}, g_syncInterfaceA, g_metadataA, g_virtualCommunicator); g_virtualCommunicator->SetTimeSync(g_timeSyncA.get(), g_timeSyncB.get(), DEVICE_A, g_syncTaskContext); /** * @tc.steps: step3. Fetch timeOffset value @@ -239,7 +239,7 @@ HWTEST_F(DistributedDBTimeSyncTest, NormalSync003, TestSize.Level0) int errCode; // initialize timeSyncA - errCode = g_timeSyncA->Initialize(g_virtualCommunicator, g_metadataA, g_syncInterfaceA, DEVICE_B); + errCode = g_timeSyncA->Initialize(g_virtualCommunicator, g_metadataA, g_syncInterfaceA, DEVICE_B, ""); EXPECT_TRUE(errCode == E_OK); // set timeOffset for timeSyncA @@ -248,12 +248,12 @@ HWTEST_F(DistributedDBTimeSyncTest, NormalSync003, TestSize.Level0) g_metadataB->SaveLocalTimeOffset(offsetB); // initialize timeSyncB - errCode = g_timeSyncB->Initialize(g_virtualCommunicator, g_metadataB, g_syncInterfaceB, DEVICE_A); + errCode = g_timeSyncB->Initialize(g_virtualCommunicator, g_metadataB, g_syncInterfaceB, DEVICE_A, ""); EXPECT_TRUE(errCode == E_OK); /** * @tc.steps: step3. Register the OnMessageCallback to virtual communicator */ - g_syncTaskContext->Initialize(DEVICE_B, g_syncInterfaceA, g_metadataA, g_virtualCommunicator); + g_syncTaskContext->Initialize({DEVICE_B, ""}, g_syncInterfaceA, g_metadataA, g_virtualCommunicator); g_virtualCommunicator->SetTimeSync(g_timeSyncA.get(), g_timeSyncB.get(), DEVICE_A, g_syncTaskContext); /** * @tc.steps: step4. Fetch timeOffset value @@ -282,15 +282,15 @@ HWTEST_F(DistributedDBTimeSyncTest, NetDisconnetSyncTest001, TestSize.Level0) g_metadataA->Initialize(g_syncInterfaceA); int errCode; // initialize timeSyncA - errCode = g_timeSyncA->Initialize(g_virtualCommunicator, g_metadataA, g_syncInterfaceA, DEVICE_B); + errCode = g_timeSyncA->Initialize(g_virtualCommunicator, g_metadataA, g_syncInterfaceA, DEVICE_B, ""); EXPECT_TRUE(errCode == E_OK); g_metadataB->Initialize(g_syncInterfaceB); // initialize timeSyncB - errCode = g_timeSyncB->Initialize(g_virtualCommunicator, g_metadataB, g_syncInterfaceB, DEVICE_A); + errCode = g_timeSyncB->Initialize(g_virtualCommunicator, g_metadataB, g_syncInterfaceB, DEVICE_A, ""); EXPECT_TRUE(errCode == E_OK); - g_syncTaskContext->Initialize(DEVICE_B, g_syncInterfaceA, g_metadataA, g_virtualCommunicator); + g_syncTaskContext->Initialize({DEVICE_B, ""}, g_syncInterfaceA, g_metadataA, g_virtualCommunicator); g_virtualCommunicator->SetTimeSync(g_timeSyncA.get(), g_timeSyncB.get(), DEVICE_A, g_syncTaskContext); /** * @tc.steps: step2. Disable the virtual communicator @@ -320,12 +320,12 @@ HWTEST_F(DistributedDBTimeSyncTest, InvalidMessgeTest001, TestSize.Level0) g_metadataA->Initialize(g_syncInterfaceA); int errCode; // initialize timeSyncA - errCode = g_timeSyncA->Initialize(g_virtualCommunicator, g_metadataA, g_syncInterfaceA, DEVICE_B); + errCode = g_timeSyncA->Initialize(g_virtualCommunicator, g_metadataA, g_syncInterfaceA, DEVICE_B, ""); EXPECT_TRUE(errCode == E_OK); g_metadataB->Initialize(g_syncInterfaceB); // initialize timeSyncB - errCode = g_timeSyncB->Initialize(g_virtualCommunicator, g_metadataB, g_syncInterfaceB, DEVICE_A); + errCode = g_timeSyncB->Initialize(g_virtualCommunicator, g_metadataB, g_syncInterfaceB, DEVICE_A, ""); EXPECT_TRUE(errCode == E_OK); g_virtualCommunicator->SetTimeSync(g_timeSyncA.get(), g_timeSyncB.get(), DEVICE_A, g_syncTaskContext); @@ -388,14 +388,14 @@ HWTEST_F(DistributedDBTimeSyncTest, InvalidMessgeTest002, TestSize.Level0) g_metadataA->Initialize(g_syncInterfaceA); int errCode; // initialize timeSyncA - errCode = g_timeSyncA->Initialize(g_virtualCommunicator, g_metadataA, g_syncInterfaceA, DEVICE_B); + errCode = g_timeSyncA->Initialize(g_virtualCommunicator, g_metadataA, g_syncInterfaceA, DEVICE_B, ""); EXPECT_TRUE(errCode == E_OK); g_metadataB->Initialize(g_syncInterfaceB); // initialize timeSyncB - errCode = g_timeSyncB->Initialize(g_virtualCommunicator, g_metadataB, g_syncInterfaceB, DEVICE_A); + errCode = g_timeSyncB->Initialize(g_virtualCommunicator, g_metadataB, g_syncInterfaceB, DEVICE_A, ""); EXPECT_TRUE(errCode == E_OK); - g_syncTaskContext->Initialize(DEVICE_B, g_syncInterfaceA, g_metadataA, g_virtualCommunicator); + g_syncTaskContext->Initialize({DEVICE_B, ""}, g_syncInterfaceA, g_metadataA, g_virtualCommunicator); g_virtualCommunicator->SetTimeSync(g_timeSyncA.get(), g_timeSyncB.get(), DEVICE_A, g_syncTaskContext); Message *msg = new (std::nothrow) Message(); @@ -452,14 +452,14 @@ HWTEST_F(DistributedDBTimeSyncTest, SyncTimeout001, TestSize.Level2) // initialize timeSyncA g_metadataA->Initialize(g_syncInterfaceA); int errCode; - errCode = g_timeSyncA->Initialize(g_virtualCommunicator, g_metadataA, g_syncInterfaceA, DEVICE_B); + errCode = g_timeSyncA->Initialize(g_virtualCommunicator, g_metadataA, g_syncInterfaceA, DEVICE_B, ""); EXPECT_TRUE(errCode == E_OK); /** * @tc.steps: step1. Initialize the syncTaskContext * @tc.expected: step1. Initialize syncTaskContext successfully */ - errCode = g_syncTaskContext->Initialize(DEVICE_B, g_syncInterfaceA, g_metadataA, g_virtualCommunicator); + errCode = g_syncTaskContext->Initialize({DEVICE_B, ""}, g_syncInterfaceA, g_metadataA, g_virtualCommunicator); EXPECT_TRUE(errCode == E_OK); /** * @tc.steps: step2. Start the time syc task invoking StartSync() method @@ -481,14 +481,14 @@ HWTEST_F(DistributedDBTimeSyncTest, CheckRemoteVersion001, TestSize.Level0) { // initialize timeSyncA g_metadataA->Initialize(g_syncInterfaceA); - int errCode = g_timeSyncA->Initialize(g_virtualCommunicator, g_metadataA, g_syncInterfaceA, DEVICE_B); + int errCode = g_timeSyncA->Initialize(g_virtualCommunicator, g_metadataA, g_syncInterfaceA, DEVICE_B, ""); EXPECT_EQ(errCode, E_OK); /** * @tc.steps: step1. Initialize the syncTaskContext * @tc.expected: step1. Initialize syncTaskContext successfully */ - errCode = g_syncTaskContext->Initialize(DEVICE_B, g_syncInterfaceA, g_metadataA, g_virtualCommunicator); + errCode = g_syncTaskContext->Initialize({DEVICE_B, ""}, g_syncInterfaceA, g_metadataA, g_virtualCommunicator); EXPECT_EQ(errCode, E_OK); /** * @tc.steps: step2. Check remote version @@ -512,18 +512,18 @@ HWTEST_F(DistributedDBTimeSyncTest, SetTimeSyncFinish001, TestSize.Level0) * @tc.expected: step1. Initialize successfully */ EXPECT_EQ(g_metadataA->Initialize(g_syncInterfaceA), E_OK); - EXPECT_EQ(g_metadataA->SetTimeSyncFinishMark(DEVICE_B, true), E_OK); - int errCode = g_timeSyncA->Initialize(g_virtualCommunicator, g_metadataA, g_syncInterfaceA, DEVICE_B); + EXPECT_EQ(g_metadataA->SetTimeSyncFinishMark(DEVICE_B, "", true), E_OK); + int errCode = g_timeSyncA->Initialize(g_virtualCommunicator, g_metadataA, g_syncInterfaceA, DEVICE_B, ""); EXPECT_EQ(errCode, E_OK); /** * @tc.steps: step2. Set time sync finish * @tc.expected: step2. meta is not finish because time sync cache is finish */ - EXPECT_EQ(g_metadataA->SetTimeSyncFinishMark(DEVICE_B, false), E_OK); + EXPECT_EQ(g_metadataA->SetTimeSyncFinishMark(DEVICE_B, "", false), E_OK); DeviceTimeInfo info; RuntimeContext::GetInstance()->SetDeviceTimeInfo(DEVICE_B, info); g_timeSyncA->SetTimeSyncFinishIfNeed(); - EXPECT_FALSE(g_metadataA->IsTimeSyncFinish(DEVICE_B)); + EXPECT_FALSE(g_metadataA->IsTimeSyncFinish(DEVICE_B, "")); RuntimeContext::GetInstance()->ClearAllDeviceTimeInfo(); } diff --git a/frameworks/libs/distributeddb/test/unittest/common/syncer/generic_virtual_device.cpp b/frameworks/libs/distributeddb/test/unittest/common/syncer/generic_virtual_device.cpp index b68cae6e725fa511b4038f6ec21229fad3360c35..fc2806f7f54f3401d1040fb9936afee2eba11485 100644 --- a/frameworks/libs/distributeddb/test/unittest/common/syncer/generic_virtual_device.cpp +++ b/frameworks/libs/distributeddb/test/unittest/common/syncer/generic_virtual_device.cpp @@ -27,6 +27,7 @@ GenericVirtualDevice::GenericVirtualDevice(std::string deviceId) metadata_(nullptr), deviceId_(std::move(deviceId)), remoteDeviceId_("real_device"), + targetUserId_("targetUser"), context_(nullptr), onRemoteDataChanged_(nullptr), subManager_(nullptr), @@ -110,7 +111,7 @@ int GenericVirtualDevice::Initialize(VirtualCommunicatorAggregator *comAggregato } communicateHandle_->RegOnMessageCallback( std::bind(&GenericVirtualDevice::MessageCallback, this, std::placeholders::_1, std::placeholders::_2), []() {}); - context_->Initialize(remoteDeviceId_, storage_, metadata_, communicateHandle_); + context_->Initialize({remoteDeviceId_, targetUserId_}, storage_, metadata_, communicateHandle_); context_->SetRetryStatus(SyncTaskContext::NO_NEED_RETRY); context_->RegOnSyncTask(std::bind(&GenericVirtualDevice::StartResponseTask, this)); diff --git a/frameworks/libs/distributeddb/test/unittest/common/syncer/generic_virtual_device.h b/frameworks/libs/distributeddb/test/unittest/common/syncer/generic_virtual_device.h index 462dd694848759f92d96c526854e2a3a08b1a209..62dd598933434639c0169482efa4173430b42ac9 100644 --- a/frameworks/libs/distributeddb/test/unittest/common/syncer/generic_virtual_device.h +++ b/frameworks/libs/distributeddb/test/unittest/common/syncer/generic_virtual_device.h @@ -56,6 +56,7 @@ protected: std::shared_ptr metadata_; std::string deviceId_; std::string remoteDeviceId_; + std::string targetUserId_; SyncTaskContext *context_; std::function onRemoteDataChanged_; diff --git a/frameworks/libs/distributeddb/test/unittest/common/syncer/mock_communicator.h b/frameworks/libs/distributeddb/test/unittest/common/syncer/mock_communicator.h index d0340cf87e2d440e04e80d8dc5f2a692ab029c36..8befecd235def143c2b97bdb9af4c70005d43de8 100644 --- a/frameworks/libs/distributeddb/test/unittest/common/syncer/mock_communicator.h +++ b/frameworks/libs/distributeddb/test/unittest/common/syncer/mock_communicator.h @@ -35,6 +35,7 @@ public: MOCK_METHOD2(RegOnMessageCallback, int(const OnMessageCallback &, const Finalizer &)); MOCK_METHOD1(Activate, void(const std::string &)); MOCK_CONST_METHOD1(IsDeviceOnline, bool(const std::string &)); + MOCK_CONST_METHOD1(GetTargetUserId, std::string(const ExtendInfo &)); }; } // namespace DistributedDB #endif // #define MOCK_COMMUNICATOR_H diff --git a/frameworks/libs/distributeddb/test/unittest/common/syncer/mock_meta_data.h b/frameworks/libs/distributeddb/test/unittest/common/syncer/mock_meta_data.h index b9a29d0de497cbd9f8375c998c6831cb824d8b37..10605c1c7de6f8f930bad09b06d949ea8fd999db 100644 --- a/frameworks/libs/distributeddb/test/unittest/common/syncer/mock_meta_data.h +++ b/frameworks/libs/distributeddb/test/unittest/common/syncer/mock_meta_data.h @@ -21,11 +21,11 @@ namespace DistributedDB { class MockMetadata : public Metadata { public: - MOCK_METHOD3(SetLastQueryTime, int(const std::string &, const std::string &, const Timestamp &)); + MOCK_METHOD4(SetLastQueryTime, int(const std::string &, const std::string &, const std::string &, const Timestamp &)); - MOCK_METHOD3(GetLastQueryTime, int(const std::string &, const std::string &, Timestamp &)); + MOCK_METHOD4(GetLastQueryTime, int(const std::string &, const std::string &, const std::string &, Timestamp &)); - MOCK_METHOD2(GetLocalWaterMark, void(const DeviceID &, uint64_t &)); + MOCK_METHOD3(GetLocalWaterMark, void(const DeviceID &, const DeviceID &, uint64_t &)); }; } // namespace DistributedDB #endif // #define MOCK_META_DATA_H \ No newline at end of file diff --git a/frameworks/libs/distributeddb/test/unittest/common/syncer/mock_sync_engine.h b/frameworks/libs/distributeddb/test/unittest/common/syncer/mock_sync_engine.h index 1545ea636e1005dc977e1c5f075cf3f77a1d4721..d79cfe41d86342f83696be7793fe435a56def70d 100644 --- a/frameworks/libs/distributeddb/test/unittest/common/syncer/mock_sync_engine.h +++ b/frameworks/libs/distributeddb/test/unittest/common/syncer/mock_sync_engine.h @@ -29,9 +29,14 @@ public: subManager_ = std::make_shared(); } - ISyncTaskContext *CallGetSyncTaskContext(const std::string &deviceId, int &errCode) + ISyncTaskContext * CallGetSyncTaskContext(const DeviceSyncTarget &target, int &errCode) { - return SyncEngine::GetSyncTaskContext(deviceId, errCode); + return SyncEngine::GetSyncTaskContext(target, errCode); + } + + ISyncTaskContext * CallFindSyncTaskContext(const DeviceSyncTarget &target) + { + return SyncEngine::FindSyncTaskContext(target); } }; } // namespace DistributedDB diff --git a/frameworks/libs/distributeddb/test/unittest/common/syncer/virtual_communicator.cpp b/frameworks/libs/distributeddb/test/unittest/common/syncer/virtual_communicator.cpp index 9d6df07de1fd1977100c2c61aace5d0e6ff8210d..a0384fc2b764145556986798ac016b814d44c57f 100644 --- a/frameworks/libs/distributeddb/test/unittest/common/syncer/virtual_communicator.cpp +++ b/frameworks/libs/distributeddb/test/unittest/common/syncer/virtual_communicator.cpp @@ -209,7 +209,7 @@ VirtualCommunicator::~VirtualCommunicator() VirtualCommunicator::VirtualCommunicator(const std::string &deviceId, VirtualCommunicatorAggregator *communicatorAggregator) - : deviceId_(deviceId), communicatorAggregator_(communicatorAggregator) + : deviceId_(deviceId), communicatorAggregator_(communicatorAggregator), targetUserId_(DBConstant::DEFAULT_USER) { } @@ -236,4 +236,14 @@ void VirtualCommunicator::SetDropMessageTypeByDevice(MessageId msgid, uint32_t d dropMsgTimes_ = 0; } } + +std::string VirtualCommunicator::GetTargetUserId(const ExtendInfo ¶mInfo) const +{ + return targetUserId_; +} + +void VirtualCommunicator::SetTargetUserId(const std::string &userId) +{ + targetUserId_ = userId; +} } // namespace DistributedDB \ No newline at end of file diff --git a/frameworks/libs/distributeddb/test/unittest/common/syncer/virtual_communicator.h b/frameworks/libs/distributeddb/test/unittest/common/syncer/virtual_communicator.h index f904df09802d88e359ae68ddc2ed7aeea6960c3d..9c7778ca199b9182adf458216f91831640cfd96d 100644 --- a/frameworks/libs/distributeddb/test/unittest/common/syncer/virtual_communicator.h +++ b/frameworks/libs/distributeddb/test/unittest/common/syncer/virtual_communicator.h @@ -83,6 +83,9 @@ public: void SetRemoteVersion(uint16_t remoteVersion); + std::string GetTargetUserId(const ExtendInfo ¶mInfo) const override; + + void SetTargetUserId(const std::string &userId); private: int TimeSync(); int DataSync(); @@ -112,6 +115,8 @@ private: uint32_t mtuSize_ = 5 * 1024 * 1024; // 5 * 1024 * 1024B uint16_t remoteVersion_ = UINT16_MAX; + + std::string targetUserId_; }; } // namespace DistributedDB diff --git a/frameworks/libs/distributeddb/test/unittest/common/syncer/virtual_communicator_aggregator.cpp b/frameworks/libs/distributeddb/test/unittest/common/syncer/virtual_communicator_aggregator.cpp index ddc3d9c5c9250da926d4a692e6b0925e7f554edd..50d3ef2f529d3a4e7128a62709980e7992cdd26c 100644 --- a/frameworks/libs/distributeddb/test/unittest/common/syncer/virtual_communicator_aggregator.cpp +++ b/frameworks/libs/distributeddb/test/unittest/common/syncer/virtual_communicator_aggregator.cpp @@ -211,6 +211,7 @@ void VirtualCommunicatorAggregator::DispatchMessageInner(const std::string &srcT uint32_t messageId = inMsg->GetMessageId(); Message *msg = const_cast(inMsg); msg->SetTarget(srcTarget); + msg->SetSenderUserId(communicator->GetTargetUserId({})); RefObject::IncObjRef(communicator); auto onDispatch = onDispatch_; bool isNeedDelay = ((sendDelayTime_ > 0) && (delayTimes_ > 0) && (messageId == delayMessageId_) && diff --git a/frameworks/libs/distributeddb/test/unittest/common/syncer/virtual_relational_ver_sync_db_interface.cpp b/frameworks/libs/distributeddb/test/unittest/common/syncer/virtual_relational_ver_sync_db_interface.cpp index d2fea14c350cb586e54680c1eaeafd4aae6ce8bc..8c5d8f1e69f3c6bfcd3a952c83a2b899aef4a696 100644 --- a/frameworks/libs/distributeddb/test/unittest/common/syncer/virtual_relational_ver_sync_db_interface.cpp +++ b/frameworks/libs/distributeddb/test/unittest/common/syncer/virtual_relational_ver_sync_db_interface.cpp @@ -225,6 +225,19 @@ int VirtualRelationalVerSyncDBInterface::GetMetaData(const Key &key, Value &valu return -E_NOT_FOUND; } +int VirtualRelationalVerSyncDBInterface::GetMetaDataByPrefixKey(const Key &keyPrefix, std::map &data) const +{ + for (const auto &metadata : metadata_) { + if (metadata.first.size() < keyPrefix.size()) { + continue; + } + if (std::equal(keyPrefix.begin(), keyPrefix.end(), metadata.first.begin())) { + data[metadata.first] = metadata.second; + } + } + return data.empty() ? -E_NOT_FOUND : E_OK; +} + int VirtualRelationalVerSyncDBInterface::PutMetaData(const Key &key, const Value &value, bool isInTransaction) { (void)isInTransaction; diff --git a/frameworks/libs/distributeddb/test/unittest/common/syncer/virtual_relational_ver_sync_db_interface.h b/frameworks/libs/distributeddb/test/unittest/common/syncer/virtual_relational_ver_sync_db_interface.h index d1ea9561bff3e914cceda6d314ed19d0a9d6f499..6eab384b6f781e895185de05109b385c0e8a9f60 100644 --- a/frameworks/libs/distributeddb/test/unittest/common/syncer/virtual_relational_ver_sync_db_interface.h +++ b/frameworks/libs/distributeddb/test/unittest/common/syncer/virtual_relational_ver_sync_db_interface.h @@ -73,6 +73,8 @@ public: int GetMetaData(const Key &key, Value &value) const override; + int GetMetaDataByPrefixKey(const Key &keyPrefix, std::map &data) const override; + int PutMetaData(const Key &key, const Value &value, bool isInTransaction) override; int DeleteMetaData(const std::vector &keys) override; diff --git a/frameworks/libs/distributeddb/test/unittest/common/syncer/virtual_single_ver_sync_db_Interface.cpp b/frameworks/libs/distributeddb/test/unittest/common/syncer/virtual_single_ver_sync_db_Interface.cpp index 8ca7d89a1c7300f6a2f29382724a1a02fe0b67a6..0266fecec63c81b87f49f84a95117b75985b0d10 100644 --- a/frameworks/libs/distributeddb/test/unittest/common/syncer/virtual_single_ver_sync_db_Interface.cpp +++ b/frameworks/libs/distributeddb/test/unittest/common/syncer/virtual_single_ver_sync_db_Interface.cpp @@ -102,6 +102,22 @@ int VirtualSingleVerSyncDBInterface::GetMetaData(const Key &key, Value &value) c return -E_NOT_FOUND; } +int VirtualSingleVerSyncDBInterface::GetMetaDataByPrefixKey(const Key &keyPrefix, std::map &data) const +{ + if (readBusy_) { + return -E_BUSY; + } + for (const auto &metadata : metadata_) { + if (metadata.first.size() < keyPrefix.size()) { + continue; + } + if (std::equal(keyPrefix.begin(), keyPrefix.end(), metadata.first.begin())) { + data[metadata.first] = metadata.second; + } + } + return data.empty() ? -E_NOT_FOUND : E_OK; +} + int VirtualSingleVerSyncDBInterface::PutMetaData(const Key &key, const Value &value, bool isInTransaction) { (void)isInTransaction; diff --git a/frameworks/libs/distributeddb/test/unittest/common/syncer/virtual_single_ver_sync_db_Interface.h b/frameworks/libs/distributeddb/test/unittest/common/syncer/virtual_single_ver_sync_db_Interface.h index 20927700b98710b3f8eaae457c543747391c1b72..0efa86284e52780964b28b97c431853fb7c1290c 100644 --- a/frameworks/libs/distributeddb/test/unittest/common/syncer/virtual_single_ver_sync_db_Interface.h +++ b/frameworks/libs/distributeddb/test/unittest/common/syncer/virtual_single_ver_sync_db_Interface.h @@ -54,6 +54,8 @@ public: int GetMetaData(const Key& key, Value& value) const override; + int GetMetaDataByPrefixKey(const Key &keyPrefix, std::map &data) const override; + int PutMetaData(const Key& key, const Value& value, bool isInTransaction) override; int DeleteMetaData(const std::vector &keys) override; diff --git a/frameworks/libs/distributeddb/test/unittest/common/syncer/virtual_time_sync_communicator.cpp b/frameworks/libs/distributeddb/test/unittest/common/syncer/virtual_time_sync_communicator.cpp index 6890e94b4d16fb4d9a1994c6aecc99ad02af73c8..a3a302aed231892549050350ad755c83280f8d9d 100644 --- a/frameworks/libs/distributeddb/test/unittest/common/syncer/virtual_time_sync_communicator.cpp +++ b/frameworks/libs/distributeddb/test/unittest/common/syncer/virtual_time_sync_communicator.cpp @@ -151,4 +151,9 @@ void VirtualTimeSyncCommunicator::SetRemoteVersion(uint16_t remoteVersion) { version_ = remoteVersion; } + +std::string VirtualTimeSyncCommunicator::GetTargetUserId(const ExtendInfo ¶mInfo) const +{ + return ""; +} } // namespace DistributedDB \ No newline at end of file diff --git a/frameworks/libs/distributeddb/test/unittest/common/syncer/virtual_time_sync_communicator.h b/frameworks/libs/distributeddb/test/unittest/common/syncer/virtual_time_sync_communicator.h index 0478c24c01f73d046d32aeea42fe2f41cdf1fa48..c068e1f480c9a40a57ebd08f4d6a236b64b58f15 100644 --- a/frameworks/libs/distributeddb/test/unittest/common/syncer/virtual_time_sync_communicator.h +++ b/frameworks/libs/distributeddb/test/unittest/common/syncer/virtual_time_sync_communicator.h @@ -72,6 +72,8 @@ public: void SetRemoteVersion(uint16_t remoteVersion); + std::string GetTargetUserId(const ExtendInfo ¶mInfo) const override; + private: TimeSync *srcTimeSync_; TimeSync *dstTimeSync_;