| Index: chrome/browser/chromeos/drive/file_cache_metadata.cc
|
| diff --git a/chrome/browser/chromeos/drive/file_cache_metadata.cc b/chrome/browser/chromeos/drive/file_cache_metadata.cc
|
| index 46ac4fa87758001b4c455477840fd7bb85bc882d..6f89d3b103788d6615b452398e31d868c5140313 100644
|
| --- a/chrome/browser/chromeos/drive/file_cache_metadata.cc
|
| +++ b/chrome/browser/chromeos/drive/file_cache_metadata.cc
|
| @@ -18,6 +18,8 @@ namespace internal {
|
|
|
| namespace {
|
|
|
| +typedef std::map<std::string, FileCacheEntry> CacheMap;
|
| +
|
| enum DBOpenStatus {
|
| DB_OPEN_SUCCESS,
|
| DB_OPEN_FAILURE_CORRUPTION,
|
| @@ -33,11 +35,10 @@ typedef std::map<std::string, base::FilePath> ResourceIdToFilePathMap;
|
| //
|
| // The resource IDs and file paths of discovered files are collected as a
|
| // ResourceIdToFilePathMap, if these are processed properly.
|
| -void ScanCacheDirectory(
|
| - const std::vector<base::FilePath>& cache_paths,
|
| - FileCache::CacheSubDirectoryType sub_dir_type,
|
| - FileCacheMetadata::CacheMap* cache_map,
|
| - ResourceIdToFilePathMap* processed_file_map) {
|
| +void ScanCacheDirectory(const std::vector<base::FilePath>& cache_paths,
|
| + FileCache::CacheSubDirectoryType sub_dir_type,
|
| + CacheMap* cache_map,
|
| + ResourceIdToFilePathMap* processed_file_map) {
|
| DCHECK(cache_map);
|
| DCHECK(processed_file_map);
|
|
|
| @@ -90,7 +91,7 @@ void ScanCacheDirectory(
|
| }
|
|
|
| void ScanCachePaths(const std::vector<base::FilePath>& cache_paths,
|
| - FileCacheMetadata::CacheMap* cache_map) {
|
| + CacheMap* cache_map) {
|
| DVLOG(1) << "Scanning directories";
|
|
|
| // Scan cache persistent and tmp directories to enumerate all files and create
|
| @@ -114,8 +115,7 @@ void ScanCachePaths(const std::vector<base::FilePath>& cache_paths,
|
| const std::string& resource_id = iter->first;
|
| const base::FilePath& file_path = iter->second;
|
|
|
| - FileCacheMetadata::CacheMap::iterator cache_map_iter =
|
| - cache_map->find(resource_id);
|
| + CacheMap::iterator cache_map_iter = cache_map->find(resource_id);
|
| if (cache_map_iter != cache_map->end()) {
|
| FileCacheEntry* cache_entry = &cache_map_iter->second;
|
| const bool is_dirty = cache_entry->is_dirty();
|
| @@ -136,9 +136,8 @@ void ScanCachePaths(const std::vector<base::FilePath>& cache_paths,
|
|
|
| // Returns true if |md5| matches the one in |cache_entry| with some
|
| // exceptions. See the function definition for details.
|
| -bool CheckIfMd5Matches(
|
| - const std::string& md5,
|
| - const FileCacheEntry& cache_entry) {
|
| +bool CheckIfMd5Matches(const std::string& md5,
|
| + const FileCacheEntry& cache_entry) {
|
| if (cache_entry.is_dirty()) {
|
| // If the entry is dirty, its MD5 may have been replaced by "local"
|
| // during cache initialization, so we don't compare MD5.
|
| @@ -159,171 +158,28 @@ bool CheckIfMd5Matches(
|
| return false;
|
| }
|
|
|
| -////////////////////////////////////////////////////////////////////////////////
|
| -// FileCacheMetadata implementation with std::map.
|
| -// Used for testing.
|
| -
|
| -class FakeCacheMetadata : public FileCacheMetadata {
|
| - public:
|
| - explicit FakeCacheMetadata(
|
| - base::SequencedTaskRunner* blocking_task_runner);
|
| -
|
| - private:
|
| - virtual ~FakeCacheMetadata();
|
| -
|
| - // FileCacheMetadata overrides:
|
| - virtual bool Initialize(
|
| - const std::vector<base::FilePath>& cache_paths) OVERRIDE;
|
| - virtual void AddOrUpdateCacheEntry(
|
| - const std::string& resource_id,
|
| - const FileCacheEntry& cache_entry) OVERRIDE;
|
| - virtual void RemoveCacheEntry(const std::string& resource_id) OVERRIDE;
|
| - virtual bool GetCacheEntry(const std::string& resource_id,
|
| - const std::string& md5,
|
| - FileCacheEntry* cache_entry) OVERRIDE;
|
| - virtual void RemoveTemporaryFiles() OVERRIDE;
|
| - virtual void Iterate(const CacheIterateCallback& callback) OVERRIDE;
|
| -
|
| - CacheMap cache_map_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(FakeCacheMetadata);
|
| -};
|
| -
|
| -FakeCacheMetadata::FakeCacheMetadata(
|
| - base::SequencedTaskRunner* blocking_task_runner)
|
| - : FileCacheMetadata(blocking_task_runner) {
|
| - AssertOnSequencedWorkerPool();
|
| -}
|
| -
|
| -FakeCacheMetadata::~FakeCacheMetadata() {
|
| - AssertOnSequencedWorkerPool();
|
| -}
|
| -
|
| -bool FakeCacheMetadata::Initialize(
|
| - const std::vector<base::FilePath>& cache_paths) {
|
| - AssertOnSequencedWorkerPool();
|
| -
|
| - ScanCachePaths(cache_paths, &cache_map_);
|
| - return true;
|
| -}
|
| -
|
| -void FakeCacheMetadata::AddOrUpdateCacheEntry(
|
| - const std::string& resource_id,
|
| - const FileCacheEntry& cache_entry) {
|
| - AssertOnSequencedWorkerPool();
|
| -
|
| - CacheMap::iterator iter = cache_map_.find(resource_id);
|
| - if (iter == cache_map_.end()) { // New resource, create new entry.
|
| - cache_map_.insert(std::make_pair(resource_id, cache_entry));
|
| - } else { // Resource exists.
|
| - cache_map_[resource_id] = cache_entry;
|
| - }
|
| -}
|
| -
|
| -void FakeCacheMetadata::RemoveCacheEntry(const std::string& resource_id) {
|
| - AssertOnSequencedWorkerPool();
|
| -
|
| - CacheMap::iterator iter = cache_map_.find(resource_id);
|
| - if (iter != cache_map_.end()) {
|
| - // Delete the FileCacheEntry and remove it from the map.
|
| - cache_map_.erase(iter);
|
| - }
|
| -}
|
| -
|
| -bool FakeCacheMetadata::GetCacheEntry(const std::string& resource_id,
|
| - const std::string& md5,
|
| - FileCacheEntry* entry) {
|
| - DCHECK(entry);
|
| - AssertOnSequencedWorkerPool();
|
| -
|
| - CacheMap::iterator iter = cache_map_.find(resource_id);
|
| - if (iter == cache_map_.end()) {
|
| - DVLOG(1) << "Can't find " << resource_id << " in cache map";
|
| - return false;
|
| - }
|
| -
|
| - const FileCacheEntry& cache_entry = iter->second;
|
| -
|
| - if (!CheckIfMd5Matches(md5, cache_entry)) {
|
| - return false;
|
| - }
|
| -
|
| - *entry = cache_entry;
|
| - return true;
|
| -}
|
| -
|
| -void FakeCacheMetadata::RemoveTemporaryFiles() {
|
| - AssertOnSequencedWorkerPool();
|
| -
|
| - CacheMap::iterator iter = cache_map_.begin();
|
| - while (iter != cache_map_.end()) {
|
| - if (!iter->second.is_persistent()) {
|
| - // Post-increment the iterator to avoid iterator invalidation.
|
| - cache_map_.erase(iter++);
|
| - } else {
|
| - ++iter;
|
| - }
|
| - }
|
| -}
|
| -
|
| -void FakeCacheMetadata::Iterate(const CacheIterateCallback& callback) {
|
| - AssertOnSequencedWorkerPool();
|
| -
|
| - for (CacheMap::const_iterator iter = cache_map_.begin();
|
| - iter != cache_map_.end(); ++iter) {
|
| - callback.Run(iter->first, iter->second);
|
| - }
|
| -}
|
| -
|
| -////////////////////////////////////////////////////////////////////////////////
|
| -// FileCacheMetadata implementation with level::db.
|
| -
|
| -class FileCacheMetadataDB : public FileCacheMetadata {
|
| - public:
|
| - explicit FileCacheMetadataDB(
|
| - base::SequencedTaskRunner* blocking_task_runner);
|
| -
|
| - private:
|
| - virtual ~FileCacheMetadataDB();
|
| -
|
| - // FileCacheMetadata overrides:
|
| - virtual bool Initialize(
|
| - const std::vector<base::FilePath>& cache_paths) OVERRIDE;
|
| - virtual void AddOrUpdateCacheEntry(
|
| - const std::string& resource_id,
|
| - const FileCacheEntry& cache_entry) OVERRIDE;
|
| - virtual void RemoveCacheEntry(const std::string& resource_id) OVERRIDE;
|
| - virtual bool GetCacheEntry(const std::string& resource_id,
|
| - const std::string& md5,
|
| - FileCacheEntry* cache_entry) OVERRIDE;
|
| - virtual void RemoveTemporaryFiles() OVERRIDE;
|
| - virtual void Iterate(const CacheIterateCallback& callback) OVERRIDE;
|
| -
|
| - // Helper function to insert |cache_map| entries into the database.
|
| - void InsertMapIntoDB(const CacheMap& cache_map);
|
| -
|
| - scoped_ptr<leveldb::DB> level_db_;
|
| +} // namespace
|
|
|
| - DISALLOW_COPY_AND_ASSIGN(FileCacheMetadataDB);
|
| -};
|
| +// static
|
| +const base::FilePath::CharType* FileCacheMetadata::kCacheMetadataDBPath =
|
| + FILE_PATH_LITERAL("cache_metadata.db");
|
|
|
| -FileCacheMetadataDB::FileCacheMetadataDB(
|
| +FileCacheMetadata::FileCacheMetadata(
|
| base::SequencedTaskRunner* blocking_task_runner)
|
| - : FileCacheMetadata(blocking_task_runner) {
|
| + : blocking_task_runner_(blocking_task_runner) {
|
| AssertOnSequencedWorkerPool();
|
| }
|
|
|
| -FileCacheMetadataDB::~FileCacheMetadataDB() {
|
| +FileCacheMetadata::~FileCacheMetadata() {
|
| AssertOnSequencedWorkerPool();
|
| }
|
|
|
| -bool FileCacheMetadataDB::Initialize(
|
| +bool FileCacheMetadata::Initialize(
|
| const std::vector<base::FilePath>& cache_paths) {
|
| AssertOnSequencedWorkerPool();
|
|
|
| const base::FilePath db_path =
|
| - cache_paths[FileCache::CACHE_TYPE_META].Append(
|
| - kCacheMetadataDBPath);
|
| + cache_paths[FileCache::CACHE_TYPE_META].Append(kCacheMetadataDBPath);
|
| DVLOG(1) << "db path=" << db_path.value();
|
|
|
| bool scan_cache = !file_util::PathExists(db_path);
|
| @@ -365,21 +221,16 @@ bool FileCacheMetadataDB::Initialize(
|
| if (scan_cache) {
|
| CacheMap cache_map;
|
| ScanCachePaths(cache_paths, &cache_map);
|
| - InsertMapIntoDB(cache_map);
|
| + for (CacheMap::const_iterator it = cache_map.begin();
|
| + it != cache_map.end(); ++it) {
|
| + AddOrUpdateCacheEntry(it->first, it->second);
|
| + }
|
| }
|
|
|
| return true;
|
| }
|
|
|
| -void FileCacheMetadataDB::InsertMapIntoDB(const CacheMap& cache_map) {
|
| - DVLOG(1) << "InsertMapIntoDB";
|
| - for (CacheMap::const_iterator it = cache_map.begin();
|
| - it != cache_map.end(); ++it) {
|
| - AddOrUpdateCacheEntry(it->first, it->second);
|
| - }
|
| -}
|
| -
|
| -void FileCacheMetadataDB::AddOrUpdateCacheEntry(
|
| +void FileCacheMetadata::AddOrUpdateCacheEntry(
|
| const std::string& resource_id,
|
| const FileCacheEntry& cache_entry) {
|
| AssertOnSequencedWorkerPool();
|
| @@ -393,16 +244,16 @@ void FileCacheMetadataDB::AddOrUpdateCacheEntry(
|
| leveldb::Slice(serialized));
|
| }
|
|
|
| -void FileCacheMetadataDB::RemoveCacheEntry(const std::string& resource_id) {
|
| +void FileCacheMetadata::RemoveCacheEntry(const std::string& resource_id) {
|
| AssertOnSequencedWorkerPool();
|
|
|
| DVLOG(1) << "RemoveCacheEntry, resource_id=" << resource_id;
|
| level_db_->Delete(leveldb::WriteOptions(), leveldb::Slice(resource_id));
|
| }
|
|
|
| -bool FileCacheMetadataDB::GetCacheEntry(const std::string& resource_id,
|
| - const std::string& md5,
|
| - FileCacheEntry* entry) {
|
| +bool FileCacheMetadata::GetCacheEntry(const std::string& resource_id,
|
| + const std::string& md5,
|
| + FileCacheEntry* entry) {
|
| DCHECK(entry);
|
| AssertOnSequencedWorkerPool();
|
|
|
| @@ -430,7 +281,7 @@ bool FileCacheMetadataDB::GetCacheEntry(const std::string& resource_id,
|
| return true;
|
| }
|
|
|
| -void FileCacheMetadataDB::RemoveTemporaryFiles() {
|
| +void FileCacheMetadata::RemoveTemporaryFiles() {
|
| AssertOnSequencedWorkerPool();
|
|
|
| scoped_ptr<leveldb::Iterator> iter(level_db_->NewIterator(
|
| @@ -444,7 +295,7 @@ void FileCacheMetadataDB::RemoveTemporaryFiles() {
|
| }
|
| }
|
|
|
| -void FileCacheMetadataDB::Iterate(const CacheIterateCallback& callback) {
|
| +void FileCacheMetadata::Iterate(const CacheIterateCallback& callback) {
|
| AssertOnSequencedWorkerPool();
|
|
|
| scoped_ptr<leveldb::Iterator> iter(level_db_->NewIterator(
|
| @@ -458,38 +309,6 @@ void FileCacheMetadataDB::Iterate(const CacheIterateCallback& callback) {
|
| }
|
| }
|
|
|
| -} // namespace
|
| -
|
| -// static
|
| -const base::FilePath::CharType* FileCacheMetadata::kCacheMetadataDBPath =
|
| - FILE_PATH_LITERAL("cache_metadata.db");
|
| -
|
| -
|
| -FileCacheMetadata::FileCacheMetadata(
|
| - base::SequencedTaskRunner* blocking_task_runner)
|
| - : blocking_task_runner_(blocking_task_runner) {
|
| - AssertOnSequencedWorkerPool();
|
| -}
|
| -
|
| -FileCacheMetadata::~FileCacheMetadata() {
|
| - AssertOnSequencedWorkerPool();
|
| -}
|
| -
|
| -// static
|
| -scoped_ptr<FileCacheMetadata> FileCacheMetadata::CreateCacheMetadata(
|
| - base::SequencedTaskRunner* blocking_task_runner) {
|
| - return scoped_ptr<FileCacheMetadata>(
|
| - new FileCacheMetadataDB(blocking_task_runner));
|
| -}
|
| -
|
| -// static
|
| -scoped_ptr<FileCacheMetadata>
|
| -FileCacheMetadata::CreateCacheMetadataForTesting(
|
| - base::SequencedTaskRunner* blocking_task_runner) {
|
| - return scoped_ptr<FileCacheMetadata>(
|
| - new FakeCacheMetadata(blocking_task_runner));
|
| -}
|
| -
|
| void FileCacheMetadata::AssertOnSequencedWorkerPool() {
|
| DCHECK(!blocking_task_runner_ ||
|
| blocking_task_runner_->RunsTasksOnCurrentThread());
|
|
|