| Index: chrome/browser/chromeos/drive/resource_metadata_storage.cc
|
| diff --git a/chrome/browser/chromeos/drive/resource_metadata_storage.cc b/chrome/browser/chromeos/drive/resource_metadata_storage.cc
|
| index b595887802cb65f0c953d7b8bee95b92f2bd07b1..9bef1e520a1571755eecd8a0ee81a9f41e03bd78 100644
|
| --- a/chrome/browser/chromeos/drive/resource_metadata_storage.cc
|
| +++ b/chrome/browser/chromeos/drive/resource_metadata_storage.cc
|
| @@ -13,6 +13,7 @@
|
| #include "base/sequenced_task_runner.h"
|
| #include "base/threading/thread_restrictions.h"
|
| #include "chrome/browser/chromeos/drive/drive.pb.h"
|
| +#include "third_party/leveldatabase/env_chromium.h"
|
| #include "third_party/leveldatabase/src/include/leveldb/db.h"
|
| #include "third_party/leveldatabase/src/include/leveldb/write_batch.h"
|
|
|
| @@ -126,7 +127,7 @@ bool IsIdEntryKey(const leveldb::Slice& key) {
|
| }
|
|
|
| // Converts leveldb::Status to DBInitStatus.
|
| -DBInitStatus LevelDBStatusToDBInitStatus(const leveldb::Status status) {
|
| +DBInitStatus LevelDBStatusToDBInitStatus(const leveldb::Status& status) {
|
| if (status.ok())
|
| return DB_INIT_SUCCESS;
|
| if (status.IsNotFound())
|
| @@ -138,6 +139,17 @@ DBInitStatus LevelDBStatusToDBInitStatus(const leveldb::Status status) {
|
| return DB_INIT_FAILED;
|
| }
|
|
|
| +// Converts leveldb::Status to FileError.
|
| +FileError LevelDBStatusToFileError(const leveldb::Status& status) {
|
| + if (status.ok())
|
| + return FILE_ERROR_OK;
|
| + if (status.IsNotFound())
|
| + return FILE_ERROR_NOT_FOUND;
|
| + if (leveldb_env::IndicatesDiskFull(status))
|
| + return FILE_ERROR_NO_LOCAL_SPACE;
|
| + return FILE_ERROR_FAILED;
|
| +}
|
| +
|
| ResourceMetadataHeader GetDefaultHeaderEntry() {
|
| ResourceMetadataHeader header;
|
| header.set_version(ResourceMetadataStorage::kDBVersion);
|
| @@ -439,7 +451,7 @@ bool ResourceMetadataStorage::Initialize() {
|
| // Check the validity of existing DB.
|
| int db_version = -1;
|
| ResourceMetadataHeader header;
|
| - if (GetHeader(&header))
|
| + if (GetHeader(&header) == FILE_ERROR_OK)
|
| db_version = header.version();
|
|
|
| bool should_discard_db = true;
|
| @@ -481,8 +493,9 @@ bool ResourceMetadataStorage::Initialize() {
|
| if (status.ok()) {
|
| resource_map_.reset(db);
|
|
|
| - if (PutHeader(GetDefaultHeaderEntry()) && // Set up header.
|
| - MoveIfPossible(preserved_resource_map_path, // Trash the old DB.
|
| + // Set up header and trash the old DB.
|
| + if (PutHeader(GetDefaultHeaderEntry()) == FILE_ERROR_OK &&
|
| + MoveIfPossible(preserved_resource_map_path,
|
| trashed_resource_map_path)) {
|
| init_result = open_existing_result == DB_INIT_NOT_FOUND ?
|
| DB_INIT_CREATED_NEW_DB : DB_INIT_REPLACED_EXISTING_DB_WITH_NEW_DB;
|
| @@ -569,30 +582,34 @@ void ResourceMetadataStorage::RecoverCacheInfoFromTrashedResourceMap(
|
| }
|
| }
|
|
|
| -bool ResourceMetadataStorage::SetLargestChangestamp(
|
| +FileError ResourceMetadataStorage::SetLargestChangestamp(
|
| int64 largest_changestamp) {
|
| base::ThreadRestrictions::AssertIOAllowed();
|
|
|
| ResourceMetadataHeader header;
|
| - if (!GetHeader(&header)) {
|
| + FileError error = GetHeader(&header);
|
| + if (error != FILE_ERROR_OK) {
|
| DLOG(ERROR) << "Failed to get the header.";
|
| - return false;
|
| + return error;
|
| }
|
| header.set_largest_changestamp(largest_changestamp);
|
| return PutHeader(header);
|
| }
|
|
|
| -int64 ResourceMetadataStorage::GetLargestChangestamp() {
|
| +FileError ResourceMetadataStorage::GetLargestChangestamp(
|
| + int64* largest_changestamp) {
|
| base::ThreadRestrictions::AssertIOAllowed();
|
| ResourceMetadataHeader header;
|
| - if (!GetHeader(&header)) {
|
| + FileError error = GetHeader(&header);
|
| + if (error != FILE_ERROR_OK) {
|
| DLOG(ERROR) << "Failed to get the header.";
|
| - return 0;
|
| + return error;
|
| }
|
| - return header.largest_changestamp();
|
| + *largest_changestamp = header.largest_changestamp();
|
| + return FILE_ERROR_OK;
|
| }
|
|
|
| -bool ResourceMetadataStorage::PutEntry(const ResourceEntry& entry) {
|
| +FileError ResourceMetadataStorage::PutEntry(const ResourceEntry& entry) {
|
| base::ThreadRestrictions::AssertIOAllowed();
|
|
|
| const std::string& id = entry.local_id();
|
| @@ -604,11 +621,11 @@ bool ResourceMetadataStorage::PutEntry(const ResourceEntry& entry) {
|
| leveldb::Slice(id),
|
| &serialized_entry);
|
| if (!status.ok() && !status.IsNotFound()) // Unexpected errors.
|
| - return false;
|
| + return LevelDBStatusToFileError(status);
|
|
|
| ResourceEntry old_entry;
|
| if (status.ok() && !old_entry.ParseFromString(serialized_entry))
|
| - return false;
|
| + return FILE_ERROR_FAILED;
|
|
|
| // Construct write batch.
|
| leveldb::WriteBatch batch;
|
| @@ -636,16 +653,16 @@ bool ResourceMetadataStorage::PutEntry(const ResourceEntry& entry) {
|
| // Put the entry itself.
|
| if (!entry.SerializeToString(&serialized_entry)) {
|
| DLOG(ERROR) << "Failed to serialize the entry: " << id;
|
| - return false;
|
| + return FILE_ERROR_FAILED;
|
| }
|
| batch.Put(id, serialized_entry);
|
|
|
| status = resource_map_->Write(leveldb::WriteOptions(), &batch);
|
| - return status.ok();
|
| + return LevelDBStatusToFileError(status);
|
| }
|
|
|
| -bool ResourceMetadataStorage::GetEntry(const std::string& id,
|
| - ResourceEntry* out_entry) {
|
| +FileError ResourceMetadataStorage::GetEntry(const std::string& id,
|
| + ResourceEntry* out_entry) {
|
| base::ThreadRestrictions::AssertIOAllowed();
|
| DCHECK(!id.empty());
|
|
|
| @@ -653,16 +670,20 @@ bool ResourceMetadataStorage::GetEntry(const std::string& id,
|
| const leveldb::Status status = resource_map_->Get(leveldb::ReadOptions(),
|
| leveldb::Slice(id),
|
| &serialized_entry);
|
| - return status.ok() && out_entry->ParseFromString(serialized_entry);
|
| + if (!status.ok())
|
| + return LevelDBStatusToFileError(status);
|
| + return out_entry->ParseFromString(serialized_entry) ?
|
| + FILE_ERROR_OK : FILE_ERROR_FAILED;
|
| }
|
|
|
| -bool ResourceMetadataStorage::RemoveEntry(const std::string& id) {
|
| +FileError ResourceMetadataStorage::RemoveEntry(const std::string& id) {
|
| base::ThreadRestrictions::AssertIOAllowed();
|
| DCHECK(!id.empty());
|
|
|
| ResourceEntry entry;
|
| - if (!GetEntry(id, &entry))
|
| - return false;
|
| + FileError error = GetEntry(id, &entry);
|
| + if (error != FILE_ERROR_OK)
|
| + return error;
|
|
|
| leveldb::WriteBatch batch;
|
|
|
| @@ -679,7 +700,7 @@ bool ResourceMetadataStorage::RemoveEntry(const std::string& id) {
|
|
|
| const leveldb::Status status = resource_map_->Write(leveldb::WriteOptions(),
|
| &batch);
|
| - return status.ok();
|
| + return LevelDBStatusToFileError(status);
|
| }
|
|
|
| scoped_ptr<ResourceMetadataStorage::Iterator>
|
| @@ -691,21 +712,24 @@ ResourceMetadataStorage::GetIterator() {
|
| return make_scoped_ptr(new Iterator(it.Pass()));
|
| }
|
|
|
| -std::string ResourceMetadataStorage::GetChild(const std::string& parent_id,
|
| - const std::string& child_name) {
|
| +FileError ResourceMetadataStorage::GetChild(const std::string& parent_id,
|
| + const std::string& child_name,
|
| + std::string* child_id) {
|
| base::ThreadRestrictions::AssertIOAllowed();
|
| DCHECK(!parent_id.empty());
|
| DCHECK(!child_name.empty());
|
|
|
| - std::string child_id;
|
| - resource_map_->Get(leveldb::ReadOptions(),
|
| - leveldb::Slice(GetChildEntryKey(parent_id, child_name)),
|
| - &child_id);
|
| - return child_id;
|
| + const leveldb::Status status =
|
| + resource_map_->Get(
|
| + leveldb::ReadOptions(),
|
| + leveldb::Slice(GetChildEntryKey(parent_id, child_name)),
|
| + child_id);
|
| + return LevelDBStatusToFileError(status);
|
| }
|
|
|
| -void ResourceMetadataStorage::GetChildren(const std::string& parent_id,
|
| - std::vector<std::string>* children) {
|
| +FileError ResourceMetadataStorage::GetChildren(
|
| + const std::string& parent_id,
|
| + std::vector<std::string>* children) {
|
| base::ThreadRestrictions::AssertIOAllowed();
|
| DCHECK(!parent_id.empty());
|
|
|
| @@ -718,29 +742,29 @@ void ResourceMetadataStorage::GetChildren(const std::string& parent_id,
|
| if (IsChildEntryKey(it->key()))
|
| children->push_back(it->value().ToString());
|
| }
|
| - DCHECK(it->status().ok());
|
| + return LevelDBStatusToFileError(it->status());
|
| }
|
|
|
| -bool ResourceMetadataStorage::PutCacheEntry(const std::string& id,
|
| - const FileCacheEntry& entry) {
|
| +FileError ResourceMetadataStorage::PutCacheEntry(const std::string& id,
|
| + const FileCacheEntry& entry) {
|
| base::ThreadRestrictions::AssertIOAllowed();
|
| DCHECK(!id.empty());
|
|
|
| std::string serialized_entry;
|
| if (!entry.SerializeToString(&serialized_entry)) {
|
| DLOG(ERROR) << "Failed to serialize the entry.";
|
| - return false;
|
| + return FILE_ERROR_FAILED;
|
| }
|
|
|
| const leveldb::Status status = resource_map_->Put(
|
| leveldb::WriteOptions(),
|
| leveldb::Slice(GetCacheEntryKey(id)),
|
| leveldb::Slice(serialized_entry));
|
| - return status.ok();
|
| + return LevelDBStatusToFileError(status);
|
| }
|
|
|
| -bool ResourceMetadataStorage::GetCacheEntry(const std::string& id,
|
| - FileCacheEntry* out_entry) {
|
| +FileError ResourceMetadataStorage::GetCacheEntry(const std::string& id,
|
| + FileCacheEntry* out_entry) {
|
| base::ThreadRestrictions::AssertIOAllowed();
|
| DCHECK(!id.empty());
|
|
|
| @@ -749,17 +773,20 @@ bool ResourceMetadataStorage::GetCacheEntry(const std::string& id,
|
| leveldb::ReadOptions(),
|
| leveldb::Slice(GetCacheEntryKey(id)),
|
| &serialized_entry);
|
| - return status.ok() && out_entry->ParseFromString(serialized_entry);
|
| + if (!status.ok())
|
| + return LevelDBStatusToFileError(status);
|
| + return out_entry->ParseFromString(serialized_entry) ?
|
| + FILE_ERROR_OK : FILE_ERROR_FAILED;
|
| }
|
|
|
| -bool ResourceMetadataStorage::RemoveCacheEntry(const std::string& id) {
|
| +FileError ResourceMetadataStorage::RemoveCacheEntry(const std::string& id) {
|
| base::ThreadRestrictions::AssertIOAllowed();
|
| DCHECK(!id.empty());
|
|
|
| const leveldb::Status status = resource_map_->Delete(
|
| leveldb::WriteOptions(),
|
| leveldb::Slice(GetCacheEntryKey(id)));
|
| - return status.ok();
|
| + return LevelDBStatusToFileError(status);
|
| }
|
|
|
| scoped_ptr<ResourceMetadataStorage::CacheEntryIterator>
|
| @@ -776,7 +803,7 @@ ResourceMetadataStorage::RecoveredCacheInfo::RecoveredCacheInfo()
|
|
|
| ResourceMetadataStorage::RecoveredCacheInfo::~RecoveredCacheInfo() {}
|
|
|
| -bool ResourceMetadataStorage::GetIdByResourceId(
|
| +FileError ResourceMetadataStorage::GetIdByResourceId(
|
| const std::string& resource_id,
|
| std::string* out_id) {
|
| base::ThreadRestrictions::AssertIOAllowed();
|
| @@ -786,7 +813,7 @@ bool ResourceMetadataStorage::GetIdByResourceId(
|
| leveldb::ReadOptions(),
|
| leveldb::Slice(GetIdEntryKey(resource_id)),
|
| out_id);
|
| - return status.ok();
|
| + return LevelDBStatusToFileError(status);
|
| }
|
|
|
| ResourceMetadataStorage::~ResourceMetadataStorage() {
|
| @@ -811,24 +838,24 @@ std::string ResourceMetadataStorage::GetChildEntryKey(
|
| return key;
|
| }
|
|
|
| -bool ResourceMetadataStorage::PutHeader(
|
| +FileError ResourceMetadataStorage::PutHeader(
|
| const ResourceMetadataHeader& header) {
|
| base::ThreadRestrictions::AssertIOAllowed();
|
|
|
| std::string serialized_header;
|
| if (!header.SerializeToString(&serialized_header)) {
|
| DLOG(ERROR) << "Failed to serialize the header";
|
| - return false;
|
| + return FILE_ERROR_FAILED;
|
| }
|
|
|
| const leveldb::Status status = resource_map_->Put(
|
| leveldb::WriteOptions(),
|
| leveldb::Slice(GetHeaderDBKey()),
|
| leveldb::Slice(serialized_header));
|
| - return status.ok();
|
| + return LevelDBStatusToFileError(status);
|
| }
|
|
|
| -bool ResourceMetadataStorage::GetHeader(ResourceMetadataHeader* header) {
|
| +FileError ResourceMetadataStorage::GetHeader(ResourceMetadataHeader* header) {
|
| base::ThreadRestrictions::AssertIOAllowed();
|
|
|
| std::string serialized_header;
|
| @@ -836,7 +863,10 @@ bool ResourceMetadataStorage::GetHeader(ResourceMetadataHeader* header) {
|
| leveldb::ReadOptions(),
|
| leveldb::Slice(GetHeaderDBKey()),
|
| &serialized_header);
|
| - return status.ok() && header->ParseFromString(serialized_header);
|
| + if (!status.ok())
|
| + return LevelDBStatusToFileError(status);
|
| + return header->ParseFromString(serialized_header) ?
|
| + FILE_ERROR_OK : FILE_ERROR_FAILED;
|
| }
|
|
|
| bool ResourceMetadataStorage::CheckValidity() {
|
|
|