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

Unified Diff: chrome/browser/sync_file_system/drive_metadata_store.cc

Issue 12744008: SyncFS: store disabled origins in DriveMetadataStore (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: unit tests and review fix Created 7 years, 9 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
Index: chrome/browser/sync_file_system/drive_metadata_store.cc
diff --git a/chrome/browser/sync_file_system/drive_metadata_store.cc b/chrome/browser/sync_file_system/drive_metadata_store.cc
index 3831c43c5f96d026873c4346129f9d57baaf95fe..2598e7a62404bdc8dfbddd872d1ec3a98221622e 100644
--- a/chrome/browser/sync_file_system/drive_metadata_store.cc
+++ b/chrome/browser/sync_file_system/drive_metadata_store.cc
@@ -44,6 +44,7 @@ const char kDriveMetadataKeyPrefix[] = "METADATA: ";
const char kMetadataKeySeparator = ' ';
const char kDriveBatchSyncOriginKeyPrefix[] = "BSYNC_ORIGIN: ";
const char kDriveIncrementalSyncOriginKeyPrefix[] = "ISYNC_ORIGIN: ";
+const char kDriveDisabledSyncOriginKeyPrefix[] = "DSYNC_ORIGIN: ";
const size_t kDriveMetadataKeyPrefixLength = arraysize(kDriveMetadataKeyPrefix);
const base::FilePath::CharType kV0FormatPathPrefix[] =
@@ -111,14 +112,22 @@ class DriveMetadataDB {
const DriveMetadata& metadata);
SyncStatusCode DeleteEntry(const FileSystemURL& url);
+ // TODO(calvinlo): consolidate these state transition functions for sync
+ // origins like "UpdateSyncOrigin(GURL, SyncStatusEnum)". And manage origins
+ // in just one map like "Map<SyncStatusEnum, ResourceIDMap>".
kinuko 2013/03/16 23:16:51 Can we file a bug for this?
nhiroki 2013/03/18 09:40:18 Done.
SyncStatusCode UpdateSyncOriginAsBatch(const GURL& origin,
const std::string& resource_id);
SyncStatusCode UpdateSyncOriginAsIncremental(const GURL& origin,
const std::string& resource_id);
+ SyncStatusCode EnableOriginSync(const GURL& origin,
+ const std::string& resource_id);
+ SyncStatusCode DisableOriginSync(const GURL& origin,
+ const std::string& resource_id);
SyncStatusCode RemoveOrigin(const GURL& origin);
SyncStatusCode GetSyncOrigins(ResourceIDMap* batch_sync_origins,
- ResourceIDMap* incremental_sync_origins);
+ ResourceIDMap* incremental_sync_origins,
+ ResourceIDMap* disabled_sync_origins);
kinuko 2013/03/16 23:16:51 Hmm, ok so we seem to use the term 'SyncOrigin' a
nhiroki 2013/03/18 09:40:18 Looks good. (hopefully) I replaced them without an
private:
bool CalledOnValidThread() const {
@@ -139,6 +148,7 @@ struct DriveMetadataDBContents {
std::string sync_root_directory_resource_id;
DriveMetadataStore::ResourceIDMap batch_sync_origins;
DriveMetadataStore::ResourceIDMap incremental_sync_origins;
+ DriveMetadataStore::ResourceIDMap disabled_sync_origins;
};
namespace {
@@ -152,6 +162,7 @@ SyncStatusCode InitializeDBOnFileThread(DriveMetadataDB* db,
contents->metadata_map.clear();
contents->batch_sync_origins.clear();
contents->incremental_sync_origins.clear();
+ contents->disabled_sync_origins.clear();
bool created = false;
SyncStatusCode status = db->Initialize(&created);
@@ -169,9 +180,11 @@ SyncStatusCode InitializeDBOnFileThread(DriveMetadataDB* db,
return db->ReadContents(contents);
}
+
// Returns a key string for the given batch sync origin.
// For example, when |origin| is "http://www.example.com",
// returns "BSYNC_ORIGIN: http://www.example.com".
+// TODO(calvinlo): consolidate these CreateKeyFor* functions.
std::string CreateKeyForBatchSyncOrigin(const GURL& origin) {
DCHECK(origin.is_valid());
return kDriveBatchSyncOriginKeyPrefix + origin.spec();
@@ -185,6 +198,14 @@ std::string CreateKeyForIncrementalSyncOrigin(const GURL& origin) {
return kDriveIncrementalSyncOriginKeyPrefix + origin.spec();
}
+// Returns a key string for the given disabled sync origin.
+// For example, when |origin| is "http://www.example.com",
+// returns "DSYNC_ORIGIN: http://www.example.com".
+std::string CreateKeyForDisabledSyncOrigin(const GURL& origin) {
+ DCHECK(origin.is_valid());
+ return kDriveDisabledSyncOriginKeyPrefix + origin.spec();
+}
+
void AddOriginsToVector(std::vector<GURL>* all_origins,
const DriveMetadataStore::ResourceIDMap& resource_map) {
typedef DriveMetadataStore::ResourceIDMap::const_iterator itr;
@@ -240,6 +261,7 @@ void DriveMetadataStore::DidInitialize(const InitializationCallback& callback,
sync_root_directory_resource_id_ = contents->sync_root_directory_resource_id;
batch_sync_origins_.swap(contents->batch_sync_origins);
incremental_sync_origins_.swap(contents->incremental_sync_origins);
+ disabled_sync_origins_.swap(contents->disabled_sync_origins);
// |largest_changestamp_| is set to 0 for a fresh empty database.
callback.Run(status, largest_changestamp_ <= 0);
}
@@ -280,26 +302,31 @@ void DriveMetadataStore::RestoreSyncOrigins(
DCHECK(CalledOnValidThread());
ResourceIDMap* batch_sync_origins = new ResourceIDMap;
ResourceIDMap* incremental_sync_origins = new ResourceIDMap;
+ ResourceIDMap* disabled_sync_origins = new ResourceIDMap;
base::PostTaskAndReplyWithResult(
file_task_runner_, FROM_HERE,
base::Bind(&DriveMetadataDB::GetSyncOrigins,
base::Unretained(db_.get()),
batch_sync_origins,
- incremental_sync_origins),
+ incremental_sync_origins,
+ disabled_sync_origins),
base::Bind(&DriveMetadataStore::DidRestoreSyncOrigins,
AsWeakPtr(), callback,
base::Owned(batch_sync_origins),
- base::Owned(incremental_sync_origins)));
+ base::Owned(incremental_sync_origins),
+ base::Owned(disabled_sync_origins)));
}
void DriveMetadataStore::DidRestoreSyncOrigins(
const SyncStatusCallback& callback,
ResourceIDMap* batch_sync_origins,
ResourceIDMap* incremental_sync_origins,
+ ResourceIDMap* disabled_sync_origins,
SyncStatusCode status) {
DCHECK(CalledOnValidThread());
DCHECK(batch_sync_origins);
DCHECK(incremental_sync_origins);
+ DCHECK(disabled_sync_origins);
db_status_ = status;
if (status != SYNC_STATUS_OK) {
@@ -309,6 +336,7 @@ void DriveMetadataStore::DidRestoreSyncOrigins(
batch_sync_origins_.swap(*batch_sync_origins);
incremental_sync_origins_.swap(*incremental_sync_origins);
+ disabled_sync_origins_.swap(*disabled_sync_origins);
callback.Run(status);
}
@@ -420,11 +448,17 @@ bool DriveMetadataStore::IsIncrementalSyncOrigin(const GURL& origin) const {
return ContainsKey(incremental_sync_origins_, origin);
}
+bool DriveMetadataStore::IsDisabledSyncOrigin(const GURL& origin) const {
+ DCHECK(CalledOnValidThread());
+ return ContainsKey(disabled_sync_origins_, origin);
+}
+
void DriveMetadataStore::AddBatchSyncOrigin(const GURL& origin,
const std::string& resource_id) {
DCHECK(CalledOnValidThread());
DCHECK(!IsBatchSyncOrigin(origin));
DCHECK(!IsIncrementalSyncOrigin(origin));
+ DCHECK(!IsDisabledSyncOrigin(origin));
DCHECK_EQ(SYNC_STATUS_OK, db_status_);
batch_sync_origins_.insert(std::make_pair(origin, resource_id));
@@ -441,6 +475,7 @@ void DriveMetadataStore::MoveBatchSyncOriginToIncremental(const GURL& origin) {
DCHECK(CalledOnValidThread());
DCHECK(IsBatchSyncOrigin(origin));
DCHECK(!IsIncrementalSyncOrigin(origin));
+ DCHECK(!IsDisabledSyncOrigin(origin));
DCHECK_EQ(SYNC_STATUS_OK, db_status_);
std::map<GURL, std::string>::iterator found =
@@ -457,6 +492,60 @@ void DriveMetadataStore::MoveBatchSyncOriginToIncremental(const GURL& origin) {
batch_sync_origins_.erase(found);
}
+void DriveMetadataStore::EnableOriginSync(
+ const GURL& origin,
+ const SyncStatusCallback& callback) {
+ DCHECK(CalledOnValidThread());
+ DCHECK(IsDisabledSyncOrigin(origin));
+ DCHECK(!IsBatchSyncOrigin(origin));
+ DCHECK(!IsIncrementalSyncOrigin(origin));
kinuko 2013/03/16 23:16:51 Nit-picky comment: If we had a crash after an exte
nhiroki 2013/03/18 09:40:18 You are right. I think it's not needed to check th
+
+ std::map<GURL, std::string>::iterator found =
+ disabled_sync_origins_.find(origin);
+ batch_sync_origins_.insert(std::make_pair(origin, found->second));
+
+ // Store a pair of |origin| and |resource_id| in the DB.
+ base::PostTaskAndReplyWithResult(
+ file_task_runner_, FROM_HERE,
+ base::Bind(&DriveMetadataDB::EnableOriginSync,
+ base::Unretained(db_.get()), origin, found->second),
+ base::Bind(&DriveMetadataStore::DidChangeOrigin, AsWeakPtr(), callback));
+
+ disabled_sync_origins_.erase(found);
+}
+
+void DriveMetadataStore::DisableOriginSync(
+ const GURL& origin,
+ const SyncStatusCallback& callback) {
+ DCHECK(CalledOnValidThread());
+ DCHECK(IsBatchSyncOrigin(origin) || IsIncrementalSyncOrigin(origin));
+ DCHECK(!IsDisabledSyncOrigin(origin));
kinuko 2013/03/16 23:16:51 Ditto.
nhiroki 2013/03/18 09:40:18 Done.
+
+ std::string resource_id;
+ std::map<GURL, std::string>::iterator found =
+ batch_sync_origins_.find(origin);
+ if (found != batch_sync_origins_.end()) {
+ resource_id = found->second;
+ batch_sync_origins_.erase(found);
+ }
+
+ found = incremental_sync_origins_.find(origin);
+ if (found != incremental_sync_origins_.end()) {
+ resource_id = found->second;
+ incremental_sync_origins_.erase(found);
+ }
+
+ DCHECK(!resource_id.empty());
+ disabled_sync_origins_.insert(std::make_pair(origin, resource_id));
+
+ // Store a pair of |origin| and |resource_id| in the DB.
+ base::PostTaskAndReplyWithResult(
+ file_task_runner_, FROM_HERE,
+ base::Bind(&DriveMetadataDB::DisableOriginSync,
+ base::Unretained(db_.get()), origin, resource_id),
+ base::Bind(&DriveMetadataStore::DidChangeOrigin, AsWeakPtr(), callback));
+}
+
void DriveMetadataStore::RemoveOrigin(
const GURL& origin,
const SyncStatusCallback& callback) {
@@ -465,15 +554,16 @@ void DriveMetadataStore::RemoveOrigin(
metadata_map_.erase(origin);
batch_sync_origins_.erase(origin);
incremental_sync_origins_.erase(origin);
+ disabled_sync_origins_.erase(origin);
base::PostTaskAndReplyWithResult(
file_task_runner_, FROM_HERE,
base::Bind(&DriveMetadataDB::RemoveOrigin,
base::Unretained(db_.get()), origin),
- base::Bind(&DriveMetadataStore::DidRemoveOrigin, AsWeakPtr(), callback));
+ base::Bind(&DriveMetadataStore::DidChangeOrigin, AsWeakPtr(), callback));
}
-void DriveMetadataStore::DidRemoveOrigin(
+void DriveMetadataStore::DidChangeOrigin(
const SyncStatusCallback& callback,
SyncStatusCode status) {
UpdateDBStatus(status);
@@ -545,7 +635,9 @@ SyncStatusCode DriveMetadataStore::GetToBeFetchedFiles(
std::string DriveMetadataStore::GetResourceIdForOrigin(
const GURL& origin) const {
DCHECK(CalledOnValidThread());
- DCHECK(IsBatchSyncOrigin(origin) || IsIncrementalSyncOrigin(origin));
+ DCHECK(IsBatchSyncOrigin(origin) ||
+ IsIncrementalSyncOrigin(origin) ||
+ IsDisabledSyncOrigin(origin));
ResourceIDMap::const_iterator found = incremental_sync_origins_.find(origin);
if (found != incremental_sync_origins_.end())
@@ -555,17 +647,28 @@ std::string DriveMetadataStore::GetResourceIdForOrigin(
if (found != batch_sync_origins_.end())
return found->second;
+ found = disabled_sync_origins_.find(origin);
+ if (found != disabled_sync_origins_.end())
+ return found->second;
+
NOTREACHED();
return std::string();
}
-void DriveMetadataStore::GetAllOrigins(std::vector<GURL>* origins) {
+void DriveMetadataStore::GetEnabledOrigins(std::vector<GURL>* origins) {
+ origins->clear();
origins->reserve(batch_sync_origins_.size() +
incremental_sync_origins_.size());
AddOriginsToVector(origins, batch_sync_origins_);
AddOriginsToVector(origins, incremental_sync_origins_);
}
+void DriveMetadataStore::GetDisabledOrigins(std::vector<GURL>* origins) {
+ origins->clear();
+ origins->reserve(disabled_sync_origins_.size());
+ AddOriginsToVector(origins, disabled_sync_origins_);
+}
+
////////////////////////////////////////////////////////////////////////////////
DriveMetadataDB::DriveMetadataDB(const base::FilePath& base_dir,
@@ -646,7 +749,8 @@ SyncStatusCode DriveMetadataDB::ReadContents(
}
SyncStatusCode status = GetSyncOrigins(&contents->batch_sync_origins,
- &contents->incremental_sync_origins);
+ &contents->incremental_sync_origins,
+ &contents->disabled_sync_origins);
if (status != SYNC_STATUS_OK &&
status != SYNC_DATABASE_ERROR_NOT_FOUND)
return status;
@@ -718,6 +822,9 @@ SyncStatusCode DriveMetadataDB::MigrateFromVersion0Database() {
//
// key: "ISYNC_ORIGIN: " + <URL string of a incremental sync origin>
// value: <Resource ID of the drive directory for the origin>
+ //
+ // key: "DSYNC_ORIGIN: " + <URL string of a disabled sync origin>
+ // value: <Resource ID of the drive directory for the origin>
leveldb::WriteBatch write_batch;
write_batch.Put(kDatabaseVersionKey,
@@ -820,18 +927,48 @@ SyncStatusCode DriveMetadataDB::UpdateSyncOriginAsIncremental(
leveldb::WriteBatch batch;
batch.Delete(CreateKeyForBatchSyncOrigin(origin));
+ batch.Delete(CreateKeyForDisabledSyncOrigin(origin));
batch.Put(CreateKeyForIncrementalSyncOrigin(origin), resource_id);
leveldb::Status status = db_->Write(leveldb::WriteOptions(), &batch);
return LevelDBStatusToSyncStatusCode(status);
}
+SyncStatusCode DriveMetadataDB::EnableOriginSync(
+ const GURL& origin, const std::string& resource_id) {
+ DCHECK(CalledOnValidThread());
+ DCHECK(db_.get());
+
+ leveldb::WriteBatch batch;
+ batch.Delete(CreateKeyForIncrementalSyncOrigin(origin));
+ batch.Delete(CreateKeyForDisabledSyncOrigin(origin));
+ batch.Put(CreateKeyForBatchSyncOrigin(origin), resource_id);
+ leveldb::Status status = db_->Write(leveldb::WriteOptions(), &batch);
+
+ return LevelDBStatusToSyncStatusCode(status);
+}
+
+SyncStatusCode DriveMetadataDB::DisableOriginSync(
+ const GURL& origin, const std::string& resource_id) {
+ DCHECK(CalledOnValidThread());
+ DCHECK(db_.get());
+
+ leveldb::WriteBatch batch;
+ batch.Delete(CreateKeyForBatchSyncOrigin(origin));
+ batch.Delete(CreateKeyForIncrementalSyncOrigin(origin));
+ batch.Put(CreateKeyForDisabledSyncOrigin(origin), resource_id);
+ leveldb::Status status = db_->Write(leveldb::WriteOptions(), &batch);
+
+ return LevelDBStatusToSyncStatusCode(status);
+}
+
SyncStatusCode DriveMetadataDB::RemoveOrigin(const GURL& origin_to_remove) {
DCHECK(CalledOnValidThread());
leveldb::WriteBatch batch;
- batch.Delete(kDriveBatchSyncOriginKeyPrefix + origin_to_remove.spec());
- batch.Delete(kDriveIncrementalSyncOriginKeyPrefix + origin_to_remove.spec());
+ batch.Delete(CreateKeyForBatchSyncOrigin(origin_to_remove));
+ batch.Delete(CreateKeyForIncrementalSyncOrigin(origin_to_remove));
+ batch.Delete(CreateKeyForDisabledSyncOrigin(origin_to_remove));
scoped_ptr<leveldb::Iterator> itr(db_->NewIterator(leveldb::ReadOptions()));
std::string metadata_key = kDriveMetadataKeyPrefix + origin_to_remove.spec();
@@ -853,7 +990,8 @@ SyncStatusCode DriveMetadataDB::RemoveOrigin(const GURL& origin_to_remove) {
SyncStatusCode DriveMetadataDB::GetSyncOrigins(
ResourceIDMap* batch_sync_origins,
- ResourceIDMap* incremental_sync_origins) {
+ ResourceIDMap* incremental_sync_origins,
+ ResourceIDMap* disabled_sync_origins) {
DCHECK(CalledOnValidThread());
DCHECK(db_.get());
@@ -889,6 +1027,21 @@ SyncStatusCode DriveMetadataDB::GetSyncOrigins(
DCHECK(result);
}
+ // Get disabled sync origins from the DB.
+ for (itr->Seek(kDriveDisabledSyncOriginKeyPrefix);
+ itr->Valid(); itr->Next()) {
+ std::string key = itr->key().ToString();
+ if (!StartsWithASCII(key, kDriveDisabledSyncOriginKeyPrefix, true))
+ break;
+ GURL origin(std::string(
+ key.begin() + arraysize(kDriveDisabledSyncOriginKeyPrefix) - 1,
+ key.end()));
+ DCHECK(origin.is_valid());
+ bool result = disabled_sync_origins->insert(
+ std::make_pair(origin, itr->value().ToString())).second;
+ DCHECK(result);
+ }
+
return SYNC_STATUS_OK;
}

Powered by Google App Engine
This is Rietveld 408576698