| Index: chrome/browser/sync/syncable/syncable.cc
|
| ===================================================================
|
| --- chrome/browser/sync/syncable/syncable.cc (revision 112758)
|
| +++ chrome/browser/sync/syncable/syncable.cc (working copy)
|
| @@ -258,20 +258,6 @@
|
|
|
| EntryKernel::~EntryKernel() {}
|
|
|
| -syncable::ModelType EntryKernel::GetServerModelType() const {
|
| - ModelType specifics_type = GetModelTypeFromSpecifics(ref(SERVER_SPECIFICS));
|
| - if (specifics_type != UNSPECIFIED)
|
| - return specifics_type;
|
| - if (ref(ID).IsRoot())
|
| - return TOP_LEVEL_FOLDER;
|
| - // Loose check for server-created top-level folders that aren't
|
| - // bound to a particular model type.
|
| - if (!ref(UNIQUE_SERVER_TAG).empty() && ref(SERVER_IS_DIR))
|
| - return TOP_LEVEL_FOLDER;
|
| -
|
| - return UNSPECIFIED;
|
| -}
|
| -
|
| bool EntryKernel::ContainsString(const std::string& lowercase_query) const {
|
| // TODO(lipalani) - figure out what to do if the node is encrypted.
|
| const sync_pb::EntitySpecifics& specifics = ref(SPECIFICS);
|
| @@ -342,7 +328,6 @@
|
| DictionaryValue* EntryKernel::ToValue() const {
|
| DictionaryValue* kernel_info = new DictionaryValue();
|
| kernel_info->SetBoolean("isDirty", is_dirty());
|
| - kernel_info->Set("serverModelType", ModelTypeToValue(GetServerModelType()));
|
|
|
| // Int64 fields.
|
| SetFieldValues(*this, kernel_info,
|
| @@ -448,6 +433,7 @@
|
| ids_index(new Directory::IdsIndex),
|
| parent_id_child_index(new Directory::ParentIdChildIndex),
|
| client_tag_index(new Directory::ClientTagIndex),
|
| + unapplied_update_metahandles(new MetahandleSet),
|
| unsynced_metahandles(new MetahandleSet),
|
| dirty_metahandles(new MetahandleSet),
|
| metahandles_to_purge(new MetahandleSet),
|
| @@ -473,6 +459,7 @@
|
| Directory::Kernel::~Kernel() {
|
| CHECK_EQ(0, refcount);
|
| delete unsynced_metahandles;
|
| + delete unapplied_update_metahandles;
|
| delete dirty_metahandles;
|
| delete metahandles_to_purge;
|
| delete parent_id_child_index;
|
| @@ -509,13 +496,10 @@
|
| kernel_->parent_id_child_index);
|
| InitializeIndexEntry<IdIndexer>(entry, kernel_->ids_index);
|
| InitializeIndexEntry<ClientTagIndexer>(entry, kernel_->client_tag_index);
|
| - const int64 metahandle = entry->ref(META_HANDLE);
|
| if (entry->ref(IS_UNSYNCED))
|
| - kernel_->unsynced_metahandles->insert(metahandle);
|
| - if (entry->ref(IS_UNAPPLIED_UPDATE)) {
|
| - const ModelType type = entry->GetServerModelType();
|
| - kernel_->unapplied_update_metahandles[type].insert(metahandle);
|
| - }
|
| + kernel_->unsynced_metahandles->insert(entry->ref(META_HANDLE));
|
| + if (entry->ref(IS_UNAPPLIED_UPDATE))
|
| + kernel_->unapplied_update_metahandles->insert(entry->ref(META_HANDLE));
|
| DCHECK(!entry->is_dirty());
|
| }
|
| }
|
| @@ -718,12 +702,11 @@
|
| !entry->ref(IS_UNSYNCED);
|
|
|
| if (safe) {
|
| - const int64 handle = entry->ref(META_HANDLE);
|
| - const ModelType type = entry->GetServerModelType();
|
| + int64 handle = entry->ref(META_HANDLE);
|
| CHECK_EQ(kernel_->dirty_metahandles->count(handle), 0U);
|
| // TODO(tim): Bug 49278.
|
| CHECK(!kernel_->unsynced_metahandles->count(handle));
|
| - CHECK(!kernel_->unapplied_update_metahandles[type].count(handle));
|
| + CHECK(!kernel_->unapplied_update_metahandles->count(handle));
|
| }
|
|
|
| return safe;
|
| @@ -854,8 +837,7 @@
|
| DCHECK_EQ(entry->ref(UNIQUE_CLIENT_TAG).empty(), !num_erased);
|
| num_erased = kernel_->unsynced_metahandles->erase(handle);
|
| DCHECK_EQ(entry->ref(IS_UNSYNCED), num_erased > 0);
|
| - num_erased =
|
| - kernel_->unapplied_update_metahandles[server_type].erase(handle);
|
| + num_erased = kernel_->unapplied_update_metahandles->erase(handle);
|
| DCHECK_EQ(entry->ref(IS_UNAPPLIED_UPDATE), num_erased > 0);
|
| num_erased = kernel_->parent_id_child_index->erase(entry);
|
| DCHECK_EQ(entry->ref(IS_DEL), !num_erased);
|
| @@ -1025,33 +1007,13 @@
|
| return kernel_->unsynced_metahandles->size();
|
| }
|
|
|
| -syncable::ModelTypeBitSet
|
| - Directory::GetServerTypesWithUnappliedUpdates(
|
| - BaseTransaction* trans) const {
|
| - syncable::ModelTypeBitSet server_types;
|
| - ScopedKernelLock lock(this);
|
| - for (int i = 0; i < MODEL_TYPE_COUNT; ++i) {
|
| - if (!kernel_->unapplied_update_metahandles[i].empty()) {
|
| - server_types.set(i);
|
| - }
|
| - }
|
| - return server_types;
|
| -}
|
| -
|
| -void Directory::GetUnappliedUpdateMetaHandles(
|
| - BaseTransaction* trans,
|
| - syncable::ModelTypeBitSet server_types,
|
| +void Directory::GetUnappliedUpdateMetaHandles(BaseTransaction* trans,
|
| UnappliedUpdateMetaHandles* result) {
|
| result->clear();
|
| ScopedKernelLock lock(this);
|
| - for (int i = 0; i < MODEL_TYPE_COUNT; ++i) {
|
| - const ModelType type = ModelTypeFromInt(i);
|
| - if (server_types.test(type)) {
|
| - std::copy(kernel_->unapplied_update_metahandles[type].begin(),
|
| - kernel_->unapplied_update_metahandles[type].end(),
|
| - back_inserter(*result));
|
| - }
|
| - }
|
| + copy(kernel_->unapplied_update_metahandles->begin(),
|
| + kernel_->unapplied_update_metahandles->end(),
|
| + back_inserter(*result));
|
| }
|
|
|
|
|
| @@ -1408,6 +1370,8 @@
|
| entry_info->SetBoolean("good", good());
|
| if (good()) {
|
| entry_info->Set("kernel", kernel_->ToValue());
|
| + entry_info->Set("serverModelType",
|
| + ModelTypeToValue(GetServerModelTypeHelper()));
|
| entry_info->Set("modelType",
|
| ModelTypeToValue(GetModelType()));
|
| entry_info->SetBoolean("existsOnClientBecauseNameIsNonEmpty",
|
| @@ -1423,7 +1387,7 @@
|
| }
|
|
|
| syncable::ModelType Entry::GetServerModelType() const {
|
| - ModelType specifics_type = kernel_->GetServerModelType();
|
| + ModelType specifics_type = GetServerModelTypeHelper();
|
| if (specifics_type != UNSPECIFIED)
|
| return specifics_type;
|
|
|
| @@ -1439,6 +1403,20 @@
|
| return UNSPECIFIED;
|
| }
|
|
|
| +syncable::ModelType Entry::GetServerModelTypeHelper() const {
|
| + ModelType specifics_type = GetModelTypeFromSpecifics(Get(SERVER_SPECIFICS));
|
| + if (specifics_type != UNSPECIFIED)
|
| + return specifics_type;
|
| + if (IsRoot())
|
| + return TOP_LEVEL_FOLDER;
|
| + // Loose check for server-created top-level folders that aren't
|
| + // bound to a particular model type.
|
| + if (!Get(UNIQUE_SERVER_TAG).empty() && Get(SERVER_IS_DIR))
|
| + return TOP_LEVEL_FOLDER;
|
| +
|
| + return UNSPECIFIED;
|
| +}
|
| +
|
| syncable::ModelType Entry::GetModelType() const {
|
| ModelType specifics_type = GetModelTypeFromSpecifics(Get(SPECIFICS));
|
| if (specifics_type != UNSPECIFIED)
|
| @@ -1625,32 +1603,8 @@
|
| // TODO(ncarter): This is unfortunately heavyweight. Can we do
|
| // better?
|
| if (kernel_->ref(field).SerializeAsString() != value.SerializeAsString()) {
|
| - const bool update_unapplied_updates_index =
|
| - (field == SERVER_SPECIFICS) && kernel_->ref(IS_UNAPPLIED_UPDATE);
|
| - if (update_unapplied_updates_index) {
|
| - // Remove ourselves from unapplied_update_metahandles with our
|
| - // old server type.
|
| - const syncable::ModelType old_server_type =
|
| - kernel_->GetServerModelType();
|
| - const int64 metahandle = kernel_->ref(META_HANDLE);
|
| - size_t erase_count =
|
| - dir()->kernel_->unapplied_update_metahandles[old_server_type]
|
| - .erase(metahandle);
|
| - DCHECK_EQ(erase_count, 1u);
|
| - }
|
| -
|
| kernel_->put(field, value);
|
| kernel_->mark_dirty(dir()->kernel_->dirty_metahandles);
|
| -
|
| - if (update_unapplied_updates_index) {
|
| - // Add ourselves back into unapplied_update_metahandles with our
|
| - // new server type.
|
| - const syncable::ModelType new_server_type =
|
| - kernel_->GetServerModelType();
|
| - const int64 metahandle = kernel_->ref(META_HANDLE);
|
| - dir()->kernel_->unapplied_update_metahandles[new_server_type]
|
| - .insert(metahandle);
|
| - }
|
| }
|
| return true;
|
| }
|
| @@ -1713,16 +1667,10 @@
|
| DCHECK(kernel_);
|
| if (kernel_->ref(field) != value) {
|
| MetahandleSet* index;
|
| - if (IS_UNSYNCED == field) {
|
| + if (IS_UNSYNCED == field)
|
| index = dir()->kernel_->unsynced_metahandles;
|
| - } else {
|
| - // Use kernel_->GetServerModelType() instead of
|
| - // GetServerModelType() as we may trigger some DCHECKs in the
|
| - // latter.
|
| - index =
|
| - &dir()->kernel_->unapplied_update_metahandles[
|
| - kernel_->GetServerModelType()];
|
| - }
|
| + else
|
| + index = dir()->kernel_->unapplied_update_metahandles;
|
|
|
| ScopedKernelLock lock(dir());
|
| if (value)
|
|
|