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

Unified Diff: sync/engine/process_updates_util.cc

Issue 38803003: sync: Implement per-type update processing (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix integration tests Created 7 years, 2 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: sync/engine/process_updates_util.cc
diff --git a/sync/engine/process_updates_command.cc b/sync/engine/process_updates_util.cc
similarity index 83%
rename from sync/engine/process_updates_command.cc
rename to sync/engine/process_updates_util.cc
index d69c1098c6efc0116327ea7ad1c0c10b4c52ba65..094e72fc33e96dcaabf4a8a34c73978a92c2eb06 100644
--- a/sync/engine/process_updates_command.cc
+++ b/sync/engine/process_updates_util.cc
@@ -2,16 +2,11 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-#include "sync/engine/process_updates_command.h"
+#include "sync/engine/process_updates_util.h"
-#include <vector>
-
-#include "base/basictypes.h"
#include "base/location.h"
-#include "sync/engine/syncer.h"
#include "sync/engine/syncer_proto_util.h"
#include "sync/engine/syncer_util.h"
-#include "sync/sessions/sync_session.h"
#include "sync/syncable/directory.h"
#include "sync/syncable/model_neutral_mutable_entry.h"
#include "sync/syncable/syncable_model_neutral_write_transaction.h"
@@ -19,18 +14,12 @@
#include "sync/syncable/syncable_util.h"
#include "sync/util/cryptographer.h"
-using std::vector;
-
namespace syncer {
-using sessions::SyncSession;
using sessions::StatusController;
using syncable::GET_BY_ID;
-ProcessUpdatesCommand::ProcessUpdatesCommand() {}
-ProcessUpdatesCommand::~ProcessUpdatesCommand() {}
-
namespace {
// This function attempts to determine whether or not this update is genuinely
@@ -87,57 +76,51 @@ bool UpdateContainsNewVersion(syncable::BaseTransaction *trans,
} // namespace
-SyncerError ProcessUpdatesCommand::ExecuteImpl(SyncSession* session) {
- syncable::Directory* dir = session->context()->directory();
-
- syncable::ModelNeutralWriteTransaction trans(
- FROM_HERE, syncable::SYNCER, dir);
-
- sessions::StatusController* status = session->mutable_status_controller();
- const sync_pb::GetUpdatesResponse& updates =
- status->updates_response().get_updates();
- ModelTypeSet requested_types = GetRoutingInfoTypes(
- session->context()->routing_info());
-
- TypeSyncEntityMap updates_by_type;
-
- PartitionUpdatesByType(updates, &updates_by_type);
-
- int update_count = updates.entries().size();
- status->increment_num_updates_downloaded_by(update_count);
-
- DVLOG(1) << update_count << " entries to verify";
- for (TypeSyncEntityMap::iterator it = updates_by_type.begin();
- it != updates_by_type.end(); ++it) {
- for (SyncEntityList::iterator update_it = it->second.begin();
- update_it != it->second.end(); ++update_it) {
- if (!UpdateContainsNewVersion(&trans, **update_it))
- status->increment_num_reflected_updates_downloaded_by(1);
- if ((*update_it)->deleted())
- status->increment_num_tombstone_updates_downloaded_by(1);
- VerifyResult verify_result = VerifyUpdate(
- &trans,
- **update_it,
- requested_types,
- session->context()->routing_info());
- if (verify_result != VERIFY_SUCCESS && verify_result != VERIFY_UNDELETE)
- continue;
- ProcessUpdate(**update_it, dir->GetCryptographer(&trans), &trans);
- }
- }
-
- return SYNCER_OK;
-}
-
-void ProcessUpdatesCommand::PartitionUpdatesByType(
+void PartitionUpdatesByType(
const sync_pb::GetUpdatesResponse& updates,
+ ModelTypeSet requested_types,
TypeSyncEntityMap* updates_by_type) {
int update_count = updates.entries().size();
+ for (ModelTypeSet::Iterator it = requested_types.First();
+ it.Good(); it.Inc()) {
+ updates_by_type->insert(std::make_pair(it.Get(), SyncEntityList()));
+ }
for (int i = 0; i < update_count; ++i) {
const sync_pb::SyncEntity& update = updates.entries(i);
ModelType type = GetModelType(update);
- DCHECK(IsRealDataType(type));
- (*updates_by_type)[type].push_back(&update);
+ if (!IsRealDataType(type)) {
+ NOTREACHED() << "Received update with invalid type.";
+ continue;
+ }
+
+ TypeSyncEntityMap::iterator it = updates_by_type->find(type);
+ if (it == updates_by_type->end()) {
+ DLOG(WARNING) << "Skipping update for unexpected type "
+ << ModelTypeToString(type);
Nicolas Zea 2013/10/25 21:04:41 nit: align <<
rlarocque 2013/10/25 22:29:47 Done.
+ continue;
+ }
+
+ it->second.push_back(&update);
Nicolas Zea 2013/10/25 21:04:41 Same comment applies here. I think you can get the
rlarocque 2013/10/25 22:29:47 The trade off here is not so clear. We'd need to
+ }
+}
+
+void ProcessDownloadedUpdates(
+ syncable::Directory* dir,
+ syncable::ModelNeutralWriteTransaction* trans,
+ ModelType type,
+ const SyncEntityList& applicable_updates,
+ sessions::StatusController* status) {
+ for (SyncEntityList::const_iterator update_it = applicable_updates.begin();
+ update_it != applicable_updates.end(); ++update_it) {
+ DCHECK_EQ(type, GetModelType(**update_it));
+ if (!UpdateContainsNewVersion(trans, **update_it))
+ status->increment_num_reflected_updates_downloaded_by(1);
+ if ((*update_it)->deleted())
+ status->increment_num_tombstone_updates_downloaded_by(1);
+ VerifyResult verify_result = VerifyUpdate(trans, **update_it, type);
+ if (verify_result != VERIFY_SUCCESS && verify_result != VERIFY_UNDELETE)
+ continue;
+ ProcessUpdate(**update_it, dir->GetCryptographer(trans), trans);
}
}
@@ -160,11 +143,10 @@ VerifyResult VerifyTagConsistency(
} // namespace
-VerifyResult ProcessUpdatesCommand::VerifyUpdate(
+VerifyResult VerifyUpdate(
syncable::ModelNeutralWriteTransaction* trans,
const sync_pb::SyncEntity& entry,
- ModelTypeSet requested_types,
- const ModelSafeRoutingInfo& routes) {
+ ModelType requested_type) {
syncable::Id id = SyncableIdFromProto(entry.id_string());
VerifyResult result = VERIFY_FAIL;
@@ -198,8 +180,7 @@ VerifyResult ProcessUpdatesCommand::VerifyUpdate(
if (deleted) {
// For deletes the server could send tombostones for items that
// the client did not request. If so ignore those items.
- if (IsRealDataType(placement_type) &&
- !requested_types.Has(placement_type)) {
+ if (IsRealDataType(placement_type) && requested_type != placement_type) {
result = VERIFY_SKIP;
} else {
result = VERIFY_SUCCESS;
@@ -240,7 +221,7 @@ bool ReverifyEntry(syncable::ModelNeutralWriteTransaction* trans,
} // namespace
// Process a single update. Will avoid touching global state.
-void ProcessUpdatesCommand::ProcessUpdate(
+void ProcessUpdate(
const sync_pb::SyncEntity& update,
const Cryptographer* cryptographer,
syncable::ModelNeutralWriteTransaction* const trans) {

Powered by Google App Engine
This is Rietveld 408576698