From 93d247ed60a5c634129a1c165c6fa8884fc994a5 Mon Sep 17 00:00:00 2001 From: bluhuang Date: Sun, 25 Jun 2023 19:06:56 +0800 Subject: [PATCH] optimize clean cloud data Signed-off-by: bluhuang --- .../syncer/src/cloud/cloud_syncer.cpp | 64 ++++++++++++++++--- .../syncer/src/cloud/cloud_syncer.h | 6 ++ 2 files changed, 61 insertions(+), 9 deletions(-) diff --git a/frameworks/libs/distributeddb/syncer/src/cloud/cloud_syncer.cpp b/frameworks/libs/distributeddb/syncer/src/cloud/cloud_syncer.cpp index 0bd0e04ad60..ca70b02bd6e 100644 --- a/frameworks/libs/distributeddb/syncer/src/cloud/cloud_syncer.cpp +++ b/frameworks/libs/distributeddb/syncer/src/cloud/cloud_syncer.cpp @@ -2099,42 +2099,88 @@ void CloudSyncer::ClearCloudSyncData(CloudSyncData &uploadData) std::vector().swap(uploadData.delData.extend); } +int CloudSyncer::RecordCloudWaterMark(const std::vector &tableNameList, + std::vector &cloudWaterMarkSet) +{ + for (const auto &tableName: tableNameList) { + CloudWaterMark waterMark; + int ret = storageProxy_->GetCloudWaterMark(tableName, waterMark); + if (ret != E_OK) { + LOGE("[CloudSyncer] Failed to get cloud water mark before clean cloud data, %d.", ret); + return ret; + } + cloudWaterMarkSet.push_back(waterMark); + } + return E_OK; +} + +int CloudSyncer::ResetCloudWaterMark(const std::vector &tableNameList, + std::vector &cloudWaterMarkSet) +{ + if (tableNameList.size() != cloudWaterMarkSet.size()) { + LOGE("[CloudSyncer] Size of table name list is not the same as size of cloud water mark set."); + return -E_INTERNAL_ERROR; + } + for (size_t i = 0; i < tableNameList.size(); i++) { + LOGI("[CloudSyncer] Start to reset water name, table index: %d.", i); + int ret = storageProxy_->PutCloudWaterMark(tableNameList.at(i), cloudWaterMarkSet.at(i)); + if (ret != E_OK) { + LOGE("Failed to reset cloud water mark, table index: %d., errcode: ", i, ret); + return ret; + } + } + return E_OK; +} + int CloudSyncer::CleanCloudData(ClearMode mode, const std::vector &tableNameList) { std::lock_guard lock(syncMutex_); std::string emptyString; int index = 1; + std::vector cloudWaterMarkSet; + std::vector assets; + + int errCode = RecordCloudWaterMark(tableNameList, cloudWaterMarkSet); + if (errCode != E_OK) { + LOGE("[CloudSyncer] Failed to record cloud water mark before clean cloud data, %d.", errCode); + return errCode; + } for (const auto &tableName: tableNameList) { LOGD("[CloudSyncer] Start clean cloud water mark. table index: %d.", index); - int ret = storageProxy_->PutCloudWaterMark(tableName, emptyString); - if (ret != E_OK) { - LOGE("[CloudSyncer] failed to put cloud water mark after clean cloud data, %d.", ret); - return ret; + errCode = storageProxy_->PutCloudWaterMark(tableName, emptyString); + if (errCode != E_OK) { + LOGE("[CloudSyncer] failed to put cloud water mark after clean cloud data, %d.", errCode); + goto RESET_WATER_MARK_EXIT; } index++; } - int errCode = storageProxy_->StartTransaction(TransactType::IMMEDIATE); + errCode = storageProxy_->StartTransaction(TransactType::IMMEDIATE); if (errCode != E_OK) { LOGE("[CloudSyncer] failed to start Transaction before clean cloud data, %d", errCode); - return errCode; + goto RESET_WATER_MARK_EXIT; } - std::vector assets; errCode = storageProxy_->CleanCloudData(mode, tableNameList, assets); if (errCode != E_OK) { LOGE("[CloudSyncer] failed to clean cloud data, %d.", errCode); storageProxy_->Rollback(); - return errCode; + goto RESET_WATER_MARK_EXIT; } errCode = cloudDB_.RemoveLocalAssets(assets); if (errCode != E_OK) { LOGE("[Storage Executor] failed to remove local assets, %d.", errCode); storageProxy_->Rollback(); - return errCode; + goto RESET_WATER_MARK_EXIT; } storageProxy_->Commit(); + return errCode; +RESET_WATER_MARK_EXIT: + int ret = ResetCloudWaterMark(tableNameList, cloudWaterMarkSet); + if (ret != E_OK) { + LOGE("[CloudSyncer] Failed to reset cloud water mark: %d, and clean cloud data also failed: %d", ret, errCode); + } return errCode; } diff --git a/frameworks/libs/distributeddb/syncer/src/cloud/cloud_syncer.h b/frameworks/libs/distributeddb/syncer/src/cloud/cloud_syncer.h index afd6956d6d1..b544f55363e 100644 --- a/frameworks/libs/distributeddb/syncer/src/cloud/cloud_syncer.h +++ b/frameworks/libs/distributeddb/syncer/src/cloud/cloud_syncer.h @@ -48,6 +48,12 @@ public: int CleanCloudData(ClearMode mode, const std::vector &tableNameList); + int RecordCloudWaterMark(const std::vector &tableNameList, + std::vector &cloudWaterMarkSet); + + int ResetCloudWaterMark(const std::vector &tableNameList, + std::vector &cloudWaterMarkSet); + void Close(); protected: using TaskId = uint64_t; -- Gitee