Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1033)

Unified Diff: chrome/browser/chromeos/drive/file_cache.cc

Issue 17249004: drive: Use ResourceMetadataStorage from FileCache (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: More precise old DB handling Created 7 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/chromeos/drive/file_cache.h ('k') | chrome/browser/chromeos/drive/file_cache_metadata.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 7c06888e93267441f3133455f5159475487a42e2..4a0485c21141528e3d8da7db36aa625d3dfb7066 100644
--- a/chrome/browser/chromeos/drive/file_cache.cc
+++ b/chrome/browser/chromeos/drive/file_cache.cc
@@ -16,6 +16,7 @@
#include "chrome/browser/chromeos/drive/drive.pb.h"
#include "chrome/browser/chromeos/drive/file_cache_metadata.h"
#include "chrome/browser/chromeos/drive/file_system_util.h"
+#include "chrome/browser/chromeos/drive/resource_metadata_storage.h"
#include "chrome/browser/google_apis/task_util.h"
#include "chromeos/chromeos_constants.h"
#include "content/public/browser/browser_thread.h"
@@ -26,10 +27,6 @@ namespace drive {
namespace internal {
namespace {
-// Name of the cache metadata DB.
-const base::FilePath::CharType* kCacheMetadataDBName =
- FILE_PATH_LITERAL("cache_metadata.db");
-
typedef std::map<std::string, FileCacheEntry> CacheMap;
// Returns true if |md5| matches the one in |cache_entry| with some
@@ -159,13 +156,16 @@ void RunGetCacheEntryCallback(const GetCacheEntryCallback& callback,
} // namespace
-FileCache::FileCache(const base::FilePath& metadata_directory,
+const base::FilePath::CharType FileCache::kOldCacheMetadataDBName[] =
+ FILE_PATH_LITERAL("cache_metadata.db");
+
+FileCache::FileCache(ResourceMetadataStorage* storage,
const base::FilePath& cache_file_directory,
base::SequencedTaskRunner* blocking_task_runner,
FreeDiskSpaceGetterInterface* free_disk_space_getter)
- : metadata_directory_(metadata_directory),
- cache_file_directory_(cache_file_directory),
+ : cache_file_directory_(cache_file_directory),
blocking_task_runner_(blocking_task_runner),
+ storage_(storage),
free_disk_space_getter_(free_disk_space_getter),
weak_ptr_factory_(this) {
DCHECK(blocking_task_runner_.get());
@@ -229,7 +229,7 @@ bool FileCache::GetCacheEntry(const std::string& resource_id,
FileCacheEntry* entry) {
DCHECK(entry);
AssertOnSequencedWorkerPool();
- return metadata_->GetCacheEntry(resource_id, entry) &&
+ return storage_->GetCacheEntry(resource_id, entry) &&
CheckIfMd5Matches(md5, *entry);
}
@@ -252,9 +252,10 @@ void FileCache::Iterate(const CacheIterateCallback& iteration_callback) {
AssertOnSequencedWorkerPool();
DCHECK(!iteration_callback.is_null());
- scoped_ptr<FileCacheMetadata::Iterator> it = metadata_->GetIterator();
+ scoped_ptr<ResourceMetadataStorage::CacheEntryIterator> it =
+ storage_->GetCacheEntryIterator();
for (; !it->IsAtEnd(); it->Advance())
- iteration_callback.Run(it->GetKey(), it->GetValue());
+ iteration_callback.Run(it->GetID(), it->GetValue());
DCHECK(!it->HasError());
}
@@ -284,13 +285,14 @@ bool FileCache::FreeDiskSpaceIfNeededFor(int64 num_bytes) {
DVLOG(1) << "Freeing up disk space for " << num_bytes;
// Remove all entries unless specially marked.
- scoped_ptr<FileCacheMetadata::Iterator> it = metadata_->GetIterator();
+ scoped_ptr<ResourceMetadataStorage::CacheEntryIterator> it =
+ storage_->GetCacheEntryIterator();
for (; !it->IsAtEnd(); it->Advance()) {
const FileCacheEntry& entry = it->GetValue();
if (!entry.is_pinned() &&
!entry.is_dirty() &&
- !mounted_files_.count(it->GetKey()))
- metadata_->RemoveCacheEntry(it->GetKey());
+ !mounted_files_.count(it->GetID()))
+ storage_->RemoveCacheEntry(it->GetID());
}
DCHECK(!it->HasError());
@@ -392,9 +394,9 @@ FileError FileCache::Pin(const std::string& resource_id) {
AssertOnSequencedWorkerPool();
FileCacheEntry cache_entry;
- metadata_->GetCacheEntry(resource_id, &cache_entry);
+ storage_->GetCacheEntry(resource_id, &cache_entry);
cache_entry.set_is_pinned(true);
- metadata_->AddOrUpdateCacheEntry(resource_id, cache_entry);
+ storage_->PutCacheEntry(resource_id, cache_entry);
return FILE_ERROR_OK;
}
@@ -415,16 +417,16 @@ FileError FileCache::Unpin(const std::string& resource_id) {
// Unpinning a file means its entry must exist in cache.
FileCacheEntry cache_entry;
- if (!metadata_->GetCacheEntry(resource_id, &cache_entry))
+ if (!storage_->GetCacheEntry(resource_id, &cache_entry))
return FILE_ERROR_NOT_FOUND;
// Now that file operations have completed, update metadata.
if (cache_entry.is_present()) {
cache_entry.set_is_pinned(false);
- metadata_->AddOrUpdateCacheEntry(resource_id, cache_entry);
+ storage_->PutCacheEntry(resource_id, cache_entry);
} else {
// Remove the existing entry if we are unpinning a non-present file.
- metadata_->RemoveCacheEntry(resource_id);
+ storage_->RemoveCacheEntry(resource_id);
}
// Now it's a chance to free up space if needed.
@@ -491,7 +493,7 @@ FileError FileCache::MarkDirty(const std::string& resource_id,
// Marking a file dirty means its entry and actual file blob must exist in
// cache.
FileCacheEntry cache_entry;
- if (!metadata_->GetCacheEntry(resource_id, &cache_entry) ||
+ if (!storage_->GetCacheEntry(resource_id, &cache_entry) ||
!cache_entry.is_present()) {
LOG(WARNING) << "Can't mark dirty a file that wasn't cached: res_id="
<< resource_id
@@ -515,7 +517,7 @@ FileError FileCache::MarkDirty(const std::string& resource_id,
// Now that file operations have completed, update metadata.
cache_entry.set_md5(md5);
cache_entry.set_is_dirty(true);
- metadata_->AddOrUpdateCacheEntry(resource_id, cache_entry);
+ storage_->PutCacheEntry(resource_id, cache_entry);
return FILE_ERROR_OK;
}
@@ -529,7 +531,7 @@ FileError FileCache::ClearDirty(const std::string& resource_id,
// Clearing a dirty file means its entry and actual file blob must exist in
// cache.
- if (!metadata_->GetCacheEntry(resource_id, &cache_entry) ||
+ if (!storage_->GetCacheEntry(resource_id, &cache_entry) ||
!cache_entry.is_present()) {
LOG(WARNING) << "Can't clear dirty state of a file that wasn't cached: "
<< "res_id=" << resource_id
@@ -556,7 +558,7 @@ FileError FileCache::ClearDirty(const std::string& resource_id,
// Now that file operations have completed, update metadata.
cache_entry.set_md5(md5);
cache_entry.set_is_dirty(false);
- metadata_->AddOrUpdateCacheEntry(resource_id, cache_entry);
+ storage_->PutCacheEntry(resource_id, cache_entry);
return FILE_ERROR_OK;
}
@@ -581,7 +583,7 @@ FileError FileCache::Remove(const std::string& resource_id) {
FileCacheEntry cache_entry;
// If entry doesn't exist, nothing to do.
- if (!metadata_->GetCacheEntry(resource_id, &cache_entry))
+ if (!storage_->GetCacheEntry(resource_id, &cache_entry))
return FILE_ERROR_OK;
// Cannot delete a dirty or mounted file.
@@ -596,7 +598,7 @@ FileError FileCache::Remove(const std::string& resource_id) {
DeleteFilesSelectively(path_to_delete, path_to_keep);
// Now that all file operations have completed, remove from metadata.
- metadata_->RemoveCacheEntry(resource_id);
+ storage_->RemoveCacheEntry(resource_id);
return FILE_ERROR_OK;
}
@@ -615,25 +617,14 @@ void FileCache::ClearAllOnUIThread(const InitializeCacheCallback& callback) {
bool FileCache::Initialize() {
AssertOnSequencedWorkerPool();
- metadata_.reset(new FileCacheMetadata(blocking_task_runner_.get()));
-
- const base::FilePath db_path =
- metadata_directory_.Append(kCacheMetadataDBName);
- switch (metadata_->Initialize(db_path)) {
- case FileCacheMetadata::INITIALIZE_FAILED:
- return false;
-
- case FileCacheMetadata::INITIALIZE_OPENED: // Do nothing.
- break;
-
- case FileCacheMetadata::INITIALIZE_CREATED: {
- CacheMap cache_map;
- ScanCacheDirectory(cache_file_directory_, &cache_map);
- for (CacheMap::const_iterator it = cache_map.begin();
- it != cache_map.end(); ++it) {
- metadata_->AddOrUpdateCacheEntry(it->first, it->second);
- }
- break;
+ if (!ImportOldDB(storage_->directory_path().Append(
+ kOldCacheMetadataDBName)) &&
+ !storage_->opened_existing_db()) {
+ CacheMap cache_map;
+ ScanCacheDirectory(cache_file_directory_, &cache_map);
+ for (CacheMap::const_iterator it = cache_map.begin();
+ it != cache_map.end(); ++it) {
+ storage_->PutCacheEntry(it->first, it->second);
}
}
return true;
@@ -675,7 +666,7 @@ FileError FileCache::StoreInternal(const std::string& resource_id,
return FILE_ERROR_NO_SPACE;
FileCacheEntry cache_entry;
- metadata_->GetCacheEntry(resource_id, &cache_entry);
+ storage_->GetCacheEntry(resource_id, &cache_entry);
// If file is dirty or mounted, return error.
if (cache_entry.is_dirty() || mounted_files_.count(resource_id))
@@ -722,7 +713,7 @@ FileError FileCache::StoreInternal(const std::string& resource_id,
cache_entry.set_md5(md5);
cache_entry.set_is_present(true);
cache_entry.set_is_dirty(false);
- metadata_->AddOrUpdateCacheEntry(resource_id, cache_entry);
+ storage_->PutCacheEntry(resource_id, cache_entry);
}
return success ? FILE_ERROR_OK : FILE_ERROR_FAILED;
@@ -735,7 +726,7 @@ FileError FileCache::MarkAsMounted(const std::string& resource_id,
// Get cache entry associated with the resource_id and md5
FileCacheEntry cache_entry;
- if (!metadata_->GetCacheEntry(resource_id, &cache_entry))
+ if (!storage_->GetCacheEntry(resource_id, &cache_entry))
return FILE_ERROR_NOT_FOUND;
if (mounted_files_.count(resource_id))
@@ -783,9 +774,10 @@ bool FileCache::ClearAll() {
AssertOnSequencedWorkerPool();
// Remove entries on the metadata.
- scoped_ptr<FileCacheMetadata::Iterator> it = metadata_->GetIterator();
+ scoped_ptr<ResourceMetadataStorage::CacheEntryIterator> it =
+ storage_->GetCacheEntryIterator();
for (; !it->IsAtEnd(); it->Advance())
- metadata_->RemoveCacheEntry(it->GetKey());
+ storage_->RemoveCacheEntry(it->GetID());
if (it->HasError())
return false;
@@ -814,25 +806,31 @@ bool FileCache::HasEnoughSpaceFor(int64 num_bytes,
return (free_space >= num_bytes);
}
-void FileCache::ImportOldDB(const base::FilePath& old_db_path) {
+bool FileCache::ImportOldDB(const base::FilePath& old_db_path) {
if (!file_util::PathExists(old_db_path)) // Old DB is not there, do nothing.
- return;
+ return false;
// Copy all entries stored in the old DB.
- FileCacheMetadata old_data(blocking_task_runner_);
- if (old_data.Initialize(old_db_path)) {
- scoped_ptr<FileCacheMetadata::Iterator> it = old_data.GetIterator();
- for (; !it->IsAtEnd(); it->Advance()) {
- FileCacheEntry entry;
- if (metadata_->GetCacheEntry(it->GetKey(), &entry))
- continue; // Do not overwrite.
-
- metadata_->AddOrUpdateCacheEntry(it->GetKey(), it->GetValue());
+ bool imported = false;
+ {
+ FileCacheMetadata old_data(blocking_task_runner_);
+ if (old_data.Initialize(old_db_path) ==
+ FileCacheMetadata::INITIALIZE_OPENED) {
+ scoped_ptr<FileCacheMetadata::Iterator> it = old_data.GetIterator();
+ for (; !it->IsAtEnd(); it->Advance()) {
+ FileCacheEntry entry;
+ if (storage_->GetCacheEntry(it->GetKey(), &entry))
+ continue; // Do not overwrite.
+
+ storage_->PutCacheEntry(it->GetKey(), it->GetValue());
+ }
+ imported = true;
}
}
// Delete old DB.
file_util::Delete(old_db_path, true /* recursive */ );
+ return imported;
}
} // namespace internal
« no previous file with comments | « chrome/browser/chromeos/drive/file_cache.h ('k') | chrome/browser/chromeos/drive/file_cache_metadata.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698