Index: chrome/browser/chromeos/drive/file_cache.cc |
diff --git a/chrome/browser/chromeos/drive/file_cache.cc b/chrome/browser/chromeos/drive/file_cache.cc |
index 8dcf400541b0567f921f6dd2c95b4c163190e3f9..c37a27457604e4d4312fb0ad5612538c0c52b5e8 100644 |
--- a/chrome/browser/chromeos/drive/file_cache.cc |
+++ b/chrome/browser/chromeos/drive/file_cache.cc |
@@ -74,7 +74,7 @@ bool FileCache::IsUnderFileCacheDirectory(const base::FilePath& path) const { |
bool FileCache::GetCacheEntry(const std::string& id, FileCacheEntry* entry) { |
DCHECK(entry); |
AssertOnSequencedWorkerPool(); |
- return storage_->GetCacheEntry(id, entry); |
+ return storage_->GetCacheEntry(id, entry) == FILE_ERROR_OK; |
} |
scoped_ptr<FileCache::Iterator> FileCache::GetIterator() { |
@@ -102,7 +102,8 @@ bool FileCache::FreeDiskSpaceIfNeededFor(int64 num_bytes) { |
!mounted_files_.count(it->GetID())) |
storage_->RemoveCacheEntry(it->GetID()); |
} |
- DCHECK(!it->HasError()); |
+ if (it->HasError()) |
+ return false; |
// Remove all files which have no corresponding cache entries. |
base::FileEnumerator enumerator(cache_file_directory_, |
@@ -112,8 +113,11 @@ bool FileCache::FreeDiskSpaceIfNeededFor(int64 num_bytes) { |
for (base::FilePath current = enumerator.Next(); !current.empty(); |
current = enumerator.Next()) { |
std::string id = GetIdFromPath(current); |
- if (!storage_->GetCacheEntry(id, &entry)) |
+ FileError error = storage_->GetCacheEntry(id, &entry); |
+ if (error == FILE_ERROR_NOT_FOUND) |
base::DeleteFile(current, false /* recursive */); |
+ else if (error != FILE_ERROR_OK) |
+ return false; |
} |
// Check the disk space again. |
@@ -126,8 +130,10 @@ FileError FileCache::GetFile(const std::string& id, |
DCHECK(cache_file_path); |
FileCacheEntry cache_entry; |
- if (!storage_->GetCacheEntry(id, &cache_entry) || |
- !cache_entry.is_present()) |
+ FileError error = storage_->GetCacheEntry(id, &cache_entry); |
+ if (error != FILE_ERROR_OK) |
+ return error; |
+ if (!cache_entry.is_present()) |
return FILE_ERROR_NOT_FOUND; |
*cache_file_path = GetCacheFilePath(id); |
@@ -177,23 +183,25 @@ FileError FileCache::Store(const std::string& id, |
// Now that file operations have completed, update metadata. |
FileCacheEntry cache_entry; |
- storage_->GetCacheEntry(id, &cache_entry); |
+ FileError error = storage_->GetCacheEntry(id, &cache_entry); |
+ if (error != FILE_ERROR_OK && error != FILE_ERROR_NOT_FOUND) |
+ return error; |
cache_entry.set_md5(md5); |
cache_entry.set_is_present(true); |
if (md5.empty()) |
cache_entry.set_is_dirty(true); |
- return storage_->PutCacheEntry(id, cache_entry) ? |
- FILE_ERROR_OK : FILE_ERROR_FAILED; |
+ return storage_->PutCacheEntry(id, cache_entry); |
} |
FileError FileCache::Pin(const std::string& id) { |
AssertOnSequencedWorkerPool(); |
FileCacheEntry cache_entry; |
- storage_->GetCacheEntry(id, &cache_entry); |
+ FileError error = storage_->GetCacheEntry(id, &cache_entry); |
+ if (error != FILE_ERROR_OK && error != FILE_ERROR_NOT_FOUND) |
+ return error; |
cache_entry.set_is_pinned(true); |
- return storage_->PutCacheEntry(id, cache_entry) ? |
- FILE_ERROR_OK : FILE_ERROR_FAILED; |
+ return storage_->PutCacheEntry(id, cache_entry); |
} |
FileError FileCache::Unpin(const std::string& id) { |
@@ -201,18 +209,21 @@ FileError FileCache::Unpin(const std::string& id) { |
// Unpinning a file means its entry must exist in cache. |
FileCacheEntry cache_entry; |
- if (!storage_->GetCacheEntry(id, &cache_entry)) |
- return FILE_ERROR_NOT_FOUND; |
+ FileError error = storage_->GetCacheEntry(id, &cache_entry); |
+ if (error != FILE_ERROR_OK) |
+ return error; |
// Now that file operations have completed, update metadata. |
if (cache_entry.is_present()) { |
cache_entry.set_is_pinned(false); |
- if (!storage_->PutCacheEntry(id, cache_entry)) |
- return FILE_ERROR_FAILED; |
+ error = storage_->PutCacheEntry(id, cache_entry); |
+ if (error != FILE_ERROR_OK) |
+ return error; |
} else { |
// Remove the existing entry if we are unpinning a non-present file. |
- if (!storage_->RemoveCacheEntry(id)) |
- return FILE_ERROR_FAILED; |
+ error = storage_->RemoveCacheEntry(id); |
+ if (error != FILE_ERROR_OK) |
+ return error; |
} |
// Now it's a chance to free up space if needed. |
@@ -228,8 +239,9 @@ FileError FileCache::MarkAsMounted(const std::string& id, |
// Get cache entry associated with the id and md5 |
FileCacheEntry cache_entry; |
- if (!storage_->GetCacheEntry(id, &cache_entry)) |
- return FILE_ERROR_NOT_FOUND; |
+ FileError error = storage_->GetCacheEntry(id, &cache_entry); |
+ if (error != FILE_ERROR_OK) |
+ return error; |
if (mounted_files_.count(id)) |
return FILE_ERROR_INVALID_OPERATION; |
@@ -258,16 +270,19 @@ FileError FileCache::OpenForWrite( |
// Marking a file dirty means its entry and actual file blob must exist in |
// cache. |
FileCacheEntry cache_entry; |
- if (!storage_->GetCacheEntry(id, &cache_entry) || |
- !cache_entry.is_present()) { |
+ FileError error = storage_->GetCacheEntry(id, &cache_entry); |
+ if (error != FILE_ERROR_OK) |
+ return error; |
+ if (!cache_entry.is_present()) { |
LOG(WARNING) << "Can't mark dirty a file that wasn't cached: " << id; |
return FILE_ERROR_NOT_FOUND; |
} |
cache_entry.set_is_dirty(true); |
cache_entry.clear_md5(); |
- if (!storage_->PutCacheEntry(id, cache_entry)) |
- return FILE_ERROR_FAILED; |
+ error = storage_->PutCacheEntry(id, cache_entry); |
+ if (error != FILE_ERROR_OK) |
+ return error; |
write_opened_files_[id]++; |
file_closer->reset(new base::ScopedClosureRunner( |
@@ -291,8 +306,10 @@ FileError FileCache::UpdateMd5(const std::string& id) { |
return FILE_ERROR_IN_USE; |
FileCacheEntry cache_entry; |
- if (!storage_->GetCacheEntry(id, &cache_entry) || |
- !cache_entry.is_present()) |
+ FileError error = storage_->GetCacheEntry(id, &cache_entry); |
+ if (error != FILE_ERROR_OK) |
+ return error; |
+ if (!cache_entry.is_present()) |
return FILE_ERROR_NOT_FOUND; |
const std::string& md5 = util::GetMd5Digest(GetCacheFilePath(id)); |
@@ -300,8 +317,7 @@ FileError FileCache::UpdateMd5(const std::string& id) { |
return FILE_ERROR_NOT_FOUND; |
cache_entry.set_md5(md5); |
- return storage_->PutCacheEntry(id, cache_entry) ? |
- FILE_ERROR_OK : FILE_ERROR_FAILED; |
+ return storage_->PutCacheEntry(id, cache_entry); |
} |
FileError FileCache::ClearDirty(const std::string& id) { |
@@ -313,8 +329,10 @@ FileError FileCache::ClearDirty(const std::string& id) { |
// Clearing a dirty file means its entry and actual file blob must exist in |
// cache. |
FileCacheEntry cache_entry; |
- if (!storage_->GetCacheEntry(id, &cache_entry) || |
- !cache_entry.is_present()) { |
+ FileError error = storage_->GetCacheEntry(id, &cache_entry); |
+ if (error != FILE_ERROR_OK) |
+ return error; |
+ if (!cache_entry.is_present()) { |
LOG(WARNING) << "Can't clear dirty state of a file that wasn't cached: " |
<< id; |
return FILE_ERROR_NOT_FOUND; |
@@ -328,8 +346,7 @@ FileError FileCache::ClearDirty(const std::string& id) { |
} |
cache_entry.set_is_dirty(false); |
- return storage_->PutCacheEntry(id, cache_entry) ? |
- FILE_ERROR_OK : FILE_ERROR_FAILED; |
+ return storage_->PutCacheEntry(id, cache_entry); |
} |
FileError FileCache::Remove(const std::string& id) { |
@@ -338,8 +355,11 @@ FileError FileCache::Remove(const std::string& id) { |
FileCacheEntry cache_entry; |
// If entry doesn't exist, nothing to do. |
- if (!storage_->GetCacheEntry(id, &cache_entry)) |
+ FileError error = storage_->GetCacheEntry(id, &cache_entry); |
+ if (error == FILE_ERROR_NOT_FOUND) |
return FILE_ERROR_OK; |
+ if (error != FILE_ERROR_OK) |
+ return error; |
// Cannot delete a mounted file. |
if (mounted_files_.count(id)) |
@@ -351,7 +371,7 @@ FileError FileCache::Remove(const std::string& id) { |
return FILE_ERROR_FAILED; |
// Now that all file operations have completed, remove from metadata. |
- return storage_->RemoveCacheEntry(id) ? FILE_ERROR_OK : FILE_ERROR_FAILED; |
+ return storage_->RemoveCacheEntry(id); |
} |
bool FileCache::ClearAll() { |
@@ -361,7 +381,7 @@ bool FileCache::ClearAll() { |
scoped_ptr<ResourceMetadataStorage::CacheEntryIterator> it = |
storage_->GetCacheEntryIterator(); |
for (; !it->IsAtEnd(); it->Advance()) { |
- if (!storage_->RemoveCacheEntry(it->GetID())) |
+ if (storage_->RemoveCacheEntry(it->GetID()) != FILE_ERROR_OK) |
return false; |
} |
@@ -390,10 +410,12 @@ bool FileCache::Initialize() { |
if (it->GetValue().is_dirty()) { |
FileCacheEntry new_entry(it->GetValue()); |
new_entry.clear_md5(); |
- if (!storage_->PutCacheEntry(it->GetID(), new_entry)) |
+ if (storage_->PutCacheEntry(it->GetID(), new_entry) != FILE_ERROR_OK) |
return false; |
} |
} |
+ if (it->HasError()) |
+ return false; |
if (!RenameCacheFilesToNewFormat()) |
return false; |
@@ -429,10 +451,13 @@ bool FileCache::RecoverFilesFromCacheDirectory( |
current = enumerator.Next()) { |
const std::string& id = GetIdFromPath(current); |
FileCacheEntry entry; |
- if (storage_->GetCacheEntry(id, &entry)) { |
+ FileError error = storage_->GetCacheEntry(id, &entry); |
+ if (error == FILE_ERROR_OK) { |
// This file is managed by FileCache, no need to recover it. |
continue; |
} |
+ if (error != FILE_ERROR_NOT_FOUND) |
+ return false; |
// If a cache entry which is non-dirty and has matching MD5 is found in |
// |recovered_cache_entries|, it means the current file is already uploaded |
@@ -517,8 +542,9 @@ FileError FileCache::MarkAsUnmounted(const base::FilePath& file_path) { |
// Get cache entry associated with the id and md5 |
FileCacheEntry cache_entry; |
- if (!storage_->GetCacheEntry(id, &cache_entry)) |
- return FILE_ERROR_NOT_FOUND; |
+ FileError error = storage_->GetCacheEntry(id, &cache_entry); |
+ if (error != FILE_ERROR_OK) |
+ return error; |
std::set<std::string>::iterator it = mounted_files_.find(id); |
if (it == mounted_files_.end()) |