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

Side by Side Diff: net/reporting/reporting_cache.cc

Issue 2847813002: Reporting: Cap number of reports in cache. (Closed)
Patch Set: Tweak a couple of comments. Created 3 years, 7 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 2017 The Chromium Authors. All rights reserved. 1 // Copyright 2017 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 "net/reporting/reporting_cache.h" 5 #include "net/reporting/reporting_cache.h"
6 6
7 #include <map> 7 #include <map>
8 #include <memory> 8 #include <memory>
9 #include <set> 9 #include <set>
10 #include <string> 10 #include <string>
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
54 std::unique_ptr<const base::Value> body, 54 std::unique_ptr<const base::Value> body,
55 base::TimeTicks queued, 55 base::TimeTicks queued,
56 int attempts) { 56 int attempts) {
57 auto report = base::MakeUnique<ReportingReport>( 57 auto report = base::MakeUnique<ReportingReport>(
58 url, group, type, std::move(body), queued, attempts); 58 url, group, type, std::move(body), queued, attempts);
59 59
60 auto inserted = 60 auto inserted =
61 reports_.insert(std::make_pair(report.get(), std::move(report))); 61 reports_.insert(std::make_pair(report.get(), std::move(report)));
62 DCHECK(inserted.second); 62 DCHECK(inserted.second);
63 63
64 if (reports_.size() > context_->policy().max_report_count) {
65 // There should be at most one extra report (the one added above).
66 DCHECK_EQ(context_->policy().max_report_count + 1, reports_.size());
67 const ReportingReport* to_evict = FindReportToEvict();
68 // The newly-added report isn't pending, so even if all other reports are
69 // pending, the cache should have a report to evict.
shivanisha 2017/05/09 13:58:27 dcheck that to_evict is not pending?
Julia Tuttle 2017/05/09 14:37:22 I do that, two lines below. I'll move the comment
70 DCHECK_NE(nullptr, to_evict);
71 DCHECK(!base::ContainsKey(pending_reports_, to_evict));
72 size_t erased = reports_.erase(to_evict);
73 DCHECK_EQ(1u, erased);
shivanisha 2017/05/09 13:58:27 May be call RemoveReports instead of lines 71 to 7
Julia Tuttle 2017/05/09 14:37:22 Don't wanna check pending_reports_ and call OnCach
74 }
75
64 context_->NotifyCacheUpdated(); 76 context_->NotifyCacheUpdated();
65 } 77 }
66 78
67 void ReportingCache::GetReports( 79 void ReportingCache::GetReports(
68 std::vector<const ReportingReport*>* reports_out) const { 80 std::vector<const ReportingReport*>* reports_out) const {
69 reports_out->clear(); 81 reports_out->clear();
70 for (const auto& it : reports_) { 82 for (const auto& it : reports_) {
71 if (!base::ContainsKey(doomed_reports_, it.first)) 83 if (!base::ContainsKey(doomed_reports_, it.first))
72 reports_out->push_back(it.second.get()); 84 reports_out->push_back(it.second.get());
73 } 85 }
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after
226 context_->NotifyCacheUpdated(); 238 context_->NotifyCacheUpdated();
227 } 239 }
228 240
229 void ReportingCache::RemoveAllClients() { 241 void ReportingCache::RemoveAllClients() {
230 clients_.clear(); 242 clients_.clear();
231 wildcard_clients_.clear(); 243 wildcard_clients_.clear();
232 244
233 context_->NotifyCacheUpdated(); 245 context_->NotifyCacheUpdated();
234 } 246 }
235 247
248 const ReportingReport* ReportingCache::FindReportToEvict() const {
249 const ReportingReport* earliest_queued = nullptr;
250
251 for (const auto& it : reports_) {
252 const ReportingReport* report = it.first;
253 if (base::ContainsKey(pending_reports_, report))
254 continue;
255 if (!earliest_queued || report->queued < earliest_queued->queued) {
256 earliest_queued = report;
257 }
258 }
259
260 return earliest_queued;
261 }
262
236 void ReportingCache::MaybeAddWildcardClient(const ReportingClient* client) { 263 void ReportingCache::MaybeAddWildcardClient(const ReportingClient* client) {
237 if (client->subdomains != ReportingClient::Subdomains::INCLUDE) 264 if (client->subdomains != ReportingClient::Subdomains::INCLUDE)
238 return; 265 return;
239 266
240 const std::string& domain = client->origin.host(); 267 const std::string& domain = client->origin.host();
241 auto inserted = wildcard_clients_[domain].insert(client); 268 auto inserted = wildcard_clients_[domain].insert(client);
242 DCHECK(inserted.second); 269 DCHECK(inserted.second);
243 } 270 }
244 271
245 void ReportingCache::MaybeRemoveWildcardClient(const ReportingClient* client) { 272 void ReportingCache::MaybeRemoveWildcardClient(const ReportingClient* client) {
(...skipping 16 matching lines...) Expand all
262 return; 289 return;
263 290
264 for (const ReportingClient* client : it->second) { 291 for (const ReportingClient* client : it->second) {
265 DCHECK_EQ(ReportingClient::Subdomains::INCLUDE, client->subdomains); 292 DCHECK_EQ(ReportingClient::Subdomains::INCLUDE, client->subdomains);
266 if (client->group == group) 293 if (client->group == group)
267 clients_out->push_back(client); 294 clients_out->push_back(client);
268 } 295 }
269 } 296 }
270 297
271 } // namespace net 298 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698