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..a9100b0c4547bfd4357ec36020b872f645f1f74e 100644 |
--- a/google_apis/gcm/engine/gcm_store_impl.cc |
+++ b/google_apis/gcm/engine/gcm_store_impl.cc |
@@ -11,7 +11,7 @@ |
#include "base/files/file_util.h" |
#include "base/logging.h" |
#include "base/message_loop/message_loop_proxy.h" |
-#include "base/metrics/histogram.h" |
+#include "base/metrics/histogram_macros.h" |
#include "base/sequenced_task_runner.h" |
#include "base/stl_util.h" |
#include "base/strings/string_number_conversions.h" |
@@ -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 { |
+ LOADING_SUCCEEDED, |
+ RELOADING_OPEN_STORE, |
+ OPENING_STORE_FAILED, |
+ LOADING_DEVICE_CREDENTIALS_FAILED, |
+ 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_CREDENTIALS_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()); |
+ UMA_HISTOGRAM_ENUMERATION("GCM.LoadStatus", load_status, LOAD_STATUS_COUNT); |
+ if (load_status != LOADING_SUCCEEDED) { |
result->Reset(); |
foreground_task_runner_->PostTask(FROM_HERE, |
base::Bind(callback, |