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

Side by Side Diff: google_apis/gcm/engine/gcm_store_impl.cc

Issue 1183843002: Do not create GCM store if it is not needed (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Address feedback + fix test Created 5 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
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 "google_apis/gcm/engine/gcm_store_impl.h" 5 #include "google_apis/gcm/engine/gcm_store_impl.h"
6 6
7 #include "base/basictypes.h" 7 #include "base/basictypes.h"
8 #include "base/bind.h" 8 #include "base/bind.h"
9 #include "base/callback.h" 9 #include "base/callback.h"
10 #include "base/files/file_path.h" 10 #include "base/files/file_path.h"
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
43 LOADING_DEVICE_CREDENTIALS_FAILED, 43 LOADING_DEVICE_CREDENTIALS_FAILED,
44 LOADING_REGISTRATION_FAILED, 44 LOADING_REGISTRATION_FAILED,
45 LOADING_INCOMING_MESSAGES_FAILED, 45 LOADING_INCOMING_MESSAGES_FAILED,
46 LOADING_OUTGOING_MESSAGES_FAILED, 46 LOADING_OUTGOING_MESSAGES_FAILED,
47 LOADING_LAST_CHECKIN_INFO_FAILED, 47 LOADING_LAST_CHECKIN_INFO_FAILED,
48 LOADING_GSERVICE_SETTINGS_FAILED, 48 LOADING_GSERVICE_SETTINGS_FAILED,
49 LOADING_ACCOUNT_MAPPING_FAILED, 49 LOADING_ACCOUNT_MAPPING_FAILED,
50 LOADING_LAST_TOKEN_TIME_FAILED, 50 LOADING_LAST_TOKEN_TIME_FAILED,
51 LOADING_HEARTBEAT_INTERVALS_FAILED, 51 LOADING_HEARTBEAT_INTERVALS_FAILED,
52 LOADING_INSTANCE_ID_DATA_FAILED, 52 LOADING_INSTANCE_ID_DATA_FAILED,
53 STORE_DOES_NOT_EXIST,
53 54
54 // NOTE: always keep this entry at the end. Add new status types only 55 // NOTE: always keep this entry at the end. Add new status types only
55 // immediately above this line. Make sure to update the corresponding 56 // immediately above this line. Make sure to update the corresponding
56 // histogram enum accordingly. 57 // histogram enum accordingly.
57 LOAD_STATUS_COUNT 58 LOAD_STATUS_COUNT
58 }; 59 };
59 60
60 // Limit to the number of outstanding messages per app. 61 // Limit to the number of outstanding messages per app.
61 const int kMessagesPerAppLimit = 20; 62 const int kMessagesPerAppLimit = 20;
62 63
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
178 } // namespace 179 } // namespace
179 180
180 class GCMStoreImpl::Backend 181 class GCMStoreImpl::Backend
181 : public base::RefCountedThreadSafe<GCMStoreImpl::Backend> { 182 : public base::RefCountedThreadSafe<GCMStoreImpl::Backend> {
182 public: 183 public:
183 Backend(const base::FilePath& path, 184 Backend(const base::FilePath& path,
184 scoped_refptr<base::SequencedTaskRunner> foreground_runner, 185 scoped_refptr<base::SequencedTaskRunner> foreground_runner,
185 scoped_ptr<Encryptor> encryptor); 186 scoped_ptr<Encryptor> encryptor);
186 187
187 // Blocking implementations of GCMStoreImpl methods. 188 // Blocking implementations of GCMStoreImpl methods.
188 void Load(const LoadCallback& callback); 189 void Load(StoreOpenMode open_mode, const LoadCallback& callback);
189 void Close(); 190 void Close();
190 void Destroy(const UpdateCallback& callback); 191 void Destroy(const UpdateCallback& callback);
191 void SetDeviceCredentials(uint64 device_android_id, 192 void SetDeviceCredentials(uint64 device_android_id,
192 uint64 device_security_token, 193 uint64 device_security_token,
193 const UpdateCallback& callback); 194 const UpdateCallback& callback);
194 void AddRegistration(const std::string& serialized_key, 195 void AddRegistration(const std::string& serialized_key,
195 const std::string& serialized_value, 196 const std::string& serialized_value,
196 const UpdateCallback& callback); 197 const UpdateCallback& callback);
197 void RemoveRegistration(const std::string& serialized_key, 198 void RemoveRegistration(const std::string& serialized_key,
198 const UpdateCallback& callback); 199 const UpdateCallback& callback);
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
236 void RemoveInstanceIDData(const std::string& app_id, 237 void RemoveInstanceIDData(const std::string& app_id,
237 const UpdateCallback& callback); 238 const UpdateCallback& callback);
238 void SetValue(const std::string& key, 239 void SetValue(const std::string& key,
239 const std::string& value, 240 const std::string& value,
240 const UpdateCallback& callback); 241 const UpdateCallback& callback);
241 242
242 private: 243 private:
243 friend class base::RefCountedThreadSafe<Backend>; 244 friend class base::RefCountedThreadSafe<Backend>;
244 ~Backend(); 245 ~Backend();
245 246
246 LoadStatus OpenStoreAndLoadData(LoadResult* result); 247 LoadStatus OpenStoreAndLoadData(StoreOpenMode open_mode, LoadResult* result);
247 bool LoadDeviceCredentials(uint64* android_id, uint64* security_token); 248 bool LoadDeviceCredentials(uint64* android_id, uint64* security_token);
248 bool LoadRegistrations(std::map<std::string, std::string>* registrations); 249 bool LoadRegistrations(std::map<std::string, std::string>* registrations);
249 bool LoadIncomingMessages(std::vector<std::string>* incoming_messages); 250 bool LoadIncomingMessages(std::vector<std::string>* incoming_messages);
250 bool LoadOutgoingMessages(OutgoingMessageMap* outgoing_messages); 251 bool LoadOutgoingMessages(OutgoingMessageMap* outgoing_messages);
251 bool LoadLastCheckinInfo(base::Time* last_checkin_time, 252 bool LoadLastCheckinInfo(base::Time* last_checkin_time,
252 std::set<std::string>* accounts); 253 std::set<std::string>* accounts);
253 bool LoadGServicesSettings(std::map<std::string, std::string>* settings, 254 bool LoadGServicesSettings(std::map<std::string, std::string>* settings,
254 std::string* digest); 255 std::string* digest);
255 bool LoadAccountMappingInfo(AccountMappings* account_mappings); 256 bool LoadAccountMappingInfo(AccountMappings* account_mappings);
256 bool LoadLastTokenFetchTime(base::Time* last_token_fetch_time); 257 bool LoadLastTokenFetchTime(base::Time* last_token_fetch_time);
(...skipping 11 matching lines...) Expand all
268 const base::FilePath& path, 269 const base::FilePath& path,
269 scoped_refptr<base::SequencedTaskRunner> foreground_task_runner, 270 scoped_refptr<base::SequencedTaskRunner> foreground_task_runner,
270 scoped_ptr<Encryptor> encryptor) 271 scoped_ptr<Encryptor> encryptor)
271 : path_(path), 272 : path_(path),
272 foreground_task_runner_(foreground_task_runner), 273 foreground_task_runner_(foreground_task_runner),
273 encryptor_(encryptor.Pass()) { 274 encryptor_(encryptor.Pass()) {
274 } 275 }
275 276
276 GCMStoreImpl::Backend::~Backend() {} 277 GCMStoreImpl::Backend::~Backend() {}
277 278
278 LoadStatus GCMStoreImpl::Backend::OpenStoreAndLoadData(LoadResult* result) { 279 LoadStatus GCMStoreImpl::Backend::OpenStoreAndLoadData(StoreOpenMode open_mode,
280 LoadResult* result) {
279 LoadStatus load_status; 281 LoadStatus load_status;
280 if (db_.get()) { 282 if (db_.get()) {
281 LOG(ERROR) << "Attempting to reload open database."; 283 LOG(ERROR) << "Attempting to reload open database.";
282 return RELOADING_OPEN_STORE; 284 return RELOADING_OPEN_STORE;
283 } 285 }
284 286
287 // Checks if the store exists or not. Calling DB::Open with create_if_missing
288 // not set will still create a new directory if the store does not exist.
289 if (open_mode == DO_NOT_CREATE && !base::DirectoryExists(path_)) {
290 DVLOG(2) << "Database " << path_.value() << " does not exist";
291 return STORE_DOES_NOT_EXIST;
292 }
293
285 leveldb::Options options; 294 leveldb::Options options;
286 options.create_if_missing = true; 295 options.create_if_missing = open_mode == CREATE_IF_MISSING;
287 options.reuse_logs = leveldb_env::kDefaultLogReuseOptionValue; 296 options.reuse_logs = leveldb_env::kDefaultLogReuseOptionValue;
288 leveldb::DB* db; 297 leveldb::DB* db;
289 leveldb::Status status = 298 leveldb::Status status =
290 leveldb::DB::Open(options, path_.AsUTF8Unsafe(), &db); 299 leveldb::DB::Open(options, path_.AsUTF8Unsafe(), &db);
291 if (!status.ok()) { 300 if (!status.ok()) {
292 LOG(ERROR) << "Failed to open database " << path_.value() << ": " 301 LOG(ERROR) << "Failed to open database " << path_.value() << ": "
293 << status.ToString(); 302 << status.ToString();
294 return OPENING_STORE_FAILED; 303 return OPENING_STORE_FAILED;
295 } 304 }
296 305
(...skipping 21 matching lines...) Expand all
318 if (!LoadLastTokenFetchTime(&result->last_token_fetch_time)) 327 if (!LoadLastTokenFetchTime(&result->last_token_fetch_time))
319 return LOADING_LAST_TOKEN_TIME_FAILED; 328 return LOADING_LAST_TOKEN_TIME_FAILED;
320 if (!LoadHeartbeatIntervals(&result->heartbeat_intervals)) 329 if (!LoadHeartbeatIntervals(&result->heartbeat_intervals))
321 return LOADING_HEARTBEAT_INTERVALS_FAILED; 330 return LOADING_HEARTBEAT_INTERVALS_FAILED;
322 if (!LoadInstanceIDData(&result->instance_id_data)) 331 if (!LoadInstanceIDData(&result->instance_id_data))
323 return LOADING_INSTANCE_ID_DATA_FAILED; 332 return LOADING_INSTANCE_ID_DATA_FAILED;
324 333
325 return LOADING_SUCCEEDED; 334 return LOADING_SUCCEEDED;
326 } 335 }
327 336
328 void GCMStoreImpl::Backend::Load(const LoadCallback& callback) { 337 void GCMStoreImpl::Backend::Load(StoreOpenMode open_mode,
338 const LoadCallback& callback) {
329 scoped_ptr<LoadResult> result(new LoadResult()); 339 scoped_ptr<LoadResult> result(new LoadResult());
330 LoadStatus load_status = OpenStoreAndLoadData(result.get()); 340 LoadStatus load_status = OpenStoreAndLoadData(open_mode, result.get());
331 UMA_HISTOGRAM_ENUMERATION("GCM.LoadStatus", load_status, LOAD_STATUS_COUNT); 341 UMA_HISTOGRAM_ENUMERATION("GCM.LoadStatus", load_status, LOAD_STATUS_COUNT);
332 if (load_status != LOADING_SUCCEEDED) { 342 if (load_status != LOADING_SUCCEEDED) {
333 result->Reset(); 343 result->Reset();
344 result->store_does_not_exist = (load_status == STORE_DOES_NOT_EXIST);
334 foreground_task_runner_->PostTask(FROM_HERE, 345 foreground_task_runner_->PostTask(FROM_HERE,
335 base::Bind(callback, 346 base::Bind(callback,
336 base::Passed(&result))); 347 base::Passed(&result)));
337 return; 348 return;
338 } 349 }
339 350
340 // |result->registrations| contains both GCM registrations and InstanceID 351 // |result->registrations| contains both GCM registrations and InstanceID
341 // tokens. Count them separately. 352 // tokens. Count them separately.
342 int gcm_registration_count = 0; 353 int gcm_registration_count = 0;
343 int instance_id_token_count = 0; 354 int instance_id_token_count = 0;
(...skipping 805 matching lines...) Expand 10 before | Expand all | Expand 10 after
1149 scoped_ptr<Encryptor> encryptor) 1160 scoped_ptr<Encryptor> encryptor)
1150 : backend_(new Backend(path, 1161 : backend_(new Backend(path,
1151 base::ThreadTaskRunnerHandle::Get(), 1162 base::ThreadTaskRunnerHandle::Get(),
1152 encryptor.Pass())), 1163 encryptor.Pass())),
1153 blocking_task_runner_(blocking_task_runner), 1164 blocking_task_runner_(blocking_task_runner),
1154 weak_ptr_factory_(this) { 1165 weak_ptr_factory_(this) {
1155 } 1166 }
1156 1167
1157 GCMStoreImpl::~GCMStoreImpl() {} 1168 GCMStoreImpl::~GCMStoreImpl() {}
1158 1169
1159 void GCMStoreImpl::Load(const LoadCallback& callback) { 1170 void GCMStoreImpl::Load(StoreOpenMode open_mode, const LoadCallback& callback) {
1160 blocking_task_runner_->PostTask( 1171 blocking_task_runner_->PostTask(
1161 FROM_HERE, 1172 FROM_HERE,
1162 base::Bind(&GCMStoreImpl::Backend::Load, 1173 base::Bind(&GCMStoreImpl::Backend::Load,
1163 backend_, 1174 backend_,
1175 open_mode,
1164 base::Bind(&GCMStoreImpl::LoadContinuation, 1176 base::Bind(&GCMStoreImpl::LoadContinuation,
1165 weak_ptr_factory_.GetWeakPtr(), 1177 weak_ptr_factory_.GetWeakPtr(),
1166 callback))); 1178 callback)));
1167 } 1179 }
1168 1180
1169 void GCMStoreImpl::Close() { 1181 void GCMStoreImpl::Close() {
1170 weak_ptr_factory_.InvalidateWeakPtrs(); 1182 weak_ptr_factory_.InvalidateWeakPtrs();
1171 app_message_counts_.clear(); 1183 app_message_counts_.clear();
1172 blocking_task_runner_->PostTask( 1184 blocking_task_runner_->PostTask(
1173 FROM_HERE, 1185 FROM_HERE,
(...skipping 283 matching lines...) Expand 10 before | Expand all | Expand 10 after
1457 removed_message_counts.begin(); 1469 removed_message_counts.begin();
1458 iter != removed_message_counts.end(); ++iter) { 1470 iter != removed_message_counts.end(); ++iter) {
1459 DCHECK_NE(app_message_counts_.count(iter->first), 0U); 1471 DCHECK_NE(app_message_counts_.count(iter->first), 0U);
1460 app_message_counts_[iter->first] -= iter->second; 1472 app_message_counts_[iter->first] -= iter->second;
1461 DCHECK_GE(app_message_counts_[iter->first], 0); 1473 DCHECK_GE(app_message_counts_[iter->first], 0);
1462 } 1474 }
1463 callback.Run(true); 1475 callback.Run(true);
1464 } 1476 }
1465 1477
1466 } // namespace gcm 1478 } // namespace gcm
OLDNEW
« no previous file with comments | « google_apis/gcm/engine/gcm_store_impl.h ('k') | google_apis/gcm/engine/gcm_store_impl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698