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

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

Issue 9978017: [Sync] - Upload the callstacks for errors so that the line number of error is in callstack. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: For review. Created 8 years, 8 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/session_model_associator.h" 5 #include "chrome/browser/sync/glue/session_model_associator.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <set> 8 #include <set>
9 #include <utility> 9 #include <utility>
10 10
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
75 return internal::IsTabletUi() ? 75 return internal::IsTabletUi() ?
76 sync_pb::SessionHeader_DeviceType_TYPE_TABLET : 76 sync_pb::SessionHeader_DeviceType_TYPE_TABLET :
77 sync_pb::SessionHeader_DeviceType_TYPE_PHONE; 77 sync_pb::SessionHeader_DeviceType_TYPE_PHONE;
78 #else 78 #else
79 return sync_pb::SessionHeader_DeviceType_TYPE_OTHER; 79 return sync_pb::SessionHeader_DeviceType_TYPE_OTHER;
80 #endif 80 #endif
81 } 81 }
82 82
83 } // namespace 83 } // namespace
84 84
85 SessionModelAssociator::SessionModelAssociator(ProfileSyncService* sync_service) 85 SessionModelAssociator::SessionModelAssociator(ProfileSyncService* sync_service,
86 DataTypeErrorHandler* error_handler)
86 : tab_pool_(sync_service), 87 : tab_pool_(sync_service),
87 local_session_syncid_(sync_api::kInvalidId), 88 local_session_syncid_(sync_api::kInvalidId),
88 sync_service_(sync_service), 89 sync_service_(sync_service),
89 stale_session_threshold_days_(kDefaultStaleSessionThresholdDays), 90 stale_session_threshold_days_(kDefaultStaleSessionThresholdDays),
90 setup_for_test_(false), 91 setup_for_test_(false),
91 waiting_for_change_(false), 92 waiting_for_change_(false),
92 ALLOW_THIS_IN_INITIALIZER_LIST(test_weak_factory_(this)), 93 ALLOW_THIS_IN_INITIALIZER_LIST(test_weak_factory_(this)),
93 profile_(sync_service->profile()), 94 profile_(sync_service->profile()),
94 pref_service_(profile_->GetPrefs()) { 95 pref_service_(profile_->GetPrefs()),
96 error_handler_(error_handler) {
95 DCHECK(CalledOnValidThread()); 97 DCHECK(CalledOnValidThread());
96 DCHECK(sync_service_); 98 DCHECK(sync_service_);
97 DCHECK(profile_); 99 DCHECK(profile_);
98 if (pref_service_->FindPreference(kSyncSessionsGUID) == NULL) { 100 if (pref_service_->FindPreference(kSyncSessionsGUID) == NULL) {
99 pref_service_->RegisterStringPref(kSyncSessionsGUID, 101 pref_service_->RegisterStringPref(kSyncSessionsGUID,
100 std::string(), 102 std::string(),
101 PrefService::UNSYNCABLE_PREF); 103 PrefService::UNSYNCABLE_PREF);
102 } 104 }
103 } 105 }
104 106
105 SessionModelAssociator::SessionModelAssociator(ProfileSyncService* sync_service, 107 SessionModelAssociator::SessionModelAssociator(ProfileSyncService* sync_service,
106 bool setup_for_test) 108 bool setup_for_test)
107 : tab_pool_(sync_service), 109 : tab_pool_(sync_service),
108 local_session_syncid_(sync_api::kInvalidId), 110 local_session_syncid_(sync_api::kInvalidId),
109 sync_service_(sync_service), 111 sync_service_(sync_service),
110 stale_session_threshold_days_(kDefaultStaleSessionThresholdDays), 112 stale_session_threshold_days_(kDefaultStaleSessionThresholdDays),
111 setup_for_test_(setup_for_test), 113 setup_for_test_(setup_for_test),
112 waiting_for_change_(false), 114 waiting_for_change_(false),
113 ALLOW_THIS_IN_INITIALIZER_LIST(test_weak_factory_(this)), 115 ALLOW_THIS_IN_INITIALIZER_LIST(test_weak_factory_(this)),
114 profile_(sync_service->profile()), 116 profile_(sync_service->profile()),
115 pref_service_(NULL) { 117 pref_service_(NULL),
118 error_handler_(NULL) {
116 DCHECK(CalledOnValidThread()); 119 DCHECK(CalledOnValidThread());
117 DCHECK(sync_service_); 120 DCHECK(sync_service_);
118 DCHECK(profile_); 121 DCHECK(profile_);
119 DCHECK(setup_for_test); 122 DCHECK(setup_for_test);
120 } 123 }
121 124
122 SessionModelAssociator::~SessionModelAssociator() { 125 SessionModelAssociator::~SessionModelAssociator() {
123 DCHECK(CalledOnValidThread()); 126 DCHECK(CalledOnValidThread());
124 } 127 }
125 128
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after
258 &synced_session_tracker_); 261 &synced_session_tracker_);
259 } 262 }
260 } 263 }
261 } 264 }
262 // Free memory for closed windows and tabs. 265 // Free memory for closed windows and tabs.
263 synced_session_tracker_.CleanupSession(local_tag); 266 synced_session_tracker_.CleanupSession(local_tag);
264 267
265 sync_api::WriteTransaction trans(FROM_HERE, sync_service_->GetUserShare()); 268 sync_api::WriteTransaction trans(FROM_HERE, sync_service_->GetUserShare());
266 sync_api::WriteNode header_node(&trans); 269 sync_api::WriteNode header_node(&trans);
267 if (!header_node.InitByIdLookup(local_session_syncid_)) { 270 if (!header_node.InitByIdLookup(local_session_syncid_)) {
268 error->Reset(FROM_HERE, 271 if (error) {
269 "Failed to load local session header node.", 272 *error = error_handler_->CreateAndUploadError(
270 model_type()); 273 FROM_HERE,
274 "Failed to load local session header node.",
275 model_type());
276 }
271 return false; 277 return false;
272 } 278 }
273 header_node.SetSessionSpecifics(specifics); 279 header_node.SetSessionSpecifics(specifics);
274 if (waiting_for_change_) QuitLoopForSubtleTesting(); 280 if (waiting_for_change_) QuitLoopForSubtleTesting();
275 return true; 281 return true;
276 } 282 }
277 283
278 // Static. 284 // Static.
279 bool SessionModelAssociator::ShouldSyncWindow( 285 bool SessionModelAssociator::ShouldSyncWindow(
280 const SyncedWindowDelegate* window) { 286 const SyncedWindowDelegate* window) {
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
315 } 321 }
316 322
317 if (!ShouldSyncTab(tab)) 323 if (!ShouldSyncTab(tab))
318 return true; 324 return true;
319 325
320 TabLinksMap::const_iterator tablink = tab_map_.find(id); 326 TabLinksMap::const_iterator tablink = tab_map_.find(id);
321 if (tablink == tab_map_.end()) { 327 if (tablink == tab_map_.end()) {
322 // This is a new tab, get a sync node for it. 328 // This is a new tab, get a sync node for it.
323 sync_id = tab_pool_.GetFreeTabNode(); 329 sync_id = tab_pool_.GetFreeTabNode();
324 if (sync_id == sync_api::kInvalidId) { 330 if (sync_id == sync_api::kInvalidId) {
325 error->Reset(FROM_HERE, 331 if (error) {
326 "Received invalid tab node from tab pool. Reassociation " 332 *error = error_handler_->CreateAndUploadError(
327 "needed.", 333 FROM_HERE,
328 model_type()); 334 "Received invalid tab node from tab pool.",
335 model_type());
336 }
329 return false; 337 return false;
330 } 338 }
331 } else { 339 } else {
332 // This tab is already associated with a sync node, reuse it. 340 // This tab is already associated with a sync node, reuse it.
333 sync_id = tablink->second.sync_id(); 341 sync_id = tablink->second.sync_id();
334 } 342 }
335 343
336 DVLOG(1) << "Reloading tab " << id << " from window " << tab.GetWindowId(); 344 DVLOG(1) << "Reloading tab " << id << " from window " << tab.GetWindowId();
337 const SyncedWindowDelegate* window = 345 const SyncedWindowDelegate* window =
338 SyncedWindowDelegate::FindSyncedWindowDelegateWithId( 346 SyncedWindowDelegate::FindSyncedWindowDelegateWithId(
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
391 synced_session_tracker_.GetSession(GetCurrentMachineTag())->modified_time = 399 synced_session_tracker_.GetSession(GetCurrentMachineTag())->modified_time =
392 base::Time::Now(); 400 base::Time::Now();
393 PopulateSessionTabFromSpecifics(*tab_s, 401 PopulateSessionTabFromSpecifics(*tab_s,
394 base::Time::Now(), 402 base::Time::Now(),
395 session_tab); 403 session_tab);
396 404
397 // Write into the actual sync model. 405 // Write into the actual sync model.
398 sync_api::WriteTransaction trans(FROM_HERE, sync_service_->GetUserShare()); 406 sync_api::WriteTransaction trans(FROM_HERE, sync_service_->GetUserShare());
399 sync_api::WriteNode tab_node(&trans); 407 sync_api::WriteNode tab_node(&trans);
400 if (!tab_node.InitByIdLookup(sync_id)) { 408 if (!tab_node.InitByIdLookup(sync_id)) {
401 error->Reset(FROM_HERE, "Failed to look up local tab node", model_type()); 409 if (error) {
410 *error = error_handler_->CreateAndUploadError(
411 FROM_HERE,
412 "Failed to look up local tab node",
413 model_type());
414 }
402 return false; 415 return false;
403 } 416 }
404 tab_node.SetSessionSpecifics(session_s); 417 tab_node.SetSessionSpecifics(session_s);
405 return true; 418 return true;
406 } 419 }
407 420
408 // Static 421 // Static
409 // TODO(zea): perhaps sync state (scroll position, form entries, etc.) as well? 422 // TODO(zea): perhaps sync state (scroll position, form entries, etc.) as well?
410 // See http://crbug.com/67068. 423 // See http://crbug.com/67068.
411 void SessionModelAssociator::PopulateSessionSpecificsNavigation( 424 void SessionModelAssociator::PopulateSessionSpecificsNavigation(
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
486 void SessionModelAssociator::Associate(const SyncedTabDelegate* tab, 499 void SessionModelAssociator::Associate(const SyncedTabDelegate* tab,
487 int64 sync_id) { 500 int64 sync_id) {
488 NOTIMPLEMENTED(); 501 NOTIMPLEMENTED();
489 } 502 }
490 503
491 void SessionModelAssociator::Disassociate(int64 sync_id) { 504 void SessionModelAssociator::Disassociate(int64 sync_id) {
492 DCHECK(CalledOnValidThread()); 505 DCHECK(CalledOnValidThread());
493 NOTIMPLEMENTED(); 506 NOTIMPLEMENTED();
494 } 507 }
495 508
496 bool SessionModelAssociator::AssociateModels(SyncError* error) { 509 SyncError SessionModelAssociator::AssociateModels() {
497 DCHECK(CalledOnValidThread()); 510 DCHECK(CalledOnValidThread());
511 SyncError error;
498 512
499 // Ensure that we disassociated properly, otherwise memory might leak. 513 // Ensure that we disassociated properly, otherwise memory might leak.
500 DCHECK(synced_session_tracker_.Empty()); 514 DCHECK(synced_session_tracker_.Empty());
501 DCHECK_EQ(0U, tab_pool_.capacity()); 515 DCHECK_EQ(0U, tab_pool_.capacity());
502 516
503 local_session_syncid_ = sync_api::kInvalidId; 517 local_session_syncid_ = sync_api::kInvalidId;
504 518
505 // Read any available foreign sessions and load any session data we may have. 519 // Read any available foreign sessions and load any session data we may have.
506 // If we don't have any local session data in the db, create a header node. 520 // If we don't have any local session data in the db, create a header node.
507 { 521 {
508 sync_api::WriteTransaction trans(FROM_HERE, sync_service_->GetUserShare()); 522 sync_api::WriteTransaction trans(FROM_HERE, sync_service_->GetUserShare());
509 523
510 sync_api::ReadNode root(&trans); 524 sync_api::ReadNode root(&trans);
511 if (!root.InitByTagLookup(syncable::ModelTypeToRootTag(model_type()))) { 525 if (!root.InitByTagLookup(syncable::ModelTypeToRootTag(model_type()))) {
512 error->Reset(FROM_HERE, kNoSessionsFolderError, model_type()); 526 return error_handler_->CreateAndUploadError(
513 return false; 527 FROM_HERE,
528 kNoSessionsFolderError,
529 model_type());
514 } 530 }
515 531
516 // Make sure we have a machine tag. 532 // Make sure we have a machine tag.
517 if (current_machine_tag_.empty()) { 533 if (current_machine_tag_.empty()) {
518 InitializeCurrentMachineTag(&trans); 534 InitializeCurrentMachineTag(&trans);
519 // The session name is retrieved asynchronously so it might not come back 535 // The session name is retrieved asynchronously so it might not come back
520 // for the writing of the session. However, we write to the session often 536 // for the writing of the session. However, we write to the session often
521 // enough (on every navigation) that we'll pick it up quickly. 537 // enough (on every navigation) that we'll pick it up quickly.
522 InitializeCurrentSessionName(); 538 InitializeCurrentSessionName();
523 } 539 }
524 synced_session_tracker_.SetLocalSessionTag(current_machine_tag_); 540 synced_session_tracker_.SetLocalSessionTag(current_machine_tag_);
525 if (!UpdateAssociationsFromSyncModel(root, &trans, error)) 541 UpdateAssociationsFromSyncModel(root, &trans, &error);
526 return false; 542 if (error.IsSet())
Nicolas Zea 2012/04/05 22:08:58 if (!UpdateAssociations...) { DCHECK(error.IsSet
lipalani1 2012/04/05 22:51:03 Done.
543 return error;
527 544
528 if (local_session_syncid_ == sync_api::kInvalidId) { 545 if (local_session_syncid_ == sync_api::kInvalidId) {
529 // The sync db didn't have a header node for us, we need to create one. 546 // The sync db didn't have a header node for us, we need to create one.
530 sync_api::WriteNode write_node(&trans); 547 sync_api::WriteNode write_node(&trans);
531 if (!write_node.InitUniqueByCreation(SESSIONS, root, 548 if (!write_node.InitUniqueByCreation(SESSIONS, root,
532 current_machine_tag_)) { 549 current_machine_tag_)) {
533 error->Reset(FROM_HERE, 550 return error_handler_->CreateAndUploadError(
534 "Failed to create sessions header sync node.", 551 FROM_HERE,
535 model_type()); 552 "Failed to create sessions header sync node.",
536 return false; 553 model_type());
537 } 554 }
538 write_node.SetTitle(UTF8ToWide(current_machine_tag_)); 555 write_node.SetTitle(UTF8ToWide(current_machine_tag_));
539 local_session_syncid_ = write_node.GetId(); 556 local_session_syncid_ = write_node.GetId();
540 } 557 }
541 } 558 }
542 559
543 // Check if anything has changed on the client side. 560 // Check if anything has changed on the client side.
544 if (!UpdateSyncModelDataFromClient(error)) 561 UpdateSyncModelDataFromClient(&error);
Nicolas Zea 2012/04/05 22:08:58 same here
lipalani1 2012/04/05 22:51:03 Done.
545 return false; 562 if (error.IsSet())
563 return error;
546 564
547 DVLOG(1) << "Session models associated."; 565 DVLOG(1) << "Session models associated.";
548 return true; 566 return error;
Nicolas Zea 2012/04/05 22:08:58 DCHECK(!error.IsSet()); return SyncError();
lipalani1 2012/04/05 22:51:03 Done.
549 } 567 }
550 568
551 bool SessionModelAssociator::DisassociateModels(SyncError* error) { 569 SyncError SessionModelAssociator::DisassociateModels() {
552 DCHECK(CalledOnValidThread()); 570 DCHECK(CalledOnValidThread());
553 DVLOG(1) << "Disassociating local session " << GetCurrentMachineTag(); 571 DVLOG(1) << "Disassociating local session " << GetCurrentMachineTag();
554 synced_session_tracker_.Clear(); 572 synced_session_tracker_.Clear();
555 tab_map_.clear(); 573 tab_map_.clear();
556 tab_pool_.clear(); 574 tab_pool_.clear();
557 local_session_syncid_ = sync_api::kInvalidId; 575 local_session_syncid_ = sync_api::kInvalidId;
558 current_machine_tag_ = ""; 576 current_machine_tag_ = "";
559 current_session_name_ = ""; 577 current_session_name_ = "";
560 578
561 // There is no local model stored with which to disassociate, just notify 579 // There is no local model stored with which to disassociate, just notify
562 // foreign session handlers. 580 // foreign session handlers.
563 content::NotificationService::current()->Notify( 581 content::NotificationService::current()->Notify(
564 chrome::NOTIFICATION_FOREIGN_SESSION_DISABLED, 582 chrome::NOTIFICATION_FOREIGN_SESSION_DISABLED,
565 content::Source<Profile>(sync_service_->profile()), 583 content::Source<Profile>(sync_service_->profile()),
566 content::NotificationService::NoDetails()); 584 content::NotificationService::NoDetails());
567 return true; 585 return SyncError();
568 } 586 }
569 587
570 void SessionModelAssociator::InitializeCurrentMachineTag( 588 void SessionModelAssociator::InitializeCurrentMachineTag(
571 sync_api::WriteTransaction* trans) { 589 sync_api::WriteTransaction* trans) {
572 DCHECK(CalledOnValidThread()); 590 DCHECK(CalledOnValidThread());
573 DCHECK(current_machine_tag_.empty()); 591 DCHECK(current_machine_tag_.empty());
574 std::string persisted_guid; 592 std::string persisted_guid;
575 if (pref_service_) 593 if (pref_service_)
576 persisted_guid = pref_service_->GetString(kSyncSessionsGUID); 594 persisted_guid = pref_service_->GetString(kSyncSessionsGUID);
577 if (!persisted_guid.empty()) { 595 if (!persisted_guid.empty()) {
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
615 const sync_api::BaseTransaction* trans, 633 const sync_api::BaseTransaction* trans,
616 SyncError* error) { 634 SyncError* error) {
617 DCHECK(CalledOnValidThread()); 635 DCHECK(CalledOnValidThread());
618 DCHECK(tab_pool_.empty()); 636 DCHECK(tab_pool_.empty());
619 637
620 // Iterate through the nodes and associate any foreign sessions. 638 // Iterate through the nodes and associate any foreign sessions.
621 int64 id = root.GetFirstChildId(); 639 int64 id = root.GetFirstChildId();
622 while (id != sync_api::kInvalidId) { 640 while (id != sync_api::kInvalidId) {
623 sync_api::ReadNode sync_node(trans); 641 sync_api::ReadNode sync_node(trans);
624 if (!sync_node.InitByIdLookup(id)) { 642 if (!sync_node.InitByIdLookup(id)) {
625 error->Reset(FROM_HERE, "Failed to load sync node", model_type()); 643 if (error) {
644 *error = error_handler_->CreateAndUploadError(
645 FROM_HERE,
646 "Failed to load sync node",
647 model_type());
648 }
626 return false; 649 return false;
627 } 650 }
628 651
629 const sync_pb::SessionSpecifics& specifics = 652 const sync_pb::SessionSpecifics& specifics =
630 sync_node.GetSessionSpecifics(); 653 sync_node.GetSessionSpecifics();
631 const base::Time& modification_time = sync_node.GetModificationTime(); 654 const base::Time& modification_time = sync_node.GetModificationTime();
632 if (specifics.session_tag() != GetCurrentMachineTag()) { 655 if (specifics.session_tag() != GetCurrentMachineTag()) {
633 AssociateForeignSpecifics(specifics, modification_time); 656 AssociateForeignSpecifics(specifics, modification_time);
634 } else if (id != local_session_syncid_) { 657 } else if (id != local_session_syncid_) {
635 // This is previously stored local session information. 658 // This is previously stored local session information.
(...skipping 271 matching lines...) Expand 10 before | Expand all | Expand 10 after
907 } 930 }
908 } 931 }
909 } 932 }
910 TabNavigation tab_navigation( 933 TabNavigation tab_navigation(
911 index, virtual_url, 934 index, virtual_url,
912 content::Referrer(referrer, WebKit::WebReferrerPolicyDefault), title, 935 content::Referrer(referrer, WebKit::WebReferrerPolicyDefault), title,
913 state, transition); 936 state, transition);
914 navigations->insert(navigations->end(), tab_navigation); 937 navigations->insert(navigations->end(), tab_navigation);
915 } 938 }
916 939
917 bool SessionModelAssociator::UpdateSyncModelDataFromClient(SyncError* error) { 940 bool SessionModelAssociator::UpdateSyncModelDataFromClient(
Nicolas Zea 2012/04/05 22:08:58 undo newline?
lipalani1 2012/04/05 22:51:03 Done.
941 SyncError* error) {
918 DCHECK(CalledOnValidThread()); 942 DCHECK(CalledOnValidThread());
919 943
920 // Associate all open windows and their tabs. 944 // Associate all open windows and their tabs.
921 return AssociateWindows(true, error); 945 return AssociateWindows(true, error);
922 } 946 }
923 947
924 SessionModelAssociator::TabNodePool::TabNodePool( 948 SessionModelAssociator::TabNodePool::TabNodePool(
925 ProfileSyncService* sync_service) 949 ProfileSyncService* sync_service)
926 : tab_pool_fp_(-1), 950 : tab_pool_fp_(-1),
927 sync_service_(sync_service) { 951 sync_service_(sync_service) {
(...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after
1156 bool SessionModelAssociator::CryptoReadyIfNecessary() { 1180 bool SessionModelAssociator::CryptoReadyIfNecessary() {
1157 // We only access the cryptographer while holding a transaction. 1181 // We only access the cryptographer while holding a transaction.
1158 sync_api::ReadTransaction trans(FROM_HERE, sync_service_->GetUserShare()); 1182 sync_api::ReadTransaction trans(FROM_HERE, sync_service_->GetUserShare());
1159 const syncable::ModelTypeSet encrypted_types = 1183 const syncable::ModelTypeSet encrypted_types =
1160 sync_api::GetEncryptedTypes(&trans); 1184 sync_api::GetEncryptedTypes(&trans);
1161 return !encrypted_types.Has(SESSIONS) || 1185 return !encrypted_types.Has(SESSIONS) ||
1162 sync_service_->IsCryptographerReady(&trans); 1186 sync_service_->IsCryptographerReady(&trans);
1163 } 1187 }
1164 1188
1165 } // namespace browser_sync 1189 } // namespace browser_sync
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698