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

Side by Side Diff: components/domain_reliability/monitor.cc

Issue 491753003: Domain Reliability: Don't upload when metrics reporting is off. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Make sure constructor and destructor are on correct threads. Created 6 years, 4 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 | Annotate | Revision Log
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 "components/domain_reliability/monitor.h" 5 #include "components/domain_reliability/monitor.h"
6 6
7 #include "base/command_line.h" 7 #include "base/command_line.h"
8 #include "base/logging.h" 8 #include "base/logging.h"
9 #include "base/message_loop/message_loop.h"
10 #include "base/single_thread_task_runner.h" 9 #include "base/single_thread_task_runner.h"
11 #include "base/task_runner.h" 10 #include "base/task_runner.h"
12 #include "base/threading/thread_checker.h"
13 #include "base/time/time.h" 11 #include "base/time/time.h"
14 #include "components/domain_reliability/baked_in_configs.h" 12 #include "components/domain_reliability/baked_in_configs.h"
15 #include "net/base/load_flags.h" 13 #include "net/base/load_flags.h"
16 #include "net/http/http_response_headers.h" 14 #include "net/http/http_response_headers.h"
17 #include "net/url_request/url_request.h" 15 #include "net/url_request/url_request.h"
18 #include "net/url_request/url_request_context.h" 16 #include "net/url_request/url_request_context.h"
19 #include "net/url_request/url_request_context_getter.h" 17 #include "net/url_request/url_request_context_getter.h"
20 18
21 namespace domain_reliability { 19 namespace domain_reliability {
22 20
23 DomainReliabilityMonitor::DomainReliabilityMonitor( 21 DomainReliabilityMonitor::DomainReliabilityMonitor(
24 const std::string& upload_reporter_string) 22 const std::string& upload_reporter_string,
23 scoped_refptr<base::SingleThreadTaskRunner> pref_thread,
24 scoped_refptr<base::SingleThreadTaskRunner> network_thread,
25 PrefService* local_state_pref_service,
26 const char* reporting_pref_name)
25 : time_(new ActualTime()), 27 : time_(new ActualTime()),
26 upload_reporter_string_(upload_reporter_string), 28 upload_reporter_string_(upload_reporter_string),
27 scheduler_params_( 29 scheduler_params_(
28 DomainReliabilityScheduler::Params::GetFromFieldTrialsOrDefaults()), 30 DomainReliabilityScheduler::Params::GetFromFieldTrialsOrDefaults()),
29 dispatcher_(time_.get()), 31 dispatcher_(time_.get()),
30 weak_factory_(this) {} 32 pref_task_runner_(pref_thread),
33 network_task_runner_(network_thread),
34 moved_to_network_thread_(false),
35 weak_factory_(this) {
36 DCHECK(OnPrefThread());
37 InitReportingPref(local_state_pref_service, reporting_pref_name);
38 }
31 39
32 DomainReliabilityMonitor::DomainReliabilityMonitor( 40 DomainReliabilityMonitor::DomainReliabilityMonitor(
33 const std::string& upload_reporter_string, 41 const std::string& upload_reporter_string,
42 scoped_refptr<base::SingleThreadTaskRunner> pref_thread,
43 scoped_refptr<base::SingleThreadTaskRunner> network_thread,
44 PrefService* local_state_pref_service,
45 const char* reporting_pref_name,
34 scoped_ptr<MockableTime> time) 46 scoped_ptr<MockableTime> time)
35 : time_(time.Pass()), 47 : time_(time.Pass()),
36 upload_reporter_string_(upload_reporter_string), 48 upload_reporter_string_(upload_reporter_string),
37 scheduler_params_( 49 scheduler_params_(
38 DomainReliabilityScheduler::Params::GetFromFieldTrialsOrDefaults()), 50 DomainReliabilityScheduler::Params::GetFromFieldTrialsOrDefaults()),
39 dispatcher_(time_.get()), 51 dispatcher_(time_.get()),
40 weak_factory_(this) {} 52 pref_task_runner_(pref_thread),
53 network_task_runner_(network_thread),
54 moved_to_network_thread_(false),
55 weak_factory_(this) {
56 DCHECK(OnPrefThread());
57 InitReportingPref(local_state_pref_service, reporting_pref_name);
58 }
41 59
42 DomainReliabilityMonitor::~DomainReliabilityMonitor() { 60 DomainReliabilityMonitor::~DomainReliabilityMonitor() {
61 if (moved_to_network_thread_)
62 DCHECK(OnNetworkThread());
63 else
64 DCHECK(OnPrefThread());
65
43 ClearContexts(); 66 ClearContexts();
44 } 67 }
45 68
46 void DomainReliabilityMonitor::Init( 69 void DomainReliabilityMonitor::MoveToNetworkThread() {
47 net::URLRequestContext* url_request_context, 70 DCHECK(OnPrefThread());
48 const scoped_refptr<base::SingleThreadTaskRunner>& task_runner) { 71 DCHECK(!moved_to_network_thread_);
49 DCHECK(!thread_checker_); 72
73 reporting_pref_.MoveToThread(network_task_runner_);
74 moved_to_network_thread_ = true;
75 }
76
77 void DomainReliabilityMonitor::DestroyReportingPref() {
78 DCHECK(OnPrefThread());
79
80 reporting_pref_.Destroy();
81 }
82
83 void DomainReliabilityMonitor::InitURLRequestContext(
84 net::URLRequestContext* url_request_context) {
85 DCHECK(OnNetworkThread());
86 DCHECK(moved_to_network_thread_);
50 87
51 scoped_refptr<net::URLRequestContextGetter> url_request_context_getter = 88 scoped_refptr<net::URLRequestContextGetter> url_request_context_getter =
52 new net::TrivialURLRequestContextGetter(url_request_context, 89 new net::TrivialURLRequestContextGetter(url_request_context,
53 task_runner); 90 network_task_runner_);
54 Init(url_request_context_getter); 91 InitURLRequestContext(url_request_context_getter);
55 } 92 }
56 93
57 void DomainReliabilityMonitor::Init( 94 void DomainReliabilityMonitor::InitURLRequestContext(
58 scoped_refptr<net::URLRequestContextGetter> url_request_context_getter) { 95 scoped_refptr<net::URLRequestContextGetter> url_request_context_getter) {
59 DCHECK(!thread_checker_); 96 DCHECK(OnNetworkThread());
97 DCHECK(moved_to_network_thread_);
60 98
99 // Make sure the URLRequestContext actually lives on what was declared to be
100 // the network thread.
61 DCHECK(url_request_context_getter->GetNetworkTaskRunner()-> 101 DCHECK(url_request_context_getter->GetNetworkTaskRunner()->
62 RunsTasksOnCurrentThread()); 102 RunsTasksOnCurrentThread());
63 103
64 uploader_ = DomainReliabilityUploader::Create(url_request_context_getter); 104 uploader_ = DomainReliabilityUploader::Create(url_request_context_getter);
65 thread_checker_.reset(new base::ThreadChecker()); 105 // Make sure the uploader is sending or discarding uploads according to pref.
106 OnReportingPrefChanged();
66 } 107 }
67 108
68 void DomainReliabilityMonitor::AddBakedInConfigs() { 109 void DomainReliabilityMonitor::AddBakedInConfigs() {
69 DCHECK(thread_checker_ && thread_checker_->CalledOnValidThread()); 110 DCHECK(OnNetworkThread());
111
70 base::Time now = base::Time::Now(); 112 base::Time now = base::Time::Now();
71 for (size_t i = 0; kBakedInJsonConfigs[i]; ++i) { 113 for (size_t i = 0; kBakedInJsonConfigs[i]; ++i) {
72 std::string json(kBakedInJsonConfigs[i]); 114 std::string json(kBakedInJsonConfigs[i]);
73 scoped_ptr<const DomainReliabilityConfig> config = 115 scoped_ptr<const DomainReliabilityConfig> config =
74 DomainReliabilityConfig::FromJSON(json); 116 DomainReliabilityConfig::FromJSON(json);
75 if (config && config->IsExpired(now)) { 117 if (config && config->IsExpired(now)) {
76 LOG(WARNING) << "Baked-in Domain Reliability config for " 118 LOG(WARNING) << "Baked-in Domain Reliability config for "
77 << config->domain << " is expired."; 119 << config->domain << " is expired.";
78 continue; 120 continue;
79 } 121 }
80 AddContext(config.Pass()); 122 AddContext(config.Pass());
81 } 123 }
82 } 124 }
83 125
84 void DomainReliabilityMonitor::OnBeforeRedirect(net::URLRequest* request) { 126 void DomainReliabilityMonitor::OnBeforeRedirect(net::URLRequest* request) {
85 DCHECK(thread_checker_ && thread_checker_->CalledOnValidThread()); 127 DCHECK(OnNetworkThread());
128
86 // Record the redirect itself in addition to the final request. 129 // Record the redirect itself in addition to the final request.
87 OnRequestLegComplete(RequestInfo(*request)); 130 OnRequestLegComplete(RequestInfo(*request));
88 } 131 }
89 132
90 void DomainReliabilityMonitor::OnCompleted(net::URLRequest* request, 133 void DomainReliabilityMonitor::OnCompleted(net::URLRequest* request,
91 bool started) { 134 bool started) {
92 DCHECK(thread_checker_ && thread_checker_->CalledOnValidThread()); 135 DCHECK(OnNetworkThread());
136
93 if (!started) 137 if (!started)
94 return; 138 return;
95 RequestInfo request_info(*request); 139 RequestInfo request_info(*request);
96 if (request_info.AccessedNetwork()) { 140 if (request_info.AccessedNetwork()) {
97 OnRequestLegComplete(request_info); 141 OnRequestLegComplete(request_info);
98 // A request was just using the network, so now is a good time to run any 142 // A request was just using the network, so now is a good time to run any
99 // pending and eligible uploads. 143 // pending and eligible uploads.
100 dispatcher_.RunEligibleTasks(); 144 dispatcher_.RunEligibleTasks();
101 } 145 }
102 } 146 }
103 147
104 void DomainReliabilityMonitor::ClearBrowsingData( 148 void DomainReliabilityMonitor::ClearBrowsingData(
105 DomainReliabilityClearMode mode) { 149 DomainReliabilityClearMode mode) {
106 DCHECK(thread_checker_ && thread_checker_->CalledOnValidThread()); 150 DCHECK(OnNetworkThread());
107 151
108 switch (mode) { 152 switch (mode) {
109 case CLEAR_BEACONS: { 153 case CLEAR_BEACONS: {
110 ContextMap::const_iterator it; 154 ContextMap::const_iterator it;
111 for (it = contexts_.begin(); it != contexts_.end(); ++it) 155 for (it = contexts_.begin(); it != contexts_.end(); ++it)
112 it->second->ClearBeacons(); 156 it->second->ClearBeacons();
113 break; 157 break;
114 }; 158 };
115 case CLEAR_CONTEXTS: 159 case CLEAR_CONTEXTS:
116 ClearContexts(); 160 ClearContexts();
117 break; 161 break;
118 case MAX_CLEAR_MODE: 162 case MAX_CLEAR_MODE:
119 NOTREACHED(); 163 NOTREACHED();
120 } 164 }
121 } 165 }
122 166
123 scoped_ptr<base::Value> DomainReliabilityMonitor::GetWebUIData() const { 167 scoped_ptr<base::Value> DomainReliabilityMonitor::GetWebUIData() const {
168 DCHECK(OnNetworkThread());
169
124 base::ListValue* contexts_value = new base::ListValue(); 170 base::ListValue* contexts_value = new base::ListValue();
125 for (ContextMap::const_iterator it = contexts_.begin(); 171 for (ContextMap::const_iterator it = contexts_.begin();
126 it != contexts_.end(); 172 it != contexts_.end();
127 ++it) { 173 ++it) {
128 contexts_value->Append(it->second->GetWebUIData().release()); 174 contexts_value->Append(it->second->GetWebUIData().release());
129 } 175 }
130 176
131 base::DictionaryValue* data_value = new base::DictionaryValue(); 177 base::DictionaryValue* data_value = new base::DictionaryValue();
132 data_value->Set("contexts", contexts_value); 178 data_value->Set("contexts", contexts_value);
133 179
134 return scoped_ptr<base::Value>(data_value); 180 return scoped_ptr<base::Value>(data_value);
135 } 181 }
136 182
137 DomainReliabilityContext* DomainReliabilityMonitor::AddContextForTesting( 183 DomainReliabilityContext* DomainReliabilityMonitor::AddContextForTesting(
138 scoped_ptr<const DomainReliabilityConfig> config) { 184 scoped_ptr<const DomainReliabilityConfig> config) {
139 DCHECK(thread_checker_ && thread_checker_->CalledOnValidThread()); 185 DCHECK(OnNetworkThread());
186
140 return AddContext(config.Pass()); 187 return AddContext(config.Pass());
141 } 188 }
142 189
143 DomainReliabilityMonitor::RequestInfo::RequestInfo() {} 190 DomainReliabilityMonitor::RequestInfo::RequestInfo() {}
144 191
145 DomainReliabilityMonitor::RequestInfo::RequestInfo( 192 DomainReliabilityMonitor::RequestInfo::RequestInfo(
146 const net::URLRequest& request) 193 const net::URLRequest& request)
147 : url(request.url()), 194 : url(request.url()),
148 status(request.status()), 195 status(request.status()),
149 response_info(request.response_info()), 196 response_info(request.response_info()),
150 load_flags(request.load_flags()), 197 load_flags(request.load_flags()),
151 is_upload(DomainReliabilityUploader::URLRequestIsUpload(request)) { 198 is_upload(DomainReliabilityUploader::URLRequestIsUpload(request)) {
152 request.GetLoadTimingInfo(&load_timing_info); 199 request.GetLoadTimingInfo(&load_timing_info);
153 } 200 }
154 201
155 DomainReliabilityMonitor::RequestInfo::~RequestInfo() {} 202 DomainReliabilityMonitor::RequestInfo::~RequestInfo() {}
156 203
157 bool DomainReliabilityMonitor::RequestInfo::AccessedNetwork() const { 204 bool DomainReliabilityMonitor::RequestInfo::AccessedNetwork() const {
158 return status.status() != net::URLRequestStatus::CANCELED && 205 return status.status() != net::URLRequestStatus::CANCELED &&
159 response_info.network_accessed; 206 response_info.network_accessed;
160 } 207 }
161 208
162 DomainReliabilityContext* DomainReliabilityMonitor::AddContext( 209 DomainReliabilityContext* DomainReliabilityMonitor::AddContext(
163 scoped_ptr<const DomainReliabilityConfig> config) { 210 scoped_ptr<const DomainReliabilityConfig> config) {
211 DCHECK(OnNetworkThread());
164 DCHECK(config); 212 DCHECK(config);
165 DCHECK(config->IsValid()); 213 DCHECK(config->IsValid());
166 214
167 // Grab a copy of the domain before transferring ownership of |config|. 215 // Grab a copy of the domain before transferring ownership of |config|.
168 std::string domain = config->domain; 216 std::string domain = config->domain;
169 217
170 DomainReliabilityContext* context = 218 DomainReliabilityContext* context =
171 new DomainReliabilityContext(time_.get(), 219 new DomainReliabilityContext(time_.get(),
172 scheduler_params_, 220 scheduler_params_,
173 upload_reporter_string_, 221 upload_reporter_string_,
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
230 beacon.server_ip.clear(); 278 beacon.server_ip.clear();
231 beacon.protocol = GetDomainReliabilityProtocol( 279 beacon.protocol = GetDomainReliabilityProtocol(
232 request.response_info.connection_info, 280 request.response_info.connection_info,
233 request.response_info.ssl_info.is_valid()); 281 request.response_info.ssl_info.is_valid());
234 beacon.http_response_code = response_code; 282 beacon.http_response_code = response_code;
235 beacon.start_time = request.load_timing_info.request_start; 283 beacon.start_time = request.load_timing_info.request_start;
236 beacon.elapsed = time_->NowTicks() - beacon.start_time; 284 beacon.elapsed = time_->NowTicks() - beacon.start_time;
237 context->OnBeacon(request.url, beacon); 285 context->OnBeacon(request.url, beacon);
238 } 286 }
239 287
288 void DomainReliabilityMonitor::InitReportingPref(
289 PrefService* local_state_pref_service,
290 const char* reporting_pref_name) {
291 reporting_pref_.Init(
292 reporting_pref_name,
293 local_state_pref_service,
294 base::Bind(&DomainReliabilityMonitor::OnReportingPrefChanged,
295 base::Unretained(this)));
296 }
297
298 void DomainReliabilityMonitor::OnReportingPrefChanged() {
299 DCHECK(OnNetworkThread());
300
301 // When metrics reporting is disabled, discard Domain Reliability uploads.
302 if (uploader_)
303 uploader_->set_discard_uploads(!*reporting_pref_);
304 }
305
240 // TODO(ttuttle): Keep a separate wildcard_contexts_ map to avoid having to 306 // TODO(ttuttle): Keep a separate wildcard_contexts_ map to avoid having to
241 // prepend '*.' to domains. 307 // prepend '*.' to domains.
242 DomainReliabilityContext* DomainReliabilityMonitor::GetContextForHost( 308 DomainReliabilityContext* DomainReliabilityMonitor::GetContextForHost(
243 const std::string& host) const { 309 const std::string& host) const {
310 DCHECK(OnNetworkThread());
311
244 ContextMap::const_iterator context_it; 312 ContextMap::const_iterator context_it;
245 313
246 context_it = contexts_.find(host); 314 context_it = contexts_.find(host);
247 if (context_it != contexts_.end()) 315 if (context_it != contexts_.end())
248 return context_it->second; 316 return context_it->second;
249 317
250 std::string host_with_asterisk = "*." + host; 318 std::string host_with_asterisk = "*." + host;
251 context_it = contexts_.find(host_with_asterisk); 319 context_it = contexts_.find(host_with_asterisk);
252 if (context_it != contexts_.end()) 320 if (context_it != contexts_.end())
253 return context_it->second; 321 return context_it->second;
(...skipping 11 matching lines...) Expand all
265 333
266 return NULL; 334 return NULL;
267 } 335 }
268 336
269 base::WeakPtr<DomainReliabilityMonitor> 337 base::WeakPtr<DomainReliabilityMonitor>
270 DomainReliabilityMonitor::MakeWeakPtr() { 338 DomainReliabilityMonitor::MakeWeakPtr() {
271 return weak_factory_.GetWeakPtr(); 339 return weak_factory_.GetWeakPtr();
272 } 340 }
273 341
274 } // namespace domain_reliability 342 } // namespace domain_reliability
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698