diff --git a/frameworks/native/cloud_file_kit_inner/src/cloud_asset_read_session.cpp b/frameworks/native/cloud_file_kit_inner/src/cloud_asset_read_session.cpp index 748991327cdfd918bb1134f92a51a93c77195a6c..e87e6b818b6e05fd5148d13f455f8c8dd18e2850 100644 --- a/frameworks/native/cloud_file_kit_inner/src/cloud_asset_read_session.cpp +++ b/frameworks/native/cloud_file_kit_inner/src/cloud_asset_read_session.cpp @@ -42,6 +42,11 @@ int64_t CloudAssetReadSession::PRead(int64_t offset, return E_OK; } +void CloudAssetReadSession::CancelSession() +{ + return; +} + bool CloudAssetReadSession::Close(bool needRemain) { return true; diff --git a/interfaces/inner_api/native/cloud_file_kit_inner/cloud_asset_read_session.h b/interfaces/inner_api/native/cloud_file_kit_inner/cloud_asset_read_session.h index 384e574f162ac4d46a3b75c354869ce1ec6cce46..1650f9002b506260727bac1f033eae7d3e470ad2 100644 --- a/interfaces/inner_api/native/cloud_file_kit_inner/cloud_asset_read_session.h +++ b/interfaces/inner_api/native/cloud_file_kit_inner/cloud_asset_read_session.h @@ -35,6 +35,7 @@ public: char *buffer, CloudError &error, const std::string appId = ""); + virtual void CancelSession(); virtual bool Close(bool needRemain = false); virtual void SentPrepareTraceId(std::string prepareTraceId); virtual bool Catch(CloudError &error, uint32_t catchTimeOutPara); diff --git a/services/cloudfiledaemon/src/fuse_manager/fuse_manager.cpp b/services/cloudfiledaemon/src/fuse_manager/fuse_manager.cpp index 4f978544441b628dcde07f9c06099b33694942b9..589743e4666d080436626ef01675a3d1bf88a122 100644 --- a/services/cloudfiledaemon/src/fuse_manager/fuse_manager.cpp +++ b/services/cloudfiledaemon/src/fuse_manager/fuse_manager.cpp @@ -900,6 +900,7 @@ static int DoCloudOpen(shared_ptr cInode, struct fuse_file_info *fi, " prepareTraceId: " + prepareTraceId; CLOUD_FILE_FAULT_REPORT(CloudFileFaultInfo{PHOTOS_BUNDLE_NAME, FaultOperation::OPEN, FaultType::OPEN_CLOUD_FILE_TIMEOUT, ENETUNREACH, msg}); + cInode->readSession->CancelSession(); return -ENETUNREACH; } return HandleOpenResult(*error, data, cInode, fi); @@ -1083,16 +1084,19 @@ static void CloudRelease(fuse_req_t req, fuse_ino_t ino, struct fuse_file_info * return; } std::unique_lock wSesLock(cInode->sessionLock, std::defer_lock); - LOGI("%{public}d release %{public}s, sessionRefCount: %{public}d", pid, - GetAnonyString(cInode->path).c_str(), cInode->sessionRefCount.load()); + LOGI("%{public}d release %{public}s, sessionRefCount: %{public}d, fileType: %{public}d", pid, + GetAnonyString(cInode->path).c_str(), cInode->sessionRefCount.load(), cInode->mBase->fileType); wSesLock.lock(); cInode->sessionRefCount--; auto cloudFdInfo = FindKeyInCloudFdCache(data, fi->fh); DeleteFdsan(cloudFdInfo); EraseCloudFdCache(data, fi->fh); if (cInode->sessionRefCount == 0) { - if (cInode->mBase->fileType == FILE_TYPE_CONTENT && (!cInode->readSession->Close(false))) { - LOGE("Failed to close readSession"); + if (cInode->mBase->fileType == FILE_TYPE_CONTENT) { + cInode->readSession->CancelSession(); + if (!cInode->readSession->Close(false)) { + LOGE("Failed to close readSession"); + } } cInode->readSession = nullptr; cInode->readCacheMap.clear();