Index: components/ntp_snippets/remote/request_throttler.cc |
diff --git a/components/ntp_snippets/remote/request_throttler.cc b/components/ntp_snippets/remote/request_throttler.cc |
index 4777f38156a0108c3866c439c373feed27d99df0..f9a2b5e73880c3600307e6754ca1f7a707c03dc2 100644 |
--- a/components/ntp_snippets/remote/request_throttler.cc |
+++ b/components/ntp_snippets/remote/request_throttler.cc |
@@ -5,6 +5,7 @@ |
#include "components/ntp_snippets/remote/request_throttler.h" |
#include <climits> |
+#include <set> |
#include <vector> |
#include "base/metrics/histogram.h" |
@@ -50,19 +51,39 @@ struct RequestThrottler::RequestTypeInfo { |
// When adding a new type here, extend also the "RequestThrottlerTypes" |
// <histogram_suffixes> in histograms.xml with the |name| string. |
const RequestThrottler::RequestTypeInfo RequestThrottler::kRequestTypeInfo[] = { |
- // RequestCounter::RequestType::CONTENT_SUGGESTION_FETCHER, |
- {"SuggestionFetcher", prefs::kSnippetFetcherRequestCount, |
+ // The following three types share the same prefs. They differ in quota |
+ // values (and UMA histograms). |
+ // RequestCounter::RequestType::CONTENT_SUGGESTION_FETCHER_RARE_NTP_USER, |
+ {"SuggestionFetcherRareNTPUser", prefs::kSnippetFetcherRequestCount, |
prefs::kSnippetFetcherInteractiveRequestCount, |
- prefs::kSnippetFetcherRequestsDay, 50, kUnlimitedQuota}, |
- // RequestCounter::RequestType::CONTENT_SUGGESTION_THUMBNAIL, |
+ prefs::kSnippetFetcherRequestsDay, 5, kUnlimitedQuota}, |
+ // RequestCounter::RequestType::CONTENT_SUGGESTION_FETCHER_ACTIVE_NTP_USER, |
+ {"SuggestionFetcherActiveNTPUser", prefs::kSnippetFetcherRequestCount, |
+ prefs::kSnippetFetcherInteractiveRequestCount, |
+ prefs::kSnippetFetcherRequestsDay, 20, kUnlimitedQuota}, |
+ // RequestCounter::RequestType::CONTENT_SUGGESTION_FETCHER_ACTIVE_SUGGESTIONS_CONSUMER, |
+ {"SuggestionFetcherActiveSuggestionsConsumer", |
+ prefs::kSnippetFetcherRequestCount, |
+ prefs::kSnippetFetcherInteractiveRequestCount, |
+ prefs::kSnippetFetcherRequestsDay, 20, kUnlimitedQuota}, |
+ // RequestCounter::RequestType::CONTENT_SUGGESTION_THUMBNAIL, |
{"SuggestionThumbnailFetcher", prefs::kSnippetThumbnailsRequestCount, |
prefs::kSnippetThumbnailsInteractiveRequestCount, |
prefs::kSnippetThumbnailsRequestsDay, kUnlimitedQuota, kUnlimitedQuota}}; |
RequestThrottler::RequestThrottler(PrefService* pref_service, RequestType type) |
: pref_service_(pref_service), |
- type_info_(kRequestTypeInfo[static_cast<int>(type)]) { |
+ type_info_(nullptr) { |
DCHECK(pref_service); |
+ ChangeRequestType(type); |
+} |
+ |
+void RequestThrottler::ChangeRequestType(RequestType new_type) { |
+ // Do the changes only if the new type differs from the previous one. |
+ if (type_info_ == &kRequestTypeInfo[static_cast<int>(new_type)]) |
+ return; |
+ |
+ type_info_ = &kRequestTypeInfo[static_cast<int>(new_type)]; |
std::string quota = variations::GetVariationParamValue( |
ntp_snippets::kStudyName, |
@@ -71,7 +92,7 @@ RequestThrottler::RequestThrottler(PrefService* pref_service, RequestType type) |
LOG_IF(WARNING, !quota.empty()) |
<< "Invalid variation parameter for quota for " |
<< GetRequestTypeName(); |
- quota_ = type_info_.default_quota; |
+ quota_ = type_info_->default_quota; |
} |
std::string interactive_quota = variations::GetVariationParamValue( |
@@ -81,7 +102,7 @@ RequestThrottler::RequestThrottler(PrefService* pref_service, RequestType type) |
LOG_IF(WARNING, !interactive_quota.empty()) |
<< "Invalid variation parameter for interactive quota for " |
<< GetRequestTypeName(); |
- interactive_quota_ = type_info_.default_interactive_quota; |
+ interactive_quota_ = type_info_->default_interactive_quota; |
} |
// Since the histogram names are dynamic, we cannot use the standard macros |
@@ -107,10 +128,18 @@ RequestThrottler::RequestThrottler(PrefService* pref_service, RequestType type) |
// static |
void RequestThrottler::RegisterProfilePrefs(PrefRegistrySimple* registry) { |
+ std::set<std::string> registered; |
for (const RequestTypeInfo& info : kRequestTypeInfo) { |
+ // Make sure we do not register the same prefs twice. Assuming that if any |
+ // types share some prefs, they share all the prefs. Thus, checking, e.g., |
+ // day_pref is enough. |
+ if (registered.count(info.day_pref) > 0) |
+ continue; |
+ |
+ registered.insert(info.day_pref); |
+ registry->RegisterIntegerPref(info.day_pref, 0); |
registry->RegisterIntegerPref(info.count_pref, 0); |
registry->RegisterIntegerPref(info.interactive_count_pref, 0); |
- registry->RegisterIntegerPref(info.day_pref, 0); |
} |
} |
@@ -152,7 +181,7 @@ void RequestThrottler::ResetCounterIfDayChanged() { |
} |
const char* RequestThrottler::GetRequestTypeName() const { |
- return type_info_.name; |
+ return type_info_->name; |
} |
// TODO(jkrcal): turn RequestTypeInfo into a proper class, move those methods |
@@ -163,27 +192,27 @@ int RequestThrottler::GetQuota(bool interactive_request) const { |
int RequestThrottler::GetCount(bool interactive_request) const { |
return pref_service_->GetInteger(interactive_request |
- ? type_info_.interactive_count_pref |
- : type_info_.count_pref); |
+ ? type_info_->interactive_count_pref |
+ : type_info_->count_pref); |
} |
void RequestThrottler::SetCount(bool interactive_request, int count) { |
pref_service_->SetInteger(interactive_request |
- ? type_info_.interactive_count_pref |
- : type_info_.count_pref, |
+ ? type_info_->interactive_count_pref |
+ : type_info_->count_pref, |
count); |
} |
int RequestThrottler::GetDay() const { |
- return pref_service_->GetInteger(type_info_.day_pref); |
+ return pref_service_->GetInteger(type_info_->day_pref); |
} |
void RequestThrottler::SetDay(int day) { |
- pref_service_->SetInteger(type_info_.day_pref, day); |
+ pref_service_->SetInteger(type_info_->day_pref, day); |
} |
bool RequestThrottler::HasDay() const { |
- return pref_service_->HasPrefPath(type_info_.day_pref); |
+ return pref_service_->HasPrefPath(type_info_->day_pref); |
} |
} // namespace ntp_snippets |