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

Side by Side Diff: sync/internal_api/sync_manager.cc

Issue 10520010: Not for review: Support sync init with missing or corrupt store (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Documentation Created 8 years, 6 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 "sync/internal_api/sync_manager.h" 5 #include "sync/internal_api/sync_manager.h"
6 6
7 #include <string> 7 #include <string>
8 8
9 #include "base/base64.h" 9 #include "base/base64.h"
10 #include "base/bind.h" 10 #include "base/bind.h"
11 #include "base/callback.h" 11 #include "base/callback.h"
12 #include "base/command_line.h" 12 #include "base/command_line.h"
13 #include "base/compiler_specific.h" 13 #include "base/compiler_specific.h"
14 #include "base/file_util.h"
14 #include "base/json/json_writer.h" 15 #include "base/json/json_writer.h"
15 #include "base/memory/ref_counted.h" 16 #include "base/memory/ref_counted.h"
16 #include "base/metrics/histogram.h" 17 #include "base/metrics/histogram.h"
17 #include "base/observer_list.h" 18 #include "base/observer_list.h"
18 #include "base/string_number_conversions.h" 19 #include "base/string_number_conversions.h"
19 #include "base/values.h" 20 #include "base/values.h"
20 #include "net/base/network_change_notifier.h" 21 #include "net/base/network_change_notifier.h"
21 #include "sync/engine/net/server_connection_manager.h" 22 #include "sync/engine/net/server_connection_manager.h"
22 #include "sync/engine/nigori_util.h" 23 #include "sync/engine/nigori_util.h"
23 #include "sync/engine/polling_constants.h" 24 #include "sync/engine/polling_constants.h"
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after
188 CHECK(!initialized_); 189 CHECK(!initialized_);
189 } 190 }
190 191
191 bool Init(const FilePath& database_location, 192 bool Init(const FilePath& database_location,
192 const WeakHandle<JsEventHandler>& event_handler, 193 const WeakHandle<JsEventHandler>& event_handler,
193 const std::string& sync_server_and_path, 194 const std::string& sync_server_and_path,
194 int port, 195 int port,
195 bool use_ssl, 196 bool use_ssl,
196 const scoped_refptr<base::TaskRunner>& blocking_task_runner, 197 const scoped_refptr<base::TaskRunner>& blocking_task_runner,
197 HttpPostProviderFactory* post_factory, 198 HttpPostProviderFactory* post_factory,
198 const browser_sync::ModelSafeRoutingInfo& model_safe_routing_info,
199 const std::vector<browser_sync::ModelSafeWorker*>& workers, 199 const std::vector<browser_sync::ModelSafeWorker*>& workers,
200 browser_sync::ExtensionsActivityMonitor* 200 browser_sync::ExtensionsActivityMonitor*
201 extensions_activity_monitor, 201 extensions_activity_monitor,
202 ChangeDelegate* change_delegate, 202 ChangeDelegate* change_delegate,
203 const std::string& user_agent, 203 const std::string& user_agent,
204 const SyncCredentials& credentials, 204 const SyncCredentials& credentials,
205 sync_notifier::SyncNotifier* sync_notifier, 205 sync_notifier::SyncNotifier* sync_notifier,
206 const std::string& restored_key_for_bootstrapping, 206 const std::string& restored_key_for_bootstrapping,
207 TestingMode testing_mode, 207 TestingMode testing_mode,
208 Encryptor* encryptor, 208 Encryptor* encryptor,
(...skipping 523 matching lines...) Expand 10 before | Expand all | Expand 10 after
732 } 732 }
733 733
734 bool SyncManager::Init( 734 bool SyncManager::Init(
735 const FilePath& database_location, 735 const FilePath& database_location,
736 const WeakHandle<JsEventHandler>& event_handler, 736 const WeakHandle<JsEventHandler>& event_handler,
737 const std::string& sync_server_and_path, 737 const std::string& sync_server_and_path,
738 int sync_server_port, 738 int sync_server_port,
739 bool use_ssl, 739 bool use_ssl,
740 const scoped_refptr<base::TaskRunner>& blocking_task_runner, 740 const scoped_refptr<base::TaskRunner>& blocking_task_runner,
741 HttpPostProviderFactory* post_factory, 741 HttpPostProviderFactory* post_factory,
742 const browser_sync::ModelSafeRoutingInfo& model_safe_routing_info,
743 const std::vector<browser_sync::ModelSafeWorker*>& workers, 742 const std::vector<browser_sync::ModelSafeWorker*>& workers,
744 browser_sync::ExtensionsActivityMonitor* extensions_activity_monitor, 743 browser_sync::ExtensionsActivityMonitor* extensions_activity_monitor,
745 ChangeDelegate* change_delegate, 744 ChangeDelegate* change_delegate,
746 const std::string& user_agent, 745 const std::string& user_agent,
747 const SyncCredentials& credentials, 746 const SyncCredentials& credentials,
748 sync_notifier::SyncNotifier* sync_notifier, 747 sync_notifier::SyncNotifier* sync_notifier,
749 const std::string& restored_key_for_bootstrapping, 748 const std::string& restored_key_for_bootstrapping,
750 TestingMode testing_mode, 749 TestingMode testing_mode,
751 Encryptor* encryptor, 750 Encryptor* encryptor,
752 UnrecoverableErrorHandler* unrecoverable_error_handler, 751 UnrecoverableErrorHandler* unrecoverable_error_handler,
753 ReportUnrecoverableErrorFunction report_unrecoverable_error_function) { 752 ReportUnrecoverableErrorFunction report_unrecoverable_error_function) {
754 DCHECK(thread_checker_.CalledOnValidThread()); 753 DCHECK(thread_checker_.CalledOnValidThread());
755 DCHECK(post_factory); 754 DCHECK(post_factory);
756 DVLOG(1) << "SyncManager starting Init..."; 755 DVLOG(1) << "SyncManager starting Init...";
757 std::string server_string(sync_server_and_path); 756 std::string server_string(sync_server_and_path);
758 return data_->Init(database_location, 757 return data_->Init(database_location,
759 event_handler, 758 event_handler,
760 server_string, 759 server_string,
761 sync_server_port, 760 sync_server_port,
762 use_ssl, 761 use_ssl,
763 blocking_task_runner, 762 blocking_task_runner,
764 post_factory, 763 post_factory,
765 model_safe_routing_info,
766 workers, 764 workers,
767 extensions_activity_monitor, 765 extensions_activity_monitor,
768 change_delegate, 766 change_delegate,
769 user_agent, 767 user_agent,
770 credentials, 768 credentials,
771 sync_notifier, 769 sync_notifier,
772 restored_key_for_bootstrapping, 770 restored_key_for_bootstrapping,
773 testing_mode, 771 testing_mode,
774 encryptor, 772 encryptor,
775 unrecoverable_error_handler, 773 unrecoverable_error_handler,
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
884 } 882 }
885 883
886 bool SyncManager::SyncInternal::Init( 884 bool SyncManager::SyncInternal::Init(
887 const FilePath& database_location, 885 const FilePath& database_location,
888 const WeakHandle<JsEventHandler>& event_handler, 886 const WeakHandle<JsEventHandler>& event_handler,
889 const std::string& sync_server_and_path, 887 const std::string& sync_server_and_path,
890 int port, 888 int port,
891 bool use_ssl, 889 bool use_ssl,
892 const scoped_refptr<base::TaskRunner>& blocking_task_runner, 890 const scoped_refptr<base::TaskRunner>& blocking_task_runner,
893 HttpPostProviderFactory* post_factory, 891 HttpPostProviderFactory* post_factory,
894 const browser_sync::ModelSafeRoutingInfo& model_safe_routing_info,
895 const std::vector<browser_sync::ModelSafeWorker*>& workers, 892 const std::vector<browser_sync::ModelSafeWorker*>& workers,
896 browser_sync::ExtensionsActivityMonitor* extensions_activity_monitor, 893 browser_sync::ExtensionsActivityMonitor* extensions_activity_monitor,
897 ChangeDelegate* change_delegate, 894 ChangeDelegate* change_delegate,
898 const std::string& user_agent, 895 const std::string& user_agent,
899 const SyncCredentials& credentials, 896 const SyncCredentials& credentials,
900 sync_notifier::SyncNotifier* sync_notifier, 897 sync_notifier::SyncNotifier* sync_notifier,
901 const std::string& restored_key_for_bootstrapping, 898 const std::string& restored_key_for_bootstrapping,
902 TestingMode testing_mode, 899 TestingMode testing_mode,
903 Encryptor* encryptor, 900 Encryptor* encryptor,
904 UnrecoverableErrorHandler* unrecoverable_error_handler, 901 UnrecoverableErrorHandler* unrecoverable_error_handler,
(...skipping 16 matching lines...) Expand all
921 AddObserver(&js_sync_manager_observer_); 918 AddObserver(&js_sync_manager_observer_);
922 SetJsEventHandler(event_handler); 919 SetJsEventHandler(event_handler);
923 920
924 AddObserver(&debug_info_event_listener_); 921 AddObserver(&debug_info_event_listener_);
925 922
926 database_path_ = database_location.Append( 923 database_path_ = database_location.Append(
927 syncable::Directory::kSyncDatabaseFilename); 924 syncable::Directory::kSyncDatabaseFilename);
928 encryptor_ = encryptor; 925 encryptor_ = encryptor;
929 unrecoverable_error_handler_ = unrecoverable_error_handler; 926 unrecoverable_error_handler_ = unrecoverable_error_handler;
930 report_unrecoverable_error_function_ = report_unrecoverable_error_function; 927 report_unrecoverable_error_function_ = report_unrecoverable_error_function;
931 share_.directory.reset(
932 new syncable::Directory(encryptor_,
933 unrecoverable_error_handler_,
934 report_unrecoverable_error_function_));
935 928
936 connection_manager_.reset(new SyncAPIServerConnectionManager( 929 connection_manager_.reset(new SyncAPIServerConnectionManager(
937 sync_server_and_path, port, use_ssl, user_agent, post_factory)); 930 sync_server_and_path, port, use_ssl, user_agent, post_factory));
938 931
939 net::NetworkChangeNotifier::AddIPAddressObserver(this); 932 net::NetworkChangeNotifier::AddIPAddressObserver(this);
940 observing_ip_address_changes_ = true; 933 observing_ip_address_changes_ = true;
941 934
942 connection_manager()->AddListener(this); 935 connection_manager()->AddListener(this);
943 936
937 bool signed_in = SignIn(credentials);
938
944 // Test mode does not use a syncer context or syncer thread. 939 // Test mode does not use a syncer context or syncer thread.
945 if (testing_mode_ == NON_TEST) { 940 if (testing_mode_ == NON_TEST) {
946 // Build a SyncSessionContext and store the worker in it. 941 // Build a SyncSessionContext and store the worker in it.
947 DVLOG(1) << "Sync is bringing up SyncSessionContext."; 942 DVLOG(1) << "Sync is bringing up SyncSessionContext.";
948 std::vector<SyncEngineEventListener*> listeners; 943 std::vector<SyncEngineEventListener*> listeners;
949 listeners.push_back(&allstatus_); 944 listeners.push_back(&allstatus_);
950 listeners.push_back(this); 945 listeners.push_back(this);
951 session_context_.reset(new SyncSessionContext( 946 session_context_.reset(new SyncSessionContext(
952 connection_manager_.get(), 947 connection_manager_.get(),
953 directory(), 948 directory(),
954 model_safe_routing_info,
955 workers, 949 workers,
956 extensions_activity_monitor, 950 extensions_activity_monitor,
957 listeners, 951 listeners,
958 &debug_info_event_listener_, 952 &debug_info_event_listener_,
959 &traffic_recorder_)); 953 &traffic_recorder_));
960 session_context()->set_account_name(credentials.email); 954 session_context()->set_account_name(credentials.email);
961 scheduler_.reset(new SyncScheduler(name_, session_context(), new Syncer())); 955 scheduler_.reset(new SyncScheduler(name_, session_context(), new Syncer()));
962 } 956 }
963 957
964 bool signed_in = SignIn(credentials);
965
966 if (signed_in) { 958 if (signed_in) {
967 if (scheduler()) { 959 if (scheduler()) {
968 scheduler()->Start( 960 scheduler()->Start(
969 browser_sync::SyncScheduler::CONFIGURATION_MODE, base::Closure()); 961 browser_sync::SyncScheduler::CONFIGURATION_MODE, base::Closure());
970 } 962 }
971 963
972 initialized_ = true; 964 initialized_ = true;
973 965
974 // Cryptographer should only be accessed while holding a 966 // Cryptographer should only be accessed while holding a
975 // transaction. Grabbing the user share for the transaction 967 // transaction. Grabbing the user share for the transaction
976 // checks the initialization state, so this must come after 968 // checks the initialization state, so this must come after
977 // |initialized_| is set to true. 969 // |initialized_| is set to true.
978 ReadTransaction trans(FROM_HERE, GetUserShare()); 970 ReadTransaction trans(FROM_HERE, GetUserShare());
979 trans.GetCryptographer()->Bootstrap(restored_key_for_bootstrapping); 971 trans.GetCryptographer()->Bootstrap(restored_key_for_bootstrapping);
980 trans.GetCryptographer()->AddObserver(this); 972 trans.GetCryptographer()->AddObserver(this);
981 } 973 }
982 974
983 // Notify that initialization is complete. Note: This should be the last to 975 // Notify that initialization is complete. Note: This should be the last to
984 // execute if |signed_in| is false. Reason being in that case we would 976 // execute if |signed_in| is false. Reason being in that case we would
985 // post a task to shutdown sync. But if this function posts any other tasks 977 // post a task to shutdown sync. But if this function posts any other tasks
986 // on the UI thread and if shutdown wins then that tasks would execute on 978 // on the UI thread and if shutdown wins then that tasks would execute on
987 // a freed pointer. This is because UI thread is not shut down. 979 // a freed pointer. This is because UI thread is not shut down.
988 FOR_EACH_OBSERVER(SyncManager::Observer, observers_, 980 FOR_EACH_OBSERVER(SyncManager::Observer, observers_,
989 OnInitializationComplete( 981 OnInitializationComplete(
990 MakeWeakHandle(weak_ptr_factory_.GetWeakPtr()), 982 MakeWeakHandle(weak_ptr_factory_.GetWeakPtr()),
991 signed_in)); 983 signed_in,
984 signed_in ? InitialSyncEndedTypes() :
985 syncable::ModelTypeSet()));
992 986
993 if (!signed_in && testing_mode_ == NON_TEST) 987 if (!signed_in && testing_mode_ == NON_TEST)
994 return false; 988 return false;
995 989
996 sync_notifier_->AddObserver(this); 990 sync_notifier_->AddObserver(this);
997 991
998 return signed_in; 992 return signed_in;
999 } 993 }
1000 994
1001 void SyncManager::SyncInternal::UpdateCryptographerAndNigori( 995 void SyncManager::SyncInternal::UpdateCryptographerAndNigori(
(...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after
1141 const browser_sync::ModelSafeRoutingInfo& routing_info) { 1135 const browser_sync::ModelSafeRoutingInfo& routing_info) {
1142 // Start the sync scheduler. 1136 // Start the sync scheduler.
1143 if (scheduler()) { // NULL during certain unittests. 1137 if (scheduler()) { // NULL during certain unittests.
1144 session_context()->set_routing_info(routing_info); 1138 session_context()->set_routing_info(routing_info);
1145 scheduler()->Start(SyncScheduler::NORMAL_MODE, base::Closure()); 1139 scheduler()->Start(SyncScheduler::NORMAL_MODE, base::Closure());
1146 } 1140 }
1147 } 1141 }
1148 1142
1149 bool SyncManager::SyncInternal::OpenDirectory() { 1143 bool SyncManager::SyncInternal::OpenDirectory() {
1150 DCHECK(!initialized_) << "Should only happen once"; 1144 DCHECK(!initialized_) << "Should only happen once";
1145 share_.directory.reset(
1146 new syncable::Directory(encryptor_,
1147 unrecoverable_error_handler_,
1148 report_unrecoverable_error_function_));
1151 1149
1152 // Set before Open(). 1150 // Set before Open().
1153 change_observer_ = 1151 change_observer_ =
1154 browser_sync::MakeWeakHandle(js_mutation_event_observer_.AsWeakPtr()); 1152 browser_sync::MakeWeakHandle(js_mutation_event_observer_.AsWeakPtr());
1155 WeakHandle<syncable::TransactionObserver> transaction_observer( 1153 WeakHandle<syncable::TransactionObserver> transaction_observer(
1156 browser_sync::MakeWeakHandle(js_mutation_event_observer_.AsWeakPtr())); 1154 browser_sync::MakeWeakHandle(js_mutation_event_observer_.AsWeakPtr()));
1157 1155
1158 syncable::DirOpenResult open_result = syncable::NOT_INITIALIZED; 1156 syncable::DirOpenResult open_result = syncable::NOT_INITIALIZED;
1159 if (testing_mode_ == TEST_IN_MEMORY) { 1157 if (testing_mode_ == TEST_IN_MEMORY) {
1160 open_result = directory()->OpenInMemoryForTest( 1158 open_result = directory()->OpenInMemoryForTest(
1161 username_for_share(), this, transaction_observer); 1159 username_for_share(), this, transaction_observer);
1162 } else { 1160 } else {
1163 open_result = directory()->Open( 1161 open_result = directory()->Open(
1164 database_path_, username_for_share(), this, transaction_observer); 1162 database_path_, username_for_share(), this, transaction_observer);
1163 // If at first we don't succeed, delete the DB and try again.
1164 if (open_result != syncable::OPENED) {
1165 file_util::Delete(database_path_, true);
1166 open_result = directory()->Open(
1167 database_path_, username_for_share(), this, transaction_observer);
1168 }
1165 } 1169 }
1166 if (open_result != syncable::OPENED) { 1170 if (open_result != syncable::OPENED) {
1167 LOG(ERROR) << "Could not open share for:" << username_for_share(); 1171 LOG(ERROR) << "Could not open share for:" << username_for_share();
1168 return false; 1172 return false;
1169 } 1173 }
1170 1174
1171 connection_manager()->set_client_id(directory()->cache_guid()); 1175 connection_manager()->set_client_id(directory()->cache_guid());
1172 return true; 1176 return true;
1173 } 1177 }
1174 1178
(...skipping 1309 matching lines...) Expand 10 before | Expand all | Expand 10 after
2484 bool InitialSyncEndedForTypes(syncable::ModelTypeSet types, 2488 bool InitialSyncEndedForTypes(syncable::ModelTypeSet types,
2485 sync_api::UserShare* share) { 2489 sync_api::UserShare* share) {
2486 for (syncable::ModelTypeSet::Iterator i = types.First(); 2490 for (syncable::ModelTypeSet::Iterator i = types.First();
2487 i.Good(); i.Inc()) { 2491 i.Good(); i.Inc()) {
2488 if (!share->directory->initial_sync_ended_for_type(i.Get())) 2492 if (!share->directory->initial_sync_ended_for_type(i.Get()))
2489 return false; 2493 return false;
2490 } 2494 }
2491 return true; 2495 return true;
2492 } 2496 }
2493 2497
2494 syncable::ModelTypeSet GetTypesWithEmptyProgressMarkerToken(
2495 syncable::ModelTypeSet types,
2496 sync_api::UserShare* share) {
2497 syncable::ModelTypeSet result;
2498 for (syncable::ModelTypeSet::Iterator i = types.First();
2499 i.Good(); i.Inc()) {
2500 sync_pb::DataTypeProgressMarker marker;
2501 share->directory->GetDownloadProgress(i.Get(), &marker);
2502
2503 if (marker.token().empty())
2504 result.Put(i.Get());
2505
2506 }
2507 return result;
2508 }
2509
2510 } // namespace sync_api 2498 } // namespace sync_api
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698