| Index: sync/engine/directory_update_handler.cc
|
| diff --git a/sync/engine/directory_update_handler.cc b/sync/engine/directory_update_handler.cc
|
| index 5b2bac854a9b5795501cc096cf926dfd67bf1cde..8adc6dddccd5cb92e7100ffa8926cf6e3d887726 100644
|
| --- a/sync/engine/directory_update_handler.cc
|
| +++ b/sync/engine/directory_update_handler.cc
|
| @@ -10,6 +10,7 @@
|
| #include "sync/sessions/directory_type_debug_info_emitter.h"
|
| #include "sync/syncable/directory.h"
|
| #include "sync/syncable/model_neutral_mutable_entry.h"
|
| +#include "sync/syncable/syncable_changes_version.h"
|
| #include "sync/syncable/syncable_model_neutral_write_transaction.h"
|
| #include "sync/syncable/syncable_write_transaction.h"
|
| #include "sync/util/data_type_histogram.h"
|
| @@ -109,34 +110,34 @@ void DirectoryUpdateHandler::CreateTypeRoot(
|
| }
|
|
|
| void DirectoryUpdateHandler::ApplyUpdates(sessions::StatusController* status) {
|
| - if (!IsApplyUpdatesRequired()) {
|
| - return;
|
| + if (IsApplyUpdatesRequired()) {
|
| + // This will invoke handlers that belong to the model and its thread, so we
|
| + // switch to the appropriate thread before we start this work.
|
| + WorkCallback c =
|
| + base::Bind(&DirectoryUpdateHandler::ApplyUpdatesImpl,
|
| + // We wait until the callback is executed. We can safely use
|
| + // Unretained.
|
| + base::Unretained(this), base::Unretained(status));
|
| + worker_->DoWorkAndWaitUntilDone(c);
|
| +
|
| + debug_info_emitter_->EmitUpdateCountersUpdate();
|
| + debug_info_emitter_->EmitStatusCountersUpdate();
|
| }
|
|
|
| - // This will invoke handlers that belong to the model and its thread, so we
|
| - // switch to the appropriate thread before we start this work.
|
| - WorkCallback c = base::Bind(
|
| - &DirectoryUpdateHandler::ApplyUpdatesImpl,
|
| - // We wait until the callback is executed. We can safely use Unretained.
|
| - base::Unretained(this),
|
| - base::Unretained(status));
|
| - worker_->DoWorkAndWaitUntilDone(c);
|
| -
|
| - debug_info_emitter_->EmitUpdateCountersUpdate();
|
| - debug_info_emitter_->EmitStatusCountersUpdate();
|
| + PostApplyUpdates();
|
| }
|
|
|
| void DirectoryUpdateHandler::PassiveApplyUpdates(
|
| sessions::StatusController* status) {
|
| - if (!IsApplyUpdatesRequired()) {
|
| - return;
|
| - }
|
| + if (IsApplyUpdatesRequired()) {
|
| + // Just do the work here instead of deferring to another thread.
|
| + ApplyUpdatesImpl(status);
|
|
|
| - // Just do the work here instead of deferring to another thread.
|
| - ApplyUpdatesImpl(status);
|
| + debug_info_emitter_->EmitUpdateCountersUpdate();
|
| + debug_info_emitter_->EmitStatusCountersUpdate();
|
| + }
|
|
|
| - debug_info_emitter_->EmitUpdateCountersUpdate();
|
| - debug_info_emitter_->EmitStatusCountersUpdate();
|
| + PostApplyUpdates();
|
| }
|
|
|
| SyncerError DirectoryUpdateHandler::ApplyUpdatesImpl(
|
| @@ -218,6 +219,20 @@ SyncerError DirectoryUpdateHandler::ApplyUpdatesImpl(
|
| return SYNCER_OK;
|
| }
|
|
|
| +void DirectoryUpdateHandler::PostApplyUpdates() {
|
| + // If this is a type with client generated root, the root node has been
|
| + // created locally and didn't go through ApplyUpdatesImpl.
|
| + // Mark it as having the initial download completed so that the type
|
| + // reports as properly initialized (which is done by changing the root's
|
| + // base version to a value other than CHANGES_VERSION).
|
| + // This does nothing if the root's base version is already other than
|
| + // CHANGES_VERSION.
|
| + if (IsTypeWithClientGeneratedRoot(type_)) {
|
| + syncable::ModelNeutralWriteTransaction trans(FROM_HERE, SYNCER, dir_);
|
| + dir_->MarkInitialSyncEndedForType(&trans, type_);
|
| + }
|
| +}
|
| +
|
| bool DirectoryUpdateHandler::IsApplyUpdatesRequired() {
|
| if (IsControlType(type_)) {
|
| return false; // We don't process control types here.
|
|
|