| Index: chrome/browser/chromeos/drive/drive_cache.cc
|
| diff --git a/chrome/browser/chromeos/drive/drive_cache.cc b/chrome/browser/chromeos/drive/drive_cache.cc
|
| index ba8c5fe1c94692ec77d223e7dbdb82ab769a1242..6bee15ec4be7e70ac479bfcdeb5e39fcb88efa77 100644
|
| --- a/chrome/browser/chromeos/drive/drive_cache.cc
|
| +++ b/chrome/browser/chromeos/drive/drive_cache.cc
|
| @@ -105,63 +105,49 @@ void RemoveAllFiles(const FilePath& directory) {
|
| }
|
| }
|
|
|
| -// Modifies cache state of file on blocking pool, which involves:
|
| -// - moving or copying file (per |file_operation_type|) from |source_path| to
|
| -// |dest_path| if they're different
|
| -// - deleting symlink if |symlink_path| is not empty
|
| -// - creating symlink if |symlink_path| is not empty and |create_symlink| is
|
| -// true.
|
| -DriveFileError ModifyCacheState(
|
| - const FilePath& source_path,
|
| - const FilePath& dest_path,
|
| - DriveCache::FileOperationType file_operation_type,
|
| - const FilePath& symlink_path,
|
| - bool create_symlink) {
|
| - // Move or copy |source_path| to |dest_path| if they are different.
|
| - if (source_path != dest_path) {
|
| - bool success = false;
|
| - if (file_operation_type == DriveCache::FILE_OPERATION_MOVE)
|
| - success = file_util::Move(source_path, dest_path);
|
| - else if (file_operation_type == DriveCache::FILE_OPERATION_COPY)
|
| - success = file_util::CopyFile(source_path, dest_path);
|
| - if (!success) {
|
| - LOG(ERROR) << "Failed to "
|
| - << (file_operation_type == DriveCache::FILE_OPERATION_MOVE ?
|
| - "move " : "copy ")
|
| - << source_path.value()
|
| - << " to " << dest_path.value();
|
| - return DRIVE_FILE_ERROR_FAILED;
|
| - } else {
|
| - DVLOG(1) << (file_operation_type == DriveCache::FILE_OPERATION_MOVE ?
|
| - "Moved " : "Copied ")
|
| - << source_path.value()
|
| - << " to " << dest_path.value();
|
| - }
|
| - } else {
|
| - DVLOG(1) << "No need to move file: source = destination";
|
| - }
|
| -
|
| - if (symlink_path.empty())
|
| - return DRIVE_FILE_OK;
|
| -
|
| - // Remove symlink regardless of |create_symlink| because creating a link will
|
| - // not overwrite an existing one.
|
| +// Deletes the symlink.
|
| +void DeleteSymlink(const FilePath& symlink_path) {
|
| // We try to save one file operation by not checking if link exists before
|
| // deleting it, so unlink may return error if link doesn't exist, but it
|
| // doesn't really matter to us.
|
| file_util::Delete(symlink_path, false);
|
| +}
|
|
|
| - if (!create_symlink)
|
| - return DRIVE_FILE_OK;
|
| +// Creates a symlink.
|
| +bool CreateSymlink(const FilePath& cache_file_path,
|
| + const FilePath& symlink_path) {
|
| + // Remove symlink because creating a link will not overwrite an existing one.
|
| + DeleteSymlink(symlink_path);
|
|
|
| - // Create new symlink to |dest_path|.
|
| - if (!file_util::CreateSymbolicLink(dest_path, symlink_path)) {
|
| + // Create new symlink to |cache_file_path|.
|
| + if (!file_util::CreateSymbolicLink(cache_file_path, symlink_path)) {
|
| LOG(ERROR) << "Failed to create a symlink from " << symlink_path.value()
|
| + << " to " << cache_file_path.value();
|
| + return false;
|
| + }
|
| + return true;
|
| +}
|
| +
|
| +// Moves the file.
|
| +bool MoveFile(const FilePath& source_path, const FilePath& dest_path) {
|
| + if (!file_util::Move(source_path, dest_path)) {
|
| + LOG(ERROR) << "Failed to move " << source_path.value()
|
| << " to " << dest_path.value();
|
| - return DRIVE_FILE_ERROR_FAILED;
|
| + return false;
|
| }
|
| + DVLOG(1) << "Moved " << source_path.value() << " to " << dest_path.value();
|
| + return true;
|
| +}
|
|
|
| - return DRIVE_FILE_OK;
|
| +// Copies the file.
|
| +bool CopyFile(const FilePath& source_path, const FilePath& dest_path) {
|
| + if (!file_util::CopyFile(source_path, dest_path)) {
|
| + LOG(ERROR) << "Failed to copy " << source_path.value()
|
| + << " to " << dest_path.value();
|
| + return false;
|
| + }
|
| + DVLOG(1) << "Copied " << source_path.value() << " to " << dest_path.value();
|
| + return true;
|
| }
|
|
|
| // Deletes all files that match |path_to_delete_pattern| except for
|
| @@ -335,7 +321,7 @@ bool DriveCache::FreeDiskSpaceOnBlockingPoolIfNeededFor(int64 num_bytes) {
|
|
|
| // Otherwise, try to free up the disk space.
|
| DVLOG(1) << "Freeing up disk space for " << num_bytes;
|
| - // First remove temporary files from the cache map.
|
| + // First remove temporary files from the metadata.
|
| metadata_->RemoveTemporaryFiles();
|
| // Then remove all files under "tmp" directory.
|
| RemoveAllFiles(GetCacheDirectoryPath(CACHE_TYPE_TMP));
|
| @@ -623,12 +609,10 @@ DriveFileError DriveCache::StoreOnBlockingPool(
|
| return DRIVE_FILE_ERROR_NO_SPACE;
|
| }
|
|
|
| - FilePath dest_path;
|
| FilePath symlink_path;
|
| CacheSubDirectoryType sub_dir_type = CACHE_TYPE_TMP;
|
|
|
| - // If file was previously pinned, store it in persistent dir and create
|
| - // symlink in pinned dir.
|
| + // If file was previously pinned, store it in persistent dir.
|
| DriveCacheEntry cache_entry;
|
| if (GetCacheEntryOnBlockingPool(resource_id, md5, &cache_entry)) {
|
| // File exists in cache.
|
| @@ -641,30 +625,31 @@ DriveFileError DriveCache::StoreOnBlockingPool(
|
| return DRIVE_FILE_ERROR_IN_USE;
|
| }
|
|
|
| - // If file is pinned, determines destination path.
|
| - if (cache_entry.is_pinned()) {
|
| + if (cache_entry.is_pinned())
|
| sub_dir_type = CACHE_TYPE_PERSISTENT;
|
| - dest_path = GetCacheFilePath(resource_id, md5, sub_dir_type,
|
| - CACHED_FILE_FROM_SERVER);
|
| - symlink_path = GetCacheFilePath(
|
| - resource_id, std::string(), CACHE_TYPE_PINNED,
|
| - CACHED_FILE_FROM_SERVER);
|
| - }
|
| }
|
|
|
| - // File wasn't pinned or doesn't exist in cache, store in tmp dir.
|
| - if (dest_path.empty()) {
|
| - DCHECK_EQ(CACHE_TYPE_TMP, sub_dir_type);
|
| - dest_path = GetCacheFilePath(resource_id, md5, sub_dir_type,
|
| - CACHED_FILE_FROM_SERVER);
|
| + FilePath dest_path = GetCacheFilePath(resource_id, md5, sub_dir_type,
|
| + CACHED_FILE_FROM_SERVER);
|
| + bool success = false;
|
| + switch (file_operation_type) {
|
| + case FILE_OPERATION_MOVE:
|
| + success = MoveFile(source_path, dest_path);
|
| + break;
|
| + case FILE_OPERATION_COPY:
|
| + success = CopyFile(source_path, dest_path);
|
| + break;
|
| + default:
|
| + NOTREACHED();
|
| }
|
|
|
| - DriveFileError error = ModifyCacheState(
|
| - source_path,
|
| - dest_path,
|
| - file_operation_type,
|
| - symlink_path,
|
| - !symlink_path.empty()); // create symlink
|
| + // Create symlink in pinned directory if the file is pinned.
|
| + if (success && cache_entry.is_pinned()) {
|
| + FilePath symlink_path = GetCacheFilePath(resource_id, std::string(),
|
| + CACHE_TYPE_PINNED,
|
| + CACHED_FILE_FROM_SERVER);
|
| + success = CreateSymlink(dest_path, symlink_path);
|
| + }
|
|
|
| // Determine search pattern for stale filenames corresponding to resource_id,
|
| // either "<resource_id>*" or "<resource_id>.*".
|
| @@ -687,37 +672,30 @@ DriveFileError DriveCache::StoreOnBlockingPool(
|
| // Delete files that match |stale_filenames_pattern| except for |dest_path|.
|
| DeleteFilesSelectively(stale_filenames_pattern, dest_path);
|
|
|
| - if (error == DRIVE_FILE_OK) {
|
| - // Now that file operations have completed, update cache map.
|
| + if (success) {
|
| + // Now that file operations have completed, update metadata.
|
| cache_entry.set_md5(md5);
|
| cache_entry.set_is_present(true);
|
| cache_entry.set_is_persistent(sub_dir_type == CACHE_TYPE_PERSISTENT);
|
| metadata_->AddOrUpdateCacheEntry(resource_id, cache_entry);
|
| }
|
|
|
| - return error;
|
| + return success ? DRIVE_FILE_OK : DRIVE_FILE_ERROR_FAILED;
|
| }
|
|
|
| DriveFileError DriveCache::PinOnBlockingPool(const std::string& resource_id,
|
| const std::string& md5) {
|
| AssertOnSequencedWorkerPool();
|
|
|
| - FilePath source_path;
|
| FilePath dest_path;
|
| - FilePath symlink_path;
|
| - bool create_symlink = true;
|
| CacheSubDirectoryType sub_dir_type = CACHE_TYPE_PERSISTENT;
|
|
|
| DriveCacheEntry cache_entry;
|
| if (!GetCacheEntryOnBlockingPool(resource_id, md5, &cache_entry)) {
|
| - // Entry does not exist in cache.
|
| - // Set both |dest_path| and |source_path| to /dev/null, so that:
|
| - // 1) ModifyCacheState won't move files when |source_path| and |dest_path|
|
| - // are the same.
|
| - // 2) symlinks to /dev/null will be picked up by DriveSyncClient to download
|
| - // pinned files that don't exist in cache.
|
| + // Entry does not exist in cache. Set |dest_path| to /dev/null, so that
|
| + // symlinks to /dev/null will be picked up by DriveSyncClient to download
|
| + // pinned files that don't exist in cache.
|
| dest_path = FilePath::FromUTF8Unsafe(util::kSymLinkToDevNull);
|
| - source_path = dest_path;
|
|
|
| // Set sub_dir_type to TMP. The file will be first downloaded in 'tmp',
|
| // then moved to 'persistent'.
|
| @@ -725,62 +703,51 @@ DriveFileError DriveCache::PinOnBlockingPool(const std::string& resource_id,
|
| } else { // File exists in cache, determines destination path.
|
| // Determine source and destination paths.
|
|
|
| - // If file is dirty or mounted, don't move it, so determine |dest_path| and
|
| - // set |source_path| the same, because ModifyCacheState only moves files if
|
| - // source and destination are different.
|
| + // If file is dirty or mounted, don't move it.
|
| if (cache_entry.is_dirty() || cache_entry.is_mounted()) {
|
| DCHECK(cache_entry.is_persistent());
|
| dest_path = GetCacheFilePath(resource_id,
|
| md5,
|
| GetSubDirectoryType(cache_entry),
|
| CACHED_FILE_LOCALLY_MODIFIED);
|
| - source_path = dest_path;
|
| } else {
|
| - // Gets the current path of the file in cache.
|
| - source_path = GetCacheFilePath(resource_id,
|
| - md5,
|
| - GetSubDirectoryType(cache_entry),
|
| - CACHED_FILE_FROM_SERVER);
|
| -
|
| // If file was pinned before but actual file blob doesn't exist in cache:
|
| - // - don't need to move the file, so set |dest_path| to |source_path|,
|
| - // because ModifyCacheState only moves files if source and destination
|
| - // are different
|
| + // - don't need to move the file.
|
| // - don't create symlink since it already exists.
|
| if (!cache_entry.is_present()) {
|
| - dest_path = source_path;
|
| - create_symlink = false;
|
| - } else { // File exists, move it to persistent dir.
|
| - dest_path = GetCacheFilePath(resource_id,
|
| - md5,
|
| - CACHE_TYPE_PERSISTENT,
|
| - CACHED_FILE_FROM_SERVER);
|
| + DCHECK(cache_entry.is_pinned());
|
| + return DRIVE_FILE_OK;
|
| }
|
| + // File exists, move it to persistent dir.
|
| + // Gets the current path of the file in cache.
|
| + FilePath source_path = GetCacheFilePath(resource_id,
|
| + md5,
|
| + GetSubDirectoryType(cache_entry),
|
| + CACHED_FILE_FROM_SERVER);
|
| + dest_path = GetCacheFilePath(resource_id,
|
| + md5,
|
| + CACHE_TYPE_PERSISTENT,
|
| + CACHED_FILE_FROM_SERVER);
|
| + if (!MoveFile(source_path, dest_path))
|
| + return DRIVE_FILE_ERROR_FAILED;
|
| }
|
| }
|
|
|
| // Create symlink in pinned dir.
|
| - if (create_symlink) {
|
| - symlink_path = GetCacheFilePath(resource_id,
|
| - std::string(),
|
| - CACHE_TYPE_PINNED,
|
| - CACHED_FILE_FROM_SERVER);
|
| - }
|
| -
|
| - DriveFileError error = ModifyCacheState(source_path,
|
| - dest_path,
|
| - FILE_OPERATION_MOVE,
|
| - symlink_path,
|
| - create_symlink);
|
| - if (error == DRIVE_FILE_OK) {
|
| - // Now that file operations have completed, update cache map.
|
| - cache_entry.set_md5(md5);
|
| - cache_entry.set_is_pinned(true);
|
| - cache_entry.set_is_persistent(sub_dir_type == CACHE_TYPE_PERSISTENT);
|
| - metadata_->AddOrUpdateCacheEntry(resource_id, cache_entry);
|
| - }
|
| + FilePath symlink_path = GetCacheFilePath(resource_id,
|
| + std::string(),
|
| + CACHE_TYPE_PINNED,
|
| + CACHED_FILE_FROM_SERVER);
|
| + DCHECK(!dest_path.empty());
|
| + if (!CreateSymlink(dest_path, symlink_path))
|
| + return DRIVE_FILE_ERROR_FAILED;
|
|
|
| - return error;
|
| + // Now that file operations have completed, update metadata.
|
| + cache_entry.set_md5(md5);
|
| + cache_entry.set_is_pinned(true);
|
| + cache_entry.set_is_persistent(sub_dir_type == CACHE_TYPE_PERSISTENT);
|
| + metadata_->AddOrUpdateCacheEntry(resource_id, cache_entry);
|
| + return DRIVE_FILE_OK;
|
| }
|
|
|
| DriveFileError DriveCache::UnpinOnBlockingPool(const std::string& resource_id,
|
| @@ -796,74 +763,51 @@ DriveFileError DriveCache::UnpinOnBlockingPool(const std::string& resource_id,
|
| return DRIVE_FILE_ERROR_NOT_FOUND;
|
| }
|
|
|
| - // Entry exists in cache, determines source and destination paths.
|
| -
|
| - FilePath source_path;
|
| - FilePath dest_path;
|
| CacheSubDirectoryType sub_dir_type = CACHE_TYPE_TMP;
|
|
|
| - // If file is dirty or mounted, don't move it, so determine |dest_path| and
|
| - // set |source_path| the same, because ModifyCacheState moves files if source
|
| - // and destination are different.
|
| + // If file is dirty or mounted, don't move it.
|
| if (cache_entry.is_dirty() || cache_entry.is_mounted()) {
|
| sub_dir_type = CACHE_TYPE_PERSISTENT;
|
| DCHECK(cache_entry.is_persistent());
|
| - dest_path = GetCacheFilePath(resource_id,
|
| - md5,
|
| - GetSubDirectoryType(cache_entry),
|
| - CACHED_FILE_LOCALLY_MODIFIED);
|
| - source_path = dest_path;
|
| } else {
|
| - // Gets the current path of the file in cache.
|
| - source_path = GetCacheFilePath(resource_id,
|
| - md5,
|
| - GetSubDirectoryType(cache_entry),
|
| - CACHED_FILE_FROM_SERVER);
|
| -
|
| // If file was pinned but actual file blob still doesn't exist in cache,
|
| - // don't need to move the file, so set |dest_path| to |source_path|, because
|
| - // ModifyCacheState only moves files if source and destination are
|
| - // different.
|
| - if (!cache_entry.is_present()) {
|
| - dest_path = source_path;
|
| - } else { // File exists, move it to tmp dir.
|
| - dest_path = GetCacheFilePath(resource_id, md5,
|
| - CACHE_TYPE_TMP,
|
| - CACHED_FILE_FROM_SERVER);
|
| + // don't need to move the file.
|
| + if (cache_entry.is_present()) {
|
| + // Gets the current path of the file in cache.
|
| + FilePath source_path = GetCacheFilePath(resource_id,
|
| + md5,
|
| + GetSubDirectoryType(cache_entry),
|
| + CACHED_FILE_FROM_SERVER);
|
| + // File exists, move it to tmp dir.
|
| + FilePath dest_path = GetCacheFilePath(resource_id,
|
| + md5,
|
| + CACHE_TYPE_TMP,
|
| + CACHED_FILE_FROM_SERVER);
|
| + if (!MoveFile(source_path, dest_path))
|
| + return DRIVE_FILE_ERROR_FAILED;
|
| }
|
| }
|
|
|
| - // If file was pinned, get absolute path of symlink in pinned dir so as to
|
| - // remove it.
|
| - FilePath symlink_path;
|
| + // If file was pinned, remove the symlink in pinned dir.
|
| if (cache_entry.is_pinned()) {
|
| - symlink_path = GetCacheFilePath(resource_id,
|
| - std::string(),
|
| - CACHE_TYPE_PINNED,
|
| - CACHED_FILE_FROM_SERVER);
|
| + FilePath symlink_path = GetCacheFilePath(resource_id,
|
| + std::string(),
|
| + CACHE_TYPE_PINNED,
|
| + CACHED_FILE_FROM_SERVER);
|
| + DeleteSymlink(symlink_path);
|
| }
|
|
|
| - DriveFileError error = ModifyCacheState(
|
| - source_path,
|
| - dest_path,
|
| - FILE_OPERATION_MOVE,
|
| - symlink_path, // This will be deleted if it exists.
|
| - false /* don't create symlink*/);
|
| -
|
| - if (error == DRIVE_FILE_OK) {
|
| - // Now that file operations have completed, update cache map.
|
| - if (cache_entry.is_present()) {
|
| - cache_entry.set_md5(md5);
|
| - cache_entry.set_is_pinned(false);
|
| - cache_entry.set_is_persistent(sub_dir_type == CACHE_TYPE_PERSISTENT);
|
| - metadata_->AddOrUpdateCacheEntry(resource_id, cache_entry);
|
| - } else {
|
| - // Remove the existing entry if we are unpinning a non-present file.
|
| - metadata_->RemoveCacheEntry(resource_id);
|
| - }
|
| + // Now that file operations have completed, update metadata.
|
| + if (cache_entry.is_present()) {
|
| + cache_entry.set_md5(md5);
|
| + cache_entry.set_is_pinned(false);
|
| + cache_entry.set_is_persistent(sub_dir_type == CACHE_TYPE_PERSISTENT);
|
| + metadata_->AddOrUpdateCacheEntry(resource_id, cache_entry);
|
| + } else {
|
| + // Remove the existing entry if we are unpinning a non-present file.
|
| + metadata_->RemoveCacheEntry(resource_id);
|
| }
|
| -
|
| - return error;
|
| + return DRIVE_FILE_OK;
|
| }
|
|
|
| scoped_ptr<DriveCache::GetFileResult> DriveCache::SetMountedStateOnBlockingPool(
|
| @@ -921,16 +865,15 @@ scoped_ptr<DriveCache::GetFileResult> DriveCache::SetMountedStateOnBlockingPool(
|
| }
|
|
|
| // Move cache blob from source path to destination path.
|
| - DriveFileError error = ModifyCacheState(
|
| - source_path, cache_file_path, FILE_OPERATION_MOVE, FilePath(), false);
|
| - if (error == DRIVE_FILE_OK) {
|
| - // Now that cache operation is complete, update cache map
|
| + bool success = MoveFile(source_path, cache_file_path);
|
| +
|
| + if (success) {
|
| + // Now that cache operation is complete, update metadata.
|
| cache_entry.set_md5(md5);
|
| cache_entry.set_is_persistent(dest_subdir == CACHE_TYPE_PERSISTENT);
|
| metadata_->AddOrUpdateCacheEntry(resource_id, cache_entry);
|
| }
|
| -
|
| - result->first = error;
|
| + result->first = success ? DRIVE_FILE_OK : DRIVE_FILE_ERROR_FAILED;
|
| result->second = cache_file_path;
|
| return result.Pass();
|
| }
|
| @@ -970,42 +913,28 @@ scoped_ptr<DriveCache::GetFileResult> DriveCache::MarkDirtyOnBlockingPool(
|
| DCHECK(cache_entry.is_persistent());
|
|
|
| // Determine symlink path in outgoing dir, so as to remove it.
|
| - FilePath symlink_path = GetCacheFilePath(
|
| - resource_id,
|
| - std::string(),
|
| - CACHE_TYPE_OUTGOING,
|
| - CACHED_FILE_FROM_SERVER);
|
| -
|
| - // We're not moving files here, so simply use empty FilePath for both
|
| - // |source_path| and |dest_path| because ModifyCacheState only move files
|
| - // if source and destination are different.
|
| - DriveFileError error = ModifyCacheState(
|
| - FilePath(), // non-applicable source path
|
| - FilePath(), // non-applicable dest path
|
| - FILE_OPERATION_MOVE,
|
| - symlink_path,
|
| - false /* don't create symlink */);
|
| + FilePath symlink_path = GetCacheFilePath(resource_id,
|
| + std::string(),
|
| + CACHE_TYPE_OUTGOING,
|
| + CACHED_FILE_FROM_SERVER);
|
| + DeleteSymlink(symlink_path);
|
|
|
| // Determine current path of dirty file.
|
| - result->first = error;
|
| - if (error == DRIVE_FILE_OK) {
|
| - result->second = GetCacheFilePath(resource_id,
|
| - md5,
|
| - CACHE_TYPE_PERSISTENT,
|
| - CACHED_FILE_LOCALLY_MODIFIED);
|
| - }
|
| + result->first = DRIVE_FILE_OK;
|
| + result->second = GetCacheFilePath(resource_id,
|
| + md5,
|
| + CACHE_TYPE_PERSISTENT,
|
| + CACHED_FILE_LOCALLY_MODIFIED);
|
| return result.Pass();
|
| }
|
|
|
| // Move file to persistent dir with new .local extension.
|
|
|
| // Get the current path of the file in cache.
|
| - FilePath source_path = GetCacheFilePath(
|
| - resource_id,
|
| - md5,
|
| - GetSubDirectoryType(cache_entry),
|
| - CACHED_FILE_FROM_SERVER);
|
| -
|
| + FilePath source_path = GetCacheFilePath(resource_id,
|
| + md5,
|
| + GetSubDirectoryType(cache_entry),
|
| + CACHED_FILE_FROM_SERVER);
|
| // Determine destination path.
|
| const CacheSubDirectoryType sub_dir_type = CACHE_TYPE_PERSISTENT;
|
| FilePath cache_file_path = GetCacheFilePath(resource_id,
|
| @@ -1013,30 +942,25 @@ scoped_ptr<DriveCache::GetFileResult> DriveCache::MarkDirtyOnBlockingPool(
|
| sub_dir_type,
|
| CACHED_FILE_LOCALLY_MODIFIED);
|
|
|
| + bool success = MoveFile(source_path, cache_file_path);
|
| +
|
| // If file is pinned, update symlink in pinned dir.
|
| - FilePath symlink_path;
|
| - if (cache_entry.is_pinned()) {
|
| - symlink_path = GetCacheFilePath(resource_id,
|
| - std::string(),
|
| - CACHE_TYPE_PINNED,
|
| - CACHED_FILE_FROM_SERVER);
|
| + if (success && cache_entry.is_pinned()) {
|
| + FilePath symlink_path = GetCacheFilePath(resource_id,
|
| + std::string(),
|
| + CACHE_TYPE_PINNED,
|
| + CACHED_FILE_FROM_SERVER);
|
| + success = CreateSymlink(cache_file_path, symlink_path);
|
| }
|
|
|
| - DriveFileError error = ModifyCacheState(
|
| - source_path,
|
| - cache_file_path,
|
| - FILE_OPERATION_MOVE,
|
| - symlink_path,
|
| - !symlink_path.empty() /* create symlink */);
|
| -
|
| - if (error == DRIVE_FILE_OK) {
|
| - // Now that file operations have completed, update cache map.
|
| + if (success) {
|
| + // Now that file operations have completed, update metadata.
|
| cache_entry.set_md5(md5);
|
| cache_entry.set_is_dirty(true);
|
| cache_entry.set_is_persistent(sub_dir_type == CACHE_TYPE_PERSISTENT);
|
| metadata_->AddOrUpdateCacheEntry(resource_id, cache_entry);
|
| }
|
| - result->first = error;
|
| + result->first = success ? DRIVE_FILE_OK : DRIVE_FILE_ERROR_FAILED;
|
| result->second = cache_file_path;
|
| return result.Pass();
|
| }
|
| @@ -1086,14 +1010,8 @@ DriveFileError DriveCache::CommitDirtyOnBlockingPool(
|
| GetSubDirectoryType(cache_entry),
|
| CACHED_FILE_LOCALLY_MODIFIED);
|
|
|
| - // Since there's no need to move files, use |target_path| for both
|
| - // |source_path| and |dest_path|, because ModifyCacheState only moves files
|
| - // if source and destination are different.
|
| - return ModifyCacheState(target_path, // source
|
| - target_path, // destination
|
| - FILE_OPERATION_MOVE,
|
| - symlink_path,
|
| - true /* create symlink */);
|
| + return CreateSymlink(target_path, symlink_path) ?
|
| + DRIVE_FILE_OK : DRIVE_FILE_ERROR_FAILED;
|
| }
|
|
|
| DriveFileError DriveCache::ClearDirtyOnBlockingPool(
|
| @@ -1143,44 +1061,36 @@ DriveFileError DriveCache::ClearDirtyOnBlockingPool(
|
| sub_dir_type,
|
| CACHED_FILE_FROM_SERVER);
|
|
|
| - // Delete symlink in outgoing dir.
|
| - FilePath symlink_path = GetCacheFilePath(resource_id,
|
| - std::string(),
|
| - CACHE_TYPE_OUTGOING,
|
| - CACHED_FILE_FROM_SERVER);
|
| + bool success = MoveFile(source_path, dest_path);
|
|
|
| - DriveFileError error = ModifyCacheState(source_path,
|
| - dest_path,
|
| - FILE_OPERATION_MOVE,
|
| - symlink_path,
|
| - false /* don't create symlink */);
|
| + if (success) {
|
| + // Delete symlink in outgoing dir.
|
| + FilePath symlink_path = GetCacheFilePath(resource_id,
|
| + std::string(),
|
| + CACHE_TYPE_OUTGOING,
|
| + CACHED_FILE_FROM_SERVER);
|
| + DeleteSymlink(symlink_path);
|
| + }
|
|
|
| // If file is pinned, update symlink in pinned dir.
|
| - if (error == DRIVE_FILE_OK && cache_entry.is_pinned()) {
|
| - symlink_path = GetCacheFilePath(resource_id,
|
| - std::string(),
|
| - CACHE_TYPE_PINNED,
|
| - CACHED_FILE_FROM_SERVER);
|
| -
|
| - // Since there's no moving of files here, use |dest_path| for both
|
| - // |source_path| and |dest_path|, because ModifyCacheState only moves files
|
| - // if source and destination are different.
|
| - error = ModifyCacheState(dest_path, // source path
|
| - dest_path, // destination path
|
| - FILE_OPERATION_MOVE,
|
| - symlink_path,
|
| - true /* create symlink */);
|
| + if (success && cache_entry.is_pinned()) {
|
| + FilePath symlink_path = GetCacheFilePath(resource_id,
|
| + std::string(),
|
| + CACHE_TYPE_PINNED,
|
| + CACHED_FILE_FROM_SERVER);
|
| +
|
| + success = CreateSymlink(dest_path, symlink_path);
|
| }
|
|
|
| - if (error == DRIVE_FILE_OK) {
|
| - // Now that file operations have completed, update cache map.
|
| + if (success) {
|
| + // Now that file operations have completed, update metadata.
|
| cache_entry.set_md5(md5);
|
| cache_entry.set_is_dirty(false);
|
| cache_entry.set_is_persistent(sub_dir_type == CACHE_TYPE_PERSISTENT);
|
| metadata_->AddOrUpdateCacheEntry(resource_id, cache_entry);
|
| }
|
|
|
| - return error;
|
| + return success ? DRIVE_FILE_OK : DRIVE_FILE_ERROR_FAILED;
|
| }
|
|
|
| DriveFileError DriveCache::RemoveOnBlockingPool(
|
| @@ -1238,7 +1148,7 @@ DriveFileError DriveCache::RemoveOnBlockingPool(
|
| DeleteFilesSelectively(paths_to_delete[i], path_to_keep);
|
| }
|
|
|
| - // Now that all file operations have completed, remove from cache map.
|
| + // Now that all file operations have completed, remove from metadata.
|
| metadata_->RemoveCacheEntry(resource_id);
|
|
|
| return DRIVE_FILE_OK;
|
|
|