Chromium Code Reviews| Index: chrome/browser/sync/engine/get_commit_ids_command.cc |
| diff --git a/chrome/browser/sync/engine/get_commit_ids_command.cc b/chrome/browser/sync/engine/get_commit_ids_command.cc |
| index 720c063f23d13663a8e7cc5f34ec3340dbbb7203..9363e79494be761c99c922f1015d231552a4ef55 100644 |
| --- a/chrome/browser/sync/engine/get_commit_ids_command.cc |
| +++ b/chrome/browser/sync/engine/get_commit_ids_command.cc |
| @@ -76,11 +76,8 @@ namespace { |
| // 2. Its type is not currently throttled. |
| bool IsEntryReadyForCommit(syncable::ModelTypeSet encrypted_types, |
| bool passphrase_missing, |
| - const syncable::Entry& entry, |
| - syncable::ModelTypeSet throttled_types) { |
| - if (!entry.Get(syncable::IS_UNSYNCED)) |
| - return false; |
| - |
| + syncable::ModelTypeSet throttled_types, |
| + const syncable::Entry& entry) { |
| if (entry.Get(syncable::SERVER_VERSION) > 0 && |
| (entry.Get(syncable::SERVER_VERSION) > |
| entry.Get(syncable::BASE_VERSION))) { |
| @@ -128,11 +125,13 @@ void GetCommitIdsCommand::FilterUnreadyEntries( |
| iter != unsynced_handles->end(); |
| ++iter) { |
| syncable::Entry entry(trans, syncable::GET_BY_HANDLE, *iter); |
| - if (IsEntryReadyForCommit(encrypted_types_, |
| + if (entry.Get(syncable::IS_UNSYNCED) && |
| + IsEntryReadyForCommit(encrypted_types_, |
| passphrase_missing_, |
| - entry, |
| - throttled_types)) |
| + throttled_types, |
| + entry)) { |
| new_unsynced_handles.push_back(*iter); |
| + } |
| } |
| if (new_unsynced_handles.size() != unsynced_handles->size()) |
| unsynced_handles->swap(new_unsynced_handles); |
| @@ -155,9 +154,13 @@ void GetCommitIdsCommand::AddUncommittedParentsAndTheirPredecessors( |
| break; |
| } |
| if (!AddItemThenPredecessors(trans, throttled_types, &parent, |
| - syncable::IS_UNSYNCED, |
| &item_dependencies)) { |
| - break; // Parent was already present in the set. |
| + // Either the parent/it's predecessor's are not ready for commit, in which |
|
akalin
2011/12/14 03:39:52
it's -> its
predecessor's -> predecessors
|
| + // case item_dependencies has been cleared and we should return, or the |
| + // parent has already been added to the commit set, in which case it's |
| + // predecessors and parent's must already be in there too. Either way, |
| + // no more work to do in this loop. |
| + return; |
| } |
| parent_id = parent.Get(syncable::PARENT_ID); |
| } |
| @@ -169,9 +172,14 @@ void GetCommitIdsCommand::AddUncommittedParentsAndTheirPredecessors( |
| bool GetCommitIdsCommand::AddItem(syncable::Entry* item, |
| syncable::ModelTypeSet throttled_types, |
| OrderedCommitSet* result) { |
| - if (!IsEntryReadyForCommit(encrypted_types_, passphrase_missing_, *item, |
| - throttled_types)) |
| + DCHECK(item->Get(syncable::IS_UNSYNCED)); |
| + if (!IsEntryReadyForCommit(encrypted_types_, passphrase_missing_, |
| + throttled_types, *item)) { |
| + // If the item is not ready for commit, then all items that depend on this |
| + // one are also not ready for commit. Clear the OrderedCommitSet and return. |
| + result->Clear(); |
| return false; |
| + } |
| int64 item_handle = item->Get(syncable::META_HANDLE); |
| if (result->HaveCommitItem(item_handle) || |
| ordered_commit_set_->HaveCommitItem(item_handle)) { |
| @@ -186,7 +194,6 @@ bool GetCommitIdsCommand::AddItemThenPredecessors( |
| syncable::BaseTransaction* trans, |
| syncable::ModelTypeSet throttled_types, |
| syncable::Entry* item, |
| - syncable::IndexedBitField inclusion_filter, |
| OrderedCommitSet* result) { |
| if (!AddItem(item, throttled_types, result)) |
| return false; |
| @@ -197,10 +204,10 @@ bool GetCommitIdsCommand::AddItemThenPredecessors( |
| while (!prev_id.IsRoot()) { |
| syncable::Entry prev(trans, syncable::GET_BY_ID, prev_id); |
| CHECK(prev.good()) << "Bad id when walking predecessors."; |
| - if (!prev.Get(inclusion_filter)) |
| + if (!prev.Get(syncable::IS_UNSYNCED)) |
| break; |
| if (!AddItem(&prev, throttled_types, result)) |
| - break; |
| + return false; |
| prev_id = prev.Get(syncable::PREV_ID); |
| } |
| return true; |
| @@ -210,11 +217,14 @@ void GetCommitIdsCommand::AddPredecessorsThenItem( |
| syncable::BaseTransaction* trans, |
| syncable::ModelTypeSet throttled_types, |
| syncable::Entry* item, |
| - syncable::IndexedBitField inclusion_filter, |
| const ModelSafeRoutingInfo& routes) { |
| OrderedCommitSet item_dependencies(routes); |
| - AddItemThenPredecessors(trans, throttled_types, item, inclusion_filter, |
| - &item_dependencies); |
| + if (!AddItemThenPredecessors(trans, throttled_types, item, |
| + &item_dependencies)) { |
| + // Either the item or it's predecessors are not ready for commit, so don't |
| + // add any items to the commit set. |
| + return; |
| + } |
| // Reverse what we added to get the correct order. |
| ordered_commit_set_->AppendReverse(item_dependencies); |
| @@ -243,7 +253,7 @@ void GetCommitIdsCommand::AddCreatesAndMoves( |
| AddUncommittedParentsAndTheirPredecessors(write_transaction, |
| entry.Get(syncable::PARENT_ID), routes, throttled_types); |
| AddPredecessorsThenItem(write_transaction, throttled_types, &entry, |
| - syncable::IS_UNSYNCED, routes); |
| + routes); |
| } |
| } |