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

Side by Side Diff: chrome/browser/sync/glue/generic_change_processor.cc

Issue 15701022: [Sync] Add support for sync Persistence Errors (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Move bookmark change into separate patch Created 7 years, 5 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/sync/glue/generic_change_processor.h" 5 #include "chrome/browser/sync/glue/generic_change_processor.h"
6 6
7 #include "base/location.h" 7 #include "base/location.h"
8 #include "base/strings/string_number_conversions.h" 8 #include "base/strings/string_number_conversions.h"
9 #include "base/strings/utf_string_conversions.h" 9 #include "base/strings/utf_string_conversions.h"
10 #include "content/public/browser/browser_thread.h" 10 #include "content/public/browser/browser_thread.h"
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
76 } 76 }
77 } 77 }
78 } 78 }
79 79
80 void GenericChangeProcessor::CommitChangesFromSyncModel() { 80 void GenericChangeProcessor::CommitChangesFromSyncModel() {
81 DCHECK(CalledOnValidThread()); 81 DCHECK(CalledOnValidThread());
82 if (syncer_changes_.empty()) 82 if (syncer_changes_.empty())
83 return; 83 return;
84 if (!local_service_.get()) { 84 if (!local_service_.get()) {
85 syncer::ModelType type = syncer_changes_[0].sync_data().GetDataType(); 85 syncer::ModelType type = syncer_changes_[0].sync_data().GetDataType();
86 syncer::SyncError error(FROM_HERE, "Local service destroyed.", type); 86 syncer::SyncError error(FROM_HERE,
87 syncer::SyncError::DATATYPE_ERROR,
88 "Local service destroyed.",
89 type);
87 error_handler()->OnSingleDatatypeUnrecoverableError(error.location(), 90 error_handler()->OnSingleDatatypeUnrecoverableError(error.location(),
88 error.message()); 91 error.message());
89 return; 92 return;
90 } 93 }
91 syncer::SyncError error = local_service_->ProcessSyncChanges(FROM_HERE, 94 syncer::SyncError error = local_service_->ProcessSyncChanges(FROM_HERE,
92 syncer_changes_); 95 syncer_changes_);
93 syncer_changes_.clear(); 96 syncer_changes_.clear();
94 if (error.IsSet()) { 97 if (error.IsSet()) {
95 error_handler()->OnSingleDatatypeUnrecoverableError( 98 error_handler()->OnSingleDatatypeUnrecoverableError(
96 error.location(), error.message()); 99 error.location(), error.message());
97 } 100 }
98 } 101 }
99 102
100 syncer::SyncError GenericChangeProcessor::GetSyncDataForType( 103 syncer::SyncError GenericChangeProcessor::GetSyncDataForType(
101 syncer::ModelType type, 104 syncer::ModelType type,
102 syncer::SyncDataList* current_sync_data) { 105 syncer::SyncDataList* current_sync_data) {
103 DCHECK(CalledOnValidThread()); 106 DCHECK(CalledOnValidThread());
104 std::string type_name = syncer::ModelTypeToString(type); 107 std::string type_name = syncer::ModelTypeToString(type);
105 syncer::ReadTransaction trans(FROM_HERE, share_handle()); 108 syncer::ReadTransaction trans(FROM_HERE, share_handle());
106 syncer::ReadNode root(&trans); 109 syncer::ReadNode root(&trans);
107 if (root.InitByTagLookup(syncer::ModelTypeToRootTag(type)) != 110 if (root.InitByTagLookup(syncer::ModelTypeToRootTag(type)) !=
108 syncer::BaseNode::INIT_OK) { 111 syncer::BaseNode::INIT_OK) {
109 syncer::SyncError error(FROM_HERE, 112 syncer::SyncError error(FROM_HERE,
110 "Server did not create the top-level " + type_name + 113 syncer::SyncError::DATATYPE_ERROR,
111 " node. We might be running against an out-of-date server.", 114 "Server did not create the top-level " + type_name +
112 type); 115 " node. We might be running against an out-of-"
116 "date server.",
117 type);
113 return error; 118 return error;
114 } 119 }
115 120
116 // TODO(akalin): We'll have to do a tree traversal for bookmarks. 121 // TODO(akalin): We'll have to do a tree traversal for bookmarks.
117 DCHECK_NE(type, syncer::BOOKMARKS); 122 DCHECK_NE(type, syncer::BOOKMARKS);
118 123
119 std::vector<int64> child_ids; 124 std::vector<int64> child_ids;
120 root.GetChildIds(&child_ids); 125 root.GetChildIds(&child_ids);
121 126
122 for (std::vector<int64>::iterator it = child_ids.begin(); 127 for (std::vector<int64>::iterator it = child_ids.begin();
123 it != child_ids.end(); ++it) { 128 it != child_ids.end(); ++it) {
124 syncer::ReadNode sync_child_node(&trans); 129 syncer::ReadNode sync_child_node(&trans);
125 if (sync_child_node.InitByIdLookup(*it) != 130 if (sync_child_node.InitByIdLookup(*it) !=
126 syncer::BaseNode::INIT_OK) { 131 syncer::BaseNode::INIT_OK) {
127 syncer::SyncError error(FROM_HERE, 132 syncer::SyncError error(FROM_HERE,
128 "Failed to fetch child node for type " + type_name + ".", 133 syncer::SyncError::DATATYPE_ERROR,
129 type); 134 "Failed to fetch child node for type " +
135 type_name + ".",
136 type);
130 return error; 137 return error;
131 } 138 }
132 current_sync_data->push_back(syncer::SyncData::CreateRemoteData( 139 current_sync_data->push_back(syncer::SyncData::CreateRemoteData(
133 sync_child_node.GetId(), sync_child_node.GetEntitySpecifics())); 140 sync_child_node.GetId(), sync_child_node.GetEntitySpecifics()));
134 } 141 }
135 return syncer::SyncError(); 142 return syncer::SyncError();
136 } 143 }
137 144
138 int GenericChangeProcessor::GetSyncCountForType(syncer::ModelType type) { 145 int GenericChangeProcessor::GetSyncCountForType(syncer::ModelType type) {
139 syncer::ReadTransaction trans(FROM_HERE, share_handle()); 146 syncer::ReadTransaction trans(FROM_HERE, share_handle());
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
214 syncer::ModelType type, 221 syncer::ModelType type,
215 const std::string& type_str, 222 const std::string& type_str,
216 syncer::WriteNode* node, 223 syncer::WriteNode* node,
217 DataTypeErrorHandler* error_handler) { 224 DataTypeErrorHandler* error_handler) {
218 DCHECK_EQ(change.change_type(), syncer::SyncChange::ACTION_DELETE); 225 DCHECK_EQ(change.change_type(), syncer::SyncChange::ACTION_DELETE);
219 if (change.sync_data().IsLocal()) { 226 if (change.sync_data().IsLocal()) {
220 const std::string& tag = change.sync_data().GetTag(); 227 const std::string& tag = change.sync_data().GetTag();
221 if (tag.empty()) { 228 if (tag.empty()) {
222 syncer::SyncError error( 229 syncer::SyncError error(
223 FROM_HERE, 230 FROM_HERE,
231 syncer::SyncError::DATATYPE_ERROR,
224 "Failed to delete " + type_str + " node. Local data, empty tag. " + 232 "Failed to delete " + type_str + " node. Local data, empty tag. " +
225 change.location().ToString(), 233 change.location().ToString(),
226 type); 234 type);
227 error_handler->OnSingleDatatypeUnrecoverableError(error.location(), 235 error_handler->OnSingleDatatypeUnrecoverableError(error.location(),
228 error.message()); 236 error.message());
229 NOTREACHED(); 237 NOTREACHED();
230 return error; 238 return error;
231 } 239 }
232 240
233 syncer::BaseNode::InitByLookupResult result = 241 syncer::BaseNode::InitByLookupResult result =
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
290 merge_result_->num_items_deleted() + 1); 298 merge_result_->num_items_deleted() + 1);
291 } 299 }
292 } else if (change.change_type() == syncer::SyncChange::ACTION_ADD) { 300 } else if (change.change_type() == syncer::SyncChange::ACTION_ADD) {
293 // TODO(sync): Handle other types of creation (custom parents, folders, 301 // TODO(sync): Handle other types of creation (custom parents, folders,
294 // etc.). 302 // etc.).
295 syncer::ReadNode root_node(&trans); 303 syncer::ReadNode root_node(&trans);
296 if (root_node.InitByTagLookup( 304 if (root_node.InitByTagLookup(
297 syncer::ModelTypeToRootTag(change.sync_data().GetDataType())) != 305 syncer::ModelTypeToRootTag(change.sync_data().GetDataType())) !=
298 syncer::BaseNode::INIT_OK) { 306 syncer::BaseNode::INIT_OK) {
299 syncer::SyncError error(FROM_HERE, 307 syncer::SyncError error(FROM_HERE,
300 "Failed to look up root node for type " + type_str, 308 syncer::SyncError::DATATYPE_ERROR,
301 type); 309 "Failed to look up root node for type " +
310 type_str,
311 type);
302 error_handler()->OnSingleDatatypeUnrecoverableError(FROM_HERE, 312 error_handler()->OnSingleDatatypeUnrecoverableError(FROM_HERE,
303 error.message()); 313 error.message());
304 NOTREACHED(); 314 NOTREACHED();
305 LOG(ERROR) << "Create: no root node."; 315 LOG(ERROR) << "Create: no root node.";
306 return error; 316 return error;
307 } 317 }
308 syncer::WriteNode::InitUniqueByCreationResult result = 318 syncer::WriteNode::InitUniqueByCreationResult result =
309 sync_node.InitUniqueByCreation(change.sync_data().GetDataType(), 319 sync_node.InitUniqueByCreation(change.sync_data().GetDataType(),
310 root_node, 320 root_node,
311 change.sync_data().GetTag()); 321 change.sync_data().GetTag());
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after
454 sync_node.SetEntitySpecifics(change.sync_data().GetSpecifics()); 464 sync_node.SetEntitySpecifics(change.sync_data().GetSpecifics());
455 if (merge_result_.get()) { 465 if (merge_result_.get()) {
456 merge_result_->set_num_items_modified( 466 merge_result_->set_num_items_modified(
457 merge_result_->num_items_modified() + 1); 467 merge_result_->num_items_modified() + 1);
458 } 468 }
459 // TODO(sync): Support updating other parts of the sync node (title, 469 // TODO(sync): Support updating other parts of the sync node (title,
460 // successor, parent, etc.). 470 // successor, parent, etc.).
461 } else { 471 } else {
462 syncer::SyncError error( 472 syncer::SyncError error(
463 FROM_HERE, 473 FROM_HERE,
474 syncer::SyncError::DATATYPE_ERROR,
464 "Received unset SyncChange in the change processor, " + 475 "Received unset SyncChange in the change processor, " +
465 change.location().ToString(), 476 change.location().ToString(),
466 type); 477 type);
467 error_handler()->OnSingleDatatypeUnrecoverableError(FROM_HERE, 478 error_handler()->OnSingleDatatypeUnrecoverableError(FROM_HERE,
468 error.message()); 479 error.message());
469 NOTREACHED(); 480 NOTREACHED();
470 LOG(ERROR) << "Unset sync change."; 481 LOG(ERROR) << "Unset sync change.";
471 return error; 482 return error;
472 } 483 }
473 } 484 }
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
511 void GenericChangeProcessor::StartImpl(Profile* profile) { 522 void GenericChangeProcessor::StartImpl(Profile* profile) {
512 DCHECK(CalledOnValidThread()); 523 DCHECK(CalledOnValidThread());
513 } 524 }
514 525
515 syncer::UserShare* GenericChangeProcessor::share_handle() const { 526 syncer::UserShare* GenericChangeProcessor::share_handle() const {
516 DCHECK(CalledOnValidThread()); 527 DCHECK(CalledOnValidThread());
517 return share_handle_; 528 return share_handle_;
518 } 529 }
519 530
520 } // namespace browser_sync 531 } // namespace browser_sync
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698