Chromium Code Reviews| Index: google_apis/gcm/engine/gcm_store_impl.cc |
| diff --git a/google_apis/gcm/engine/gcm_store_impl.cc b/google_apis/gcm/engine/gcm_store_impl.cc |
| index cbdfa32834e5fa46dd5c46e1246a76b27135011b..405b2126883d59d5358fed33d709197f1c8d9828 100644 |
| --- a/google_apis/gcm/engine/gcm_store_impl.cc |
| +++ b/google_apis/gcm/engine/gcm_store_impl.cc |
| @@ -30,6 +30,28 @@ namespace gcm { |
| namespace { |
| +// This enum is used in an UMA histogram (GCMLoadStatus enum defined in |
| +// tools/metrics/histograms/histogram.xml). Hence the entries here shouldn't |
| +// be deleted or re-ordered and new ones should be added to the end. |
| +enum LoadStatus { |
|
Nicolas Zea
2015/02/10 18:59:46
Do we really care to differentiate all these diffe
jianli
2015/02/10 19:45:14
I think we might need more info on the underlying
|
| + LOADING_SUCCEEDED, |
| + RELOADING_OPEN_STORE, |
| + OPENING_STORE_FAILED, |
| + LOADING_DEVICE_CREDENTIAL_FAILED, |
|
fgorski
2015/02/10 18:31:31
credentials
jianli
2015/02/10 19:45:14
Done.
|
| + LOADING_REGISTRATION_FAILED, |
| + LOADING_INCOMING_MESSAGES_FAILED, |
| + LOADING_OUTGOING_MESSAGES_FAILED, |
| + LOADING_LAST_CHECKIN_INFO_FAILED, |
| + LOADING_GSERVICE_SETTINGS_FAILED, |
| + LOADING_ACCOUNT_MAPPING_FAILED, |
| + LOADING_LAST_TOKEN_TIME_FAILED, |
| + |
| + // NOTE: always keep this entry at the end. Add new status types only |
| + // immediately above this line. Make sure to update the corresponding |
| + // histogram enum accordingly. |
| + LOAD_STATUS_COUNT |
| +}; |
| + |
| // Limit to the number of outstanding messages per app. |
| const int kMessagesPerAppLimit = 20; |
| @@ -178,6 +200,7 @@ class GCMStoreImpl::Backend |
| friend class base::RefCountedThreadSafe<Backend>; |
| ~Backend(); |
| + LoadStatus OpenStoreAndLoadData(LoadResult* result); |
| bool LoadDeviceCredentials(uint64* android_id, uint64* security_token); |
| bool LoadRegistrations(RegistrationInfoMap* registrations); |
| bool LoadIncomingMessages(std::vector<std::string>* incoming_messages); |
| @@ -207,14 +230,11 @@ GCMStoreImpl::Backend::Backend( |
| GCMStoreImpl::Backend::~Backend() {} |
| -void GCMStoreImpl::Backend::Load(const LoadCallback& callback) { |
| - scoped_ptr<LoadResult> result(new LoadResult()); |
| +LoadStatus GCMStoreImpl::Backend::OpenStoreAndLoadData(LoadResult* result) { |
| + LoadStatus load_status; |
| if (db_.get()) { |
| LOG(ERROR) << "Attempting to reload open database."; |
| - foreground_task_runner_->PostTask(FROM_HERE, |
| - base::Bind(callback, |
| - base::Passed(&result))); |
| - return; |
| + return RELOADING_OPEN_STORE; |
| } |
| leveldb::Options options; |
| @@ -222,28 +242,44 @@ void GCMStoreImpl::Backend::Load(const LoadCallback& callback) { |
| leveldb::DB* db; |
| leveldb::Status status = |
| leveldb::DB::Open(options, path_.AsUTF8Unsafe(), &db); |
| - UMA_HISTOGRAM_BOOLEAN("GCM.LoadSucceeded", status.ok()); |
| if (!status.ok()) { |
| LOG(ERROR) << "Failed to open database " << path_.value() << ": " |
| << status.ToString(); |
| - foreground_task_runner_->PostTask(FROM_HERE, |
| - base::Bind(callback, |
| - base::Passed(&result))); |
| - return; |
| + return OPENING_STORE_FAILED; |
| } |
| - db_.reset(db); |
| + db_.reset(db); |
| if (!LoadDeviceCredentials(&result->device_android_id, |
| - &result->device_security_token) || |
| - !LoadRegistrations(&result->registrations) || |
| - !LoadIncomingMessages(&result->incoming_messages) || |
| - !LoadOutgoingMessages(&result->outgoing_messages) || |
| - !LoadLastCheckinInfo(&result->last_checkin_time, |
| - &result->last_checkin_accounts) || |
| - !LoadGServicesSettings(&result->gservices_settings, |
| - &result->gservices_digest) || |
| - !LoadAccountMappingInfo(&result->account_mappings) || |
| - !LoadLastTokenFetchTime(&result->last_token_fetch_time)) { |
| + &result->device_security_token)) { |
| + return LOADING_DEVICE_CREDENTIAL_FAILED; |
| + } |
| + if (!LoadRegistrations(&result->registrations)) |
| + return LOADING_REGISTRATION_FAILED; |
| + if (!LoadIncomingMessages(&result->incoming_messages)) |
| + return LOADING_INCOMING_MESSAGES_FAILED; |
| + if (!LoadOutgoingMessages(&result->outgoing_messages)) |
| + return LOADING_OUTGOING_MESSAGES_FAILED; |
| + if (!LoadLastCheckinInfo(&result->last_checkin_time, |
| + &result->last_checkin_accounts)) { |
| + return LOADING_LAST_CHECKIN_INFO_FAILED; |
| + } |
| + if (!LoadGServicesSettings(&result->gservices_settings, |
| + &result->gservices_digest)) { |
| + return load_status = LOADING_GSERVICE_SETTINGS_FAILED; |
| + } |
| + if (!LoadAccountMappingInfo(&result->account_mappings)) |
| + return LOADING_ACCOUNT_MAPPING_FAILED; |
| + if (!LoadLastTokenFetchTime(&result->last_token_fetch_time)) |
| + return LOADING_LAST_TOKEN_TIME_FAILED; |
| + |
| + return LOADING_SUCCEEDED; |
| +} |
| + |
| +void GCMStoreImpl::Backend::Load(const LoadCallback& callback) { |
| + scoped_ptr<LoadResult> result(new LoadResult()); |
| + LoadStatus load_status = OpenStoreAndLoadData(result.get()); |
| + if (load_status != LOADING_SUCCEEDED) { |
| + UMA_HISTOGRAM_ENUMERATION("GCM.LoadStatus", load_status, LOAD_STATUS_COUNT); |
| result->Reset(); |
| foreground_task_runner_->PostTask(FROM_HERE, |
| base::Bind(callback, |