1 /*
2 * Copyright (c) 2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15 #include "single_ver_data_sync_utils.h"
16
17 #include <mutex>
18 #include "db_common.h"
19 #include "version.h"
20 #include "log_print.h"
21 #include "message.h"
22 namespace DistributedDB {
23 namespace {
FillPermissionCheckParam(const SyncGenericInterface * storage,int mode,PermissionCheckParam & param,uint8_t & flag)24 void FillPermissionCheckParam(const SyncGenericInterface* storage, int mode, PermissionCheckParam ¶m, uint8_t &flag)
25 {
26 param.appId = storage->GetDbProperties().GetStringProp(DBProperties::APP_ID, "");
27 param.userId = storage->GetDbProperties().GetStringProp(DBProperties::USER_ID, "");
28 param.storeId = storage->GetDbProperties().GetStringProp(DBProperties::STORE_ID, "");
29 param.instanceId = storage->GetDbProperties().GetIntProp(DBProperties::INSTANCE_ID, 0);
30 switch (mode) {
31 case SyncModeType::PUSH:
32 flag = CHECK_FLAG_RECEIVE;
33 break;
34 case SyncModeType::PULL:
35 flag = CHECK_FLAG_SEND;
36 break;
37 case SyncModeType::PUSH_AND_PULL:
38 flag = CHECK_FLAG_SEND | CHECK_FLAG_RECEIVE;
39 break;
40 default:
41 flag = CHECK_FLAG_RECEIVE;
42 break;
43 }
44 }
45 }
46
QuerySyncCheck(const SingleVerSyncTaskContext * context,bool & isCheckStatus)47 int SingleVerDataSyncUtils::QuerySyncCheck(const SingleVerSyncTaskContext *context, bool &isCheckStatus)
48 {
49 if (context == nullptr) {
50 isCheckStatus = false;
51 return -E_INVALID_ARGS;
52 }
53 if (!context->IsQuerySync()) {
54 isCheckStatus = true;
55 return E_OK;
56 }
57 uint32_t version = std::min(context->GetRemoteSoftwareVersion(), SOFTWARE_VERSION_CURRENT);
58 // for 101 version, no need to do abilitySync, just send request to remote
59 if (version <= SOFTWARE_VERSION_RELEASE_1_0) {
60 isCheckStatus = true;
61 return E_OK;
62 }
63 if (version < SOFTWARE_VERSION_RELEASE_4_0) {
64 LOGE("[SingleVerDataSync] not support query sync when remote ver lower than 104");
65 isCheckStatus = false;
66 return E_OK;
67 }
68 if (version < SOFTWARE_VERSION_RELEASE_5_0 && !(context->GetQuery().IsQueryOnlyByKey())) {
69 LOGE("[SingleVerDataSync] remote version only support prefix key");
70 isCheckStatus = false;
71 return E_OK;
72 }
73 if (context->GetQuery().HasInKeys() && context->IsNotSupportAbility(SyncConfig::INKEYS_QUERY)) {
74 isCheckStatus = false;
75 return E_OK;
76 }
77 isCheckStatus = true;
78 return E_OK;
79 }
80
AckMsgErrnoCheck(const SingleVerSyncTaskContext * context,const Message * message)81 int SingleVerDataSyncUtils::AckMsgErrnoCheck(const SingleVerSyncTaskContext *context, const Message *message)
82 {
83 if (context == nullptr || message == nullptr) {
84 return -E_INVALID_ARGS;
85 }
86 if (message->IsFeedbackError()) {
87 LOGE("[DataSync][AckMsgErrnoCheck] message errNo=%d", message->GetErrorNo());
88 return -static_cast<int>(message->GetErrorNo());
89 }
90 return E_OK;
91 }
92
RequestQueryCheck(const DataRequestPacket * packet,SyncGenericInterface * storage)93 int SingleVerDataSyncUtils::RequestQueryCheck(const DataRequestPacket *packet, SyncGenericInterface *storage)
94 {
95 if (storage == nullptr || packet == nullptr) {
96 return -E_INVALID_ARGS;
97 }
98 if (SyncOperation::GetSyncType(packet->GetMode()) != SyncType::QUERY_SYNC_TYPE) {
99 return E_OK;
100 }
101 QuerySyncObject syncQuery = packet->GetQuery();
102 int errCode = storage->CheckAndInitQueryCondition(syncQuery);
103 if (errCode != E_OK) {
104 LOGE("[SingleVerDataSync] check sync query failed,errCode=%d", errCode);
105 return errCode;
106 }
107 return E_OK;
108 }
109
IsPermitLocalDeviceRecvData(const std::string & deviceId,const SecurityOption & remoteSecOption)110 bool SingleVerDataSyncUtils::IsPermitLocalDeviceRecvData(const std::string &deviceId,
111 const SecurityOption &remoteSecOption)
112 {
113 return RuntimeContext::GetInstance()->CheckDeviceSecurityAbility(deviceId, remoteSecOption);
114 }
115
IsPermitRemoteDeviceRecvData(const std::string & deviceId,const SecurityOption & remoteSecOption,SyncGenericInterface * storage)116 bool SingleVerDataSyncUtils::IsPermitRemoteDeviceRecvData(const std::string &deviceId,
117 const SecurityOption &remoteSecOption, SyncGenericInterface *storage)
118 {
119 if (storage == nullptr) {
120 return -E_INVALID_ARGS;
121 }
122 SecurityOption localSecOption;
123 if (remoteSecOption.securityLabel == NOT_SURPPORT_SEC_CLASSIFICATION) {
124 return true;
125 }
126 int errCode = storage->GetSecurityOption(localSecOption);
127 if (errCode == -E_NOT_SUPPORT) {
128 return true;
129 }
130 return RuntimeContext::GetInstance()->CheckDeviceSecurityAbility(deviceId, localSecOption);
131 }
132
TransDbDataItemToSendDataItem(const std::string & localHashName,std::vector<SendDataItem> & outData)133 void SingleVerDataSyncUtils::TransDbDataItemToSendDataItem(const std::string &localHashName,
134 std::vector<SendDataItem> &outData)
135 {
136 for (size_t i = 0; i < outData.size(); i++) {
137 if (outData[i] == nullptr) {
138 continue;
139 }
140 outData[i]->SetOrigDevice(outData[i]->GetOrigDevice().empty() ? localHashName : outData[i]->GetOrigDevice());
141 if (i == 0 || i == (outData.size() - 1)) {
142 LOGD("[DataSync][TransToSendItem] printData packet=%zu,timestamp=%" PRIu64 ",flag=%" PRIu64, i,
143 outData[i]->GetTimestamp(), outData[i]->GetFlag());
144 }
145 }
146 }
147
TransferForeignOrigDevName(const std::string & deviceName,const std::string & localHashName)148 std::string SingleVerDataSyncUtils::TransferForeignOrigDevName(const std::string &deviceName,
149 const std::string &localHashName)
150 {
151 if (localHashName == deviceName) {
152 return "";
153 }
154 return deviceName;
155 }
156
TransSendDataItemToLocal(const SingleVerSyncTaskContext * context,const std::string & localHashName,const std::vector<SendDataItem> & data)157 void SingleVerDataSyncUtils::TransSendDataItemToLocal(const SingleVerSyncTaskContext *context,
158 const std::string &localHashName, const std::vector<SendDataItem> &data)
159 {
160 TimeOffset offset = context->GetTimeOffset();
161 for (auto &item : data) {
162 if (item == nullptr) {
163 continue;
164 }
165 item->SetOrigDevice(TransferForeignOrigDevName(item->GetOrigDevice(), localHashName));
166 Timestamp tempTimestamp = item->GetTimestamp();
167 Timestamp tempWriteTimestamp = item->GetWriteTimestamp();
168 item->SetTimestamp(tempTimestamp - static_cast<Timestamp>(offset));
169 if (tempWriteTimestamp != 0) {
170 item->SetWriteTimestamp(tempWriteTimestamp - static_cast<Timestamp>(offset));
171 }
172
173 Timestamp currentLocalTime = context->GetCurrentLocalTime();
174 if (item->GetTimestamp() > currentLocalTime) {
175 item->SetTimestamp(currentLocalTime);
176 }
177 if (item->GetWriteTimestamp() > currentLocalTime) {
178 item->SetWriteTimestamp(currentLocalTime);
179 }
180 }
181 }
182
TranslateErrCodeIfNeed(int mode,uint32_t version,int & errCode)183 void SingleVerDataSyncUtils::TranslateErrCodeIfNeed(int mode, uint32_t version, int &errCode)
184 {
185 // once get data occur E_EKEYREVOKED error, should also send request to remote dev to pull data.
186 if (SyncOperation::TransferSyncMode(mode) == SyncModeType::PUSH_AND_PULL &&
187 version > SOFTWARE_VERSION_RELEASE_2_0 && errCode == -E_EKEYREVOKED) {
188 errCode = E_OK;
189 }
190 }
191
RunPermissionCheck(SingleVerSyncTaskContext * context,const SyncGenericInterface * storage,const std::string & label,const DataRequestPacket * packet)192 int SingleVerDataSyncUtils::RunPermissionCheck(SingleVerSyncTaskContext *context, const SyncGenericInterface* storage,
193 const std::string &label, const DataRequestPacket *packet)
194 {
195 int mode = SyncOperation::TransferSyncMode(packet->GetMode());
196 return RunPermissionCheckInner(context, storage, label, packet, mode);
197 }
198
RunPermissionCheck(SingleVerSyncTaskContext * context,const SyncGenericInterface * storage,const std::string & label,int mode)199 int SingleVerDataSyncUtils::RunPermissionCheck(SingleVerSyncTaskContext *context, const SyncGenericInterface* storage,
200 const std::string &label, int mode)
201 {
202 return RunPermissionCheckInner(context, storage, label, nullptr, mode);
203 }
204
CheckPermitReceiveData(const SingleVerSyncTaskContext * context,const ICommunicator * communicator,const SyncGenericInterface * storage)205 bool SingleVerDataSyncUtils::CheckPermitReceiveData(const SingleVerSyncTaskContext *context,
206 const ICommunicator *communicator, const SyncGenericInterface *storage)
207 {
208 if (storage == nullptr) {
209 LOGE("[DataSync] storage is nullptr when check receive data");
210 return false;
211 }
212 // check memory db here because remote maybe low version
213 // it will send option with not set rather than not support when remote is memory db
214 bool memory = storage->GetDbProperties().GetBoolProp(KvDBProperties::MEMORY_MODE, false);
215 if (memory) {
216 LOGE("[DataSync] skip check receive data because local is memory db");
217 return true;
218 }
219 SecurityOption remoteSecOption = context->GetRemoteSeccurityOption();
220 std::string localDeviceId;
221 if (communicator == nullptr || remoteSecOption.securityLabel == NOT_SURPPORT_SEC_CLASSIFICATION) {
222 return true;
223 }
224 communicator->GetLocalIdentity(localDeviceId);
225 bool isPermitSync = SingleVerDataSyncUtils::IsPermitLocalDeviceRecvData(localDeviceId, remoteSecOption);
226 if (isPermitSync) {
227 return isPermitSync;
228 }
229 LOGE("[DataSync][PermitReceiveData] check failed: permitReceive=%d, localDev=%s, seclabel=%d, secflag=%d",
230 isPermitSync, STR_MASK(localDeviceId), remoteSecOption.securityLabel, remoteSecOption.securityFlag);
231 return isPermitSync;
232 }
233
SetPacketId(DataRequestPacket * packet,SingleVerSyncTaskContext * context,uint32_t version)234 void SingleVerDataSyncUtils::SetPacketId(DataRequestPacket *packet, SingleVerSyncTaskContext *context, uint32_t version)
235 {
236 if (version > SOFTWARE_VERSION_RELEASE_2_0) {
237 context->IncPacketId(); // begin from 1
238 std::vector<uint64_t> reserved {context->GetPacketId()};
239 packet->SetReserved(reserved);
240 }
241 }
242
GetMessageId(SyncType syncType)243 int SingleVerDataSyncUtils::GetMessageId(SyncType syncType)
244 {
245 if (syncType == SyncType::QUERY_SYNC_TYPE) {
246 return QUERY_SYNC_MESSAGE;
247 }
248 return DATA_SYNC_MESSAGE;
249 }
250
PushAndPullKeyRevokHandle(SingleVerSyncTaskContext * context)251 void SingleVerDataSyncUtils::PushAndPullKeyRevokHandle(SingleVerSyncTaskContext *context)
252 {
253 // for push_and_pull mode it may be EKEYREVOKED error before receive watermarkexception
254 // should clear errCode and restart pushpull request.
255 int mode = SyncOperation::TransferSyncMode(context->GetMode());
256 if (context->GetRemoteSoftwareVersion() > SOFTWARE_VERSION_RELEASE_2_0 && mode == SyncModeType::PUSH_AND_PULL &&
257 context->GetTaskErrCode() == -E_EKEYREVOKED) {
258 context->SetTaskErrCode(E_OK);
259 }
260 }
261
GetReSendMode(int mode,uint32_t sequenceId,SyncType syncType)262 int SingleVerDataSyncUtils::GetReSendMode(int mode, uint32_t sequenceId, SyncType syncType)
263 {
264 int curMode = SyncOperation::TransferSyncMode(mode);
265 if (curMode == SyncModeType::PUSH || curMode == SyncModeType::PULL) {
266 return mode;
267 }
268 if (curMode == SyncModeType::RESPONSE_PULL) {
269 return (syncType == SyncType::QUERY_SYNC_TYPE) ? SyncModeType::QUERY_PUSH : SyncModeType::PUSH;
270 }
271 // set push_and_pull mode when resend first sequenceId to inform remote to run RESPONSE_PULL task
272 // for sequenceId which is larger than first, only need to send data, means to set push or query_push mode
273 if (sequenceId == 1) {
274 return (syncType == SyncType::QUERY_SYNC_TYPE) ? SyncModeType::QUERY_PUSH_PULL : SyncModeType::PUSH_AND_PULL;
275 }
276 return (syncType == SyncType::QUERY_SYNC_TYPE) ? SyncModeType::QUERY_PUSH : SyncModeType::PUSH;
277 }
278
FillControlRequestPacket(ControlRequestPacket * packet,SingleVerSyncTaskContext * context)279 void SingleVerDataSyncUtils::FillControlRequestPacket(ControlRequestPacket *packet, SingleVerSyncTaskContext *context)
280 {
281 uint32_t version = std::min(context->GetRemoteSoftwareVersion(), SOFTWARE_VERSION_CURRENT);
282 uint32_t flag = 0;
283 if (context->GetMode() == SyncModeType::SUBSCRIBE_QUERY && context->IsAutoSubscribe()) {
284 flag = SubscribeRequest::IS_AUTO_SUBSCRIBE;
285 }
286 packet->SetPacketHead(E_OK, version, GetControlCmdType(context->GetMode()), flag);
287 packet->SetQuery(context->GetQuery());
288 }
289
GetControlCmdType(int mode)290 ControlCmdType SingleVerDataSyncUtils::GetControlCmdType(int mode)
291 {
292 if (mode == SyncModeType::SUBSCRIBE_QUERY) {
293 return ControlCmdType::SUBSCRIBE_QUERY_CMD;
294 } else if (mode == SyncModeType::UNSUBSCRIBE_QUERY) {
295 return ControlCmdType::UNSUBSCRIBE_QUERY_CMD;
296 }
297 return ControlCmdType::INVALID_CONTROL_CMD;
298 }
299
GetModeByControlCmdType(ControlCmdType controlCmd)300 int SingleVerDataSyncUtils::GetModeByControlCmdType(ControlCmdType controlCmd)
301 {
302 if (controlCmd == ControlCmdType::SUBSCRIBE_QUERY_CMD) {
303 return SyncModeType::SUBSCRIBE_QUERY;
304 } else if (controlCmd == ControlCmdType::UNSUBSCRIBE_QUERY_CMD) {
305 return SyncModeType::UNSUBSCRIBE_QUERY;
306 }
307 return SyncModeType::INVALID_MODE;
308 }
309
IsNeedTriggerQueryAutoSync(Message * inMsg,QuerySyncObject & query)310 bool SingleVerDataSyncUtils::IsNeedTriggerQueryAutoSync(Message *inMsg, QuerySyncObject &query)
311 {
312 if (inMsg == nullptr) {
313 return false;
314 }
315 if (inMsg->GetMessageId() != CONTROL_SYNC_MESSAGE) {
316 return false;
317 }
318 const ControlRequestPacket *packet = inMsg->GetObject<ControlRequestPacket>();
319 if (packet == nullptr) {
320 return false;
321 }
322 uint32_t controlCmdType = packet->GetcontrolCmdType();
323 if (controlCmdType == ControlCmdType::SUBSCRIBE_QUERY_CMD && inMsg->GetMessageType() == TYPE_REQUEST) {
324 const SubscribeRequest *subPacket = inMsg->GetObject<SubscribeRequest>();
325 if (subPacket == nullptr) {
326 return false;
327 }
328 query = subPacket->GetQuery();
329 LOGI("[SingleVerDataSync] receive sub scribe query cmd,begin to trigger query auto sync");
330 return true;
331 }
332 return false;
333 }
334
ControlAckErrorHandle(const SingleVerSyncTaskContext * context,const std::shared_ptr<SubscribeManager> & subManager)335 void SingleVerDataSyncUtils::ControlAckErrorHandle(const SingleVerSyncTaskContext *context,
336 const std::shared_ptr<SubscribeManager> &subManager)
337 {
338 if (context->GetMode() == SyncModeType::SUBSCRIBE_QUERY) {
339 // reserve before need clear
340 subManager->DeleteLocalSubscribeQuery(context->GetDeviceId(), context->GetQuery());
341 }
342 }
343
SetMessageHeadInfo(Message & message,uint16_t inMsgType,const std::string & inTarget,uint32_t inSequenceId,uint32_t inSessionId)344 void SingleVerDataSyncUtils::SetMessageHeadInfo(Message &message, uint16_t inMsgType, const std::string &inTarget,
345 uint32_t inSequenceId, uint32_t inSessionId)
346 {
347 message.SetMessageType(inMsgType);
348 message.SetTarget(inTarget);
349 message.SetSequenceId(inSequenceId);
350 message.SetSessionId(inSessionId);
351 }
352
IsGetDataSuccessfully(int errCode)353 bool SingleVerDataSyncUtils::IsGetDataSuccessfully(int errCode)
354 {
355 return (errCode == E_OK || errCode == -E_UNFINISHED);
356 }
357
GetMaxSendDataTime(const std::vector<SendDataItem> & inData)358 Timestamp SingleVerDataSyncUtils::GetMaxSendDataTime(const std::vector<SendDataItem> &inData)
359 {
360 Timestamp stamp = 0;
361 for (size_t i = 0; i < inData.size(); i++) {
362 if (inData[i] == nullptr) {
363 continue;
364 }
365 Timestamp tempStamp = inData[i]->GetTimestamp();
366 if (stamp < tempStamp) {
367 stamp = tempStamp;
368 }
369 }
370 return stamp;
371 }
372
GetFullSyncDataTimeRange(const std::vector<SendDataItem> & inData,WaterMark localMark,UpdateWaterMark & isUpdate)373 SyncTimeRange SingleVerDataSyncUtils::GetFullSyncDataTimeRange(const std::vector<SendDataItem> &inData,
374 WaterMark localMark, UpdateWaterMark &isUpdate)
375 {
376 Timestamp maxTimestamp = localMark;
377 Timestamp minTimestamp = localMark;
378 for (size_t i = 0; i < inData.size(); i++) {
379 if (inData[i] == nullptr) {
380 continue;
381 }
382 Timestamp tempStamp = inData[i]->GetTimestamp();
383 if (maxTimestamp < tempStamp) {
384 maxTimestamp = tempStamp;
385 }
386 if (minTimestamp > tempStamp) {
387 minTimestamp = tempStamp;
388 }
389 isUpdate.normalUpdateMark = true;
390 }
391 return {minTimestamp, 0, maxTimestamp, 0};
392 }
393
GetQuerySyncDataTimeRange(const std::vector<SendDataItem> & inData,WaterMark localMark,WaterMark deleteLocalMark,UpdateWaterMark & isUpdate)394 SyncTimeRange SingleVerDataSyncUtils::GetQuerySyncDataTimeRange(const std::vector<SendDataItem> &inData,
395 WaterMark localMark, WaterMark deleteLocalMark, UpdateWaterMark &isUpdate)
396 {
397 SyncTimeRange dataTimeRange = {localMark, deleteLocalMark, localMark, deleteLocalMark};
398 for (size_t i = 0; i < inData.size(); i++) {
399 if (inData[i] == nullptr) {
400 continue;
401 }
402 Timestamp tempStamp = inData[i]->GetTimestamp();
403 if ((inData[i]->GetFlag() & DataItem::DELETE_FLAG) == 0) { // query data
404 if (dataTimeRange.endTime < tempStamp) {
405 dataTimeRange.endTime = tempStamp;
406 }
407 if (dataTimeRange.beginTime > tempStamp) {
408 dataTimeRange.beginTime = tempStamp;
409 }
410 isUpdate.normalUpdateMark = true;
411 }
412 if ((inData[i]->GetFlag() & DataItem::DELETE_FLAG) != 0) { // delete data
413 if (dataTimeRange.deleteEndTime < tempStamp) {
414 dataTimeRange.deleteEndTime = tempStamp;
415 }
416 if (dataTimeRange.deleteBeginTime > tempStamp) {
417 dataTimeRange.deleteBeginTime = tempStamp;
418 }
419 isUpdate.deleteUpdateMark = true;
420 }
421 }
422 return dataTimeRange;
423 }
424
ReviseLocalMark(SyncType syncType,const SyncTimeRange & dataTimeRange,UpdateWaterMark updateMark)425 SyncTimeRange SingleVerDataSyncUtils::ReviseLocalMark(SyncType syncType, const SyncTimeRange &dataTimeRange,
426 UpdateWaterMark updateMark)
427 {
428 SyncTimeRange tmpDataTime = dataTimeRange;
429 if (updateMark.deleteUpdateMark && syncType == SyncType::QUERY_SYNC_TYPE) {
430 tmpDataTime.deleteEndTime += 1;
431 }
432 if (updateMark.normalUpdateMark) {
433 tmpDataTime.endTime += 1;
434 }
435 return tmpDataTime;
436 }
437
GetRecvDataTimeRange(SyncType syncType,const std::vector<SendDataItem> & data,UpdateWaterMark & isUpdate)438 SyncTimeRange SingleVerDataSyncUtils::GetRecvDataTimeRange(SyncType syncType,
439 const std::vector<SendDataItem> &data, UpdateWaterMark &isUpdate)
440 {
441 if (syncType != SyncType::QUERY_SYNC_TYPE) {
442 return SingleVerDataSyncUtils::GetFullSyncDataTimeRange(data, 0, isUpdate);
443 }
444 return SingleVerDataSyncUtils::GetQuerySyncDataTimeRange(data, 0, 0, isUpdate);
445 }
446
GetSyncDataTimeRange(SyncType syncType,WaterMark localMark,WaterMark deleteMark,const std::vector<SendDataItem> & inData,UpdateWaterMark & isUpdate)447 SyncTimeRange SingleVerDataSyncUtils::GetSyncDataTimeRange(SyncType syncType, WaterMark localMark, WaterMark deleteMark,
448 const std::vector<SendDataItem> &inData, UpdateWaterMark &isUpdate)
449 {
450 if (syncType != SyncType::QUERY_SYNC_TYPE) {
451 return SingleVerDataSyncUtils::GetFullSyncDataTimeRange(inData, localMark, isUpdate);
452 }
453 return SingleVerDataSyncUtils::GetQuerySyncDataTimeRange(inData, localMark, deleteMark, isUpdate);
454 }
455
RunPermissionCheckInner(const SingleVerSyncTaskContext * context,const SyncGenericInterface * storage,const std::string & label,const DataRequestPacket * packet,int mode)456 int SingleVerDataSyncUtils::RunPermissionCheckInner(const SingleVerSyncTaskContext *context,
457 const SyncGenericInterface* storage, const std::string &label, const DataRequestPacket *packet, int mode)
458 {
459 PermissionCheckParam param;
460 uint8_t flag = 0u;
461 FillPermissionCheckParam(storage, mode, param, flag);
462 param.deviceId = context->GetDeviceId();
463 if (packet != nullptr) {
464 param.extraConditions = packet->GetExtraConditions();
465 }
466 int errCode = RuntimeContext::GetInstance()->RunPermissionCheck(param, flag);
467 if (errCode != E_OK) {
468 LOGE("[DataSync][RunPermissionCheck] check failed flag=%" PRIu8 ",Label=%s,dev=%s", flag, label.c_str(),
469 STR_MASK(context->GetDeviceId()));
470 }
471 return errCode;
472 }
473 }