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

Side by Side Diff: components/gcm_driver/crypto/gcm_key_store.cc

Issue 1707513002: Add various UMA histograms for measuring GCM crypto performance (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@gcm-remove-info
Patch Set: Created 4 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 unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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 "components/gcm_driver/crypto/gcm_key_store.h" 5 #include "components/gcm_driver/crypto/gcm_key_store.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <utility> 9 #include <utility>
10 10
11 #include "base/logging.h" 11 #include "base/logging.h"
12 #include "base/metrics/histogram_macros.h"
12 #include "components/gcm_driver/crypto/p256_key_util.h" 13 #include "components/gcm_driver/crypto/p256_key_util.h"
13 #include "components/leveldb_proto/proto_database_impl.h" 14 #include "components/leveldb_proto/proto_database_impl.h"
14 #include "crypto/random.h" 15 #include "crypto/random.h"
15 16
16 namespace gcm { 17 namespace gcm {
17 18
18 // Statistics are logged to UMA with this string as part of histogram name. They 19 // Statistics are logged to UMA with this string as part of histogram name. They
19 // can all be found under LevelDB.*.GCMKeyStore. Changing this needs to 20 // can all be found under LevelDB.*.GCMKeyStore. Changing this needs to
20 // synchronize with histograms.xml, AND will also become incompatible with older 21 // synchronize with histograms.xml, AND will also become incompatible with older
21 // browsers still reporting the previous values. 22 // browsers still reporting the previous values.
(...skipping 25 matching lines...) Expand all
47 void GCMKeyStore::GetKeys(const std::string& app_id, 48 void GCMKeyStore::GetKeys(const std::string& app_id,
48 const KeysCallback& callback) { 49 const KeysCallback& callback) {
49 LazyInitialize(base::Bind(&GCMKeyStore::GetKeysAfterInitialize, 50 LazyInitialize(base::Bind(&GCMKeyStore::GetKeysAfterInitialize,
50 weak_factory_.GetWeakPtr(), app_id, callback)); 51 weak_factory_.GetWeakPtr(), app_id, callback));
51 } 52 }
52 53
53 void GCMKeyStore::GetKeysAfterInitialize(const std::string& app_id, 54 void GCMKeyStore::GetKeysAfterInitialize(const std::string& app_id,
54 const KeysCallback& callback) { 55 const KeysCallback& callback) {
55 DCHECK(state_ == State::INITIALIZED || state_ == State::FAILED); 56 DCHECK(state_ == State::INITIALIZED || state_ == State::FAILED);
56 const auto& iter = key_pairs_.find(app_id); 57 const auto& iter = key_pairs_.find(app_id);
57 if (iter == key_pairs_.end() || state_ != State::INITIALIZED) { 58
59 const bool success = state_ == State::INITIALIZED && iter != key_pairs_.end();
60 UMA_HISTOGRAM_BOOLEAN("GCM.Crypto.GetKeySuccessRate", success);
61
62 if (!success) {
58 callback.Run(KeyPair(), std::string() /* auth_secret */); 63 callback.Run(KeyPair(), std::string() /* auth_secret */);
59 return; 64 return;
60 } 65 }
61 66
62 const auto& auth_secret_iter = auth_secrets_.find(app_id); 67 const auto& auth_secret_iter = auth_secrets_.find(app_id);
63 DCHECK(auth_secret_iter != auth_secrets_.end()); 68 DCHECK(auth_secret_iter != auth_secrets_.end());
64 69
65 callback.Run(iter->second, auth_secret_iter->second); 70 callback.Run(iter->second, auth_secret_iter->second);
66 } 71 }
67 72
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
121 std::move(entries_to_save), std::move(keys_to_remove), 126 std::move(entries_to_save), std::move(keys_to_remove),
122 base::Bind(&GCMKeyStore::DidStoreKeys, weak_factory_.GetWeakPtr(), app_id, 127 base::Bind(&GCMKeyStore::DidStoreKeys, weak_factory_.GetWeakPtr(), app_id,
123 *pair, auth_secret, callback)); 128 *pair, auth_secret, callback));
124 } 129 }
125 130
126 void GCMKeyStore::DidStoreKeys(const std::string& app_id, 131 void GCMKeyStore::DidStoreKeys(const std::string& app_id,
127 const KeyPair& pair, 132 const KeyPair& pair,
128 const std::string& auth_secret, 133 const std::string& auth_secret,
129 const KeysCallback& callback, 134 const KeysCallback& callback,
130 bool success) { 135 bool success) {
136 UMA_HISTOGRAM_BOOLEAN("GCM.Crypto.CreateKeySuccessRate", success);
131 DCHECK_EQ(0u, key_pairs_.count(app_id)); 137 DCHECK_EQ(0u, key_pairs_.count(app_id));
132 138
133 if (!success) { 139 if (!success) {
134 DVLOG(1) << "Unable to store the created key in the GCM Key Store."; 140 DVLOG(1) << "Unable to store the created key in the GCM Key Store.";
135 callback.Run(KeyPair(), std::string() /* auth_secret */); 141 callback.Run(KeyPair(), std::string() /* auth_secret */);
136 return; 142 return;
137 } 143 }
138 144
139 key_pairs_[app_id] = pair; 145 key_pairs_[app_id] = pair;
140 auth_secrets_[app_id] = auth_secret; 146 auth_secrets_[app_id] = auth_secret;
(...skipping 25 matching lines...) Expand all
166 172
167 database_->UpdateEntries( 173 database_->UpdateEntries(
168 std::move(entries_to_save), std::move(keys_to_remove), 174 std::move(entries_to_save), std::move(keys_to_remove),
169 base::Bind(&GCMKeyStore::DidRemoveKeys, weak_factory_.GetWeakPtr(), 175 base::Bind(&GCMKeyStore::DidRemoveKeys, weak_factory_.GetWeakPtr(),
170 app_id, callback)); 176 app_id, callback));
171 } 177 }
172 178
173 void GCMKeyStore::DidRemoveKeys(const std::string& app_id, 179 void GCMKeyStore::DidRemoveKeys(const std::string& app_id,
174 const base::Closure& callback, 180 const base::Closure& callback,
175 bool success) { 181 bool success) {
176 // TODO(peter): Add a histogram for tracking |success|. 182 UMA_HISTOGRAM_BOOLEAN("GCM.Crypto.RemoveKeySuccessRate", success);
177 183
178 if (success) { 184 if (success) {
179 key_pairs_.erase(app_id); 185 key_pairs_.erase(app_id);
180 auth_secrets_.erase(app_id); 186 auth_secrets_.erase(app_id);
181 } else { 187 } else {
182 DVLOG(1) << "Unable to delete a key from the GCM Key Store."; 188 DVLOG(1) << "Unable to delete a key from the GCM Key Store.";
183 } 189 }
184 190
185 callback.Run(); 191 callback.Run();
186 } 192 }
(...skipping 12 matching lines...) Expand all
199 205
200 database_.reset(new leveldb_proto::ProtoDatabaseImpl<EncryptionData>( 206 database_.reset(new leveldb_proto::ProtoDatabaseImpl<EncryptionData>(
201 blocking_task_runner_)); 207 blocking_task_runner_));
202 208
203 database_->Init( 209 database_->Init(
204 kDatabaseUMAClientName, key_store_path_, 210 kDatabaseUMAClientName, key_store_path_,
205 base::Bind(&GCMKeyStore::DidInitialize, weak_factory_.GetWeakPtr())); 211 base::Bind(&GCMKeyStore::DidInitialize, weak_factory_.GetWeakPtr()));
206 } 212 }
207 213
208 void GCMKeyStore::DidInitialize(bool success) { 214 void GCMKeyStore::DidInitialize(bool success) {
215 UMA_HISTOGRAM_BOOLEAN("GCM.Crypto.InitKeyStoreSuccessRate", success);
209 if (!success) { 216 if (!success) {
210 DVLOG(1) << "Unable to initialize the GCM Key Store."; 217 DVLOG(1) << "Unable to initialize the GCM Key Store.";
211 state_ = State::FAILED; 218 state_ = State::FAILED;
212 219
213 delayed_task_controller_.SetReady(); 220 delayed_task_controller_.SetReady();
214 return; 221 return;
215 } 222 }
216 223
217 database_->LoadEntries( 224 database_->LoadEntries(
218 base::Bind(&GCMKeyStore::DidLoadKeys, weak_factory_.GetWeakPtr())); 225 base::Bind(&GCMKeyStore::DidLoadKeys, weak_factory_.GetWeakPtr()));
219 } 226 }
220 227
221 void GCMKeyStore::DidLoadKeys(bool success, 228 void GCMKeyStore::DidLoadKeys(bool success,
222 scoped_ptr<std::vector<EncryptionData>> entries) { 229 scoped_ptr<std::vector<EncryptionData>> entries) {
230 UMA_HISTOGRAM_BOOLEAN("GCM.Crypto.LoadKeyStoreSuccessRate", success);
223 if (!success) { 231 if (!success) {
224 DVLOG(1) << "Unable to load entries into the GCM Key Store."; 232 DVLOG(1) << "Unable to load entries into the GCM Key Store.";
225 state_ = State::FAILED; 233 state_ = State::FAILED;
226 234
227 delayed_task_controller_.SetReady(); 235 delayed_task_controller_.SetReady();
228 return; 236 return;
229 } 237 }
230 238
231 for (const EncryptionData& entry : *entries) { 239 for (const EncryptionData& entry : *entries) {
232 DCHECK_EQ(1, entry.keys_size()); 240 DCHECK_EQ(1, entry.keys_size());
233 241
234 key_pairs_[entry.app_id()] = entry.keys(0); 242 key_pairs_[entry.app_id()] = entry.keys(0);
235 auth_secrets_[entry.app_id()] = entry.auth_secret(); 243 auth_secrets_[entry.app_id()] = entry.auth_secret();
236 } 244 }
237 245
238 state_ = State::INITIALIZED; 246 state_ = State::INITIALIZED;
239 247
240 delayed_task_controller_.SetReady(); 248 delayed_task_controller_.SetReady();
241 } 249 }
242 250
243 } // namespace gcm 251 } // namespace gcm
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698