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

Unified Diff: google_apis/gcm/engine/gcm_store_impl.cc

Issue 910093003: Reset the GCM store to recover from it when it is busted (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Address more feedback Created 5 years, 10 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « components/gcm_driver/gcm_client_impl_unittest.cc ('k') | tools/metrics/histograms/histograms.xml » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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,
« no previous file with comments | « components/gcm_driver/gcm_client_impl_unittest.cc ('k') | tools/metrics/histograms/histograms.xml » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698