Chromium Code Reviews| Index: components/ntp_snippets/request_throttler.cc |
| diff --git a/components/ntp_snippets/request_throttler.cc b/components/ntp_snippets/request_throttler.cc |
| index 0a6388169265ec3fba373d7546b2143bde812b67..1b29b76864df9581f95423fceae82a5112f8d922 100644 |
| --- a/components/ntp_snippets/request_throttler.cc |
| +++ b/components/ntp_snippets/request_throttler.cc |
| @@ -4,6 +4,7 @@ |
| #include "components/ntp_snippets/request_throttler.h" |
| +#include <limits.h> |
| #include <vector> |
| #include "base/metrics/histogram.h" |
| @@ -25,27 +26,37 @@ namespace { |
| // histogram, so do not change existing values. Insert new values at the end, |
| // and update the histogram definition. |
| enum class RequestStatus { |
| - FORCED, |
| - QUOTA_GRANTED, |
| - QUOTA_EXCEEDED, |
| + INTERACTIVE_QUOTA_GRANTED, |
| + BACKGROUND_QUOTA_GRANTED, |
| + BACKGROUND_QUOTA_EXCEEDED, |
| + INTERACTIVE_QUOTA_EXCEEDED, |
| REQUEST_STATUS_COUNT |
| }; |
| +// Quota value to use if no quota should be applied (by default). |
| +const int kUnlimitedQuota = INT_MAX; |
| + |
| } // namespace |
| struct RequestThrottler::RequestTypeInfo { |
| const char* name; |
| const char* count_pref; |
| + const char* interactive_count_pref; |
| const char* day_pref; |
| const int default_quota; |
| + const int default_interactive_quota; |
| }; |
| // When adding a new type here, extend also the "RequestCounterTypes" |
|
gayane -on leave until 09-2017
2016/08/10 18:47:54
Cannot find "RequestCounterTypes" in histograms.xm
jkrcal
2016/08/11 08:06:28
Done.
|
| // <histogram_suffixes> in histograms.xml with the |name| string. |
| const RequestThrottler::RequestTypeInfo RequestThrottler::kRequestTypeInfo[] = { |
| // RequestCounter::RequestType::CONTENT_SUGGESTION_FETCHER, |
| - {"SuggestionFetcher", prefs::kSnippetFetcherQuotaCount, |
| - prefs::kSnippetFetcherQuotaDay, 50}}; |
| + {"SuggestionFetcher", prefs::kSnippetFetcherRequestCount, |
| + prefs::kSnippetFetcherInteractiveRequestCount, |
| + prefs::kSnippetFetcherRequestsDay, 50, kUnlimitedQuota}, |
| + {"SuggestionThumbnailFetcher", prefs::kSnippetThumbnailsRequestCount, |
|
gayane -on leave until 09-2017
2016/08/10 18:47:54
should be added to <histogram_suffixes> ?
jkrcal
2016/08/11 08:06:28
Oh, thanks! Done.
|
| + prefs::kSnippetThumbnailsInteractiveRequestCount, |
| + prefs::kSnippetThumbnailsRequestsDay, kUnlimitedQuota, kUnlimitedQuota}}; |
| RequestThrottler::RequestThrottler(PrefService* pref_service, RequestType type) |
| : pref_service_(pref_service), |
| @@ -62,6 +73,16 @@ RequestThrottler::RequestThrottler(PrefService* pref_service, RequestType type) |
| quota_ = type_info_.default_quota; |
| } |
| + std::string interactive_quota = variations::GetVariationParamValue( |
| + ntp_snippets::kStudyName, |
| + base::StringPrintf("interactive_quota_%s", GetRequestTypeAsString())); |
| + if (!base::StringToInt(interactive_quota, &interactive_quota_)) { |
| + LOG_IF(WARNING, !interactive_quota.empty()) |
| + << "Invalid variation parameter for interactive quota for " |
| + << GetRequestTypeAsString(); |
| + interactive_quota_ = type_info_.default_interactive_quota; |
| + } |
| + |
| // Since the histogram names are dynamic, we cannot use the standard macros |
| // and we need to lookup the histograms, instead. |
| int status_count = static_cast<int>(RequestStatus::REQUEST_STATUS_COUNT); |
| @@ -82,25 +103,27 @@ RequestThrottler::RequestThrottler(PrefService* pref_service, RequestType type) |
| void RequestThrottler::RegisterProfilePrefs(PrefRegistrySimple* registry) { |
| for (const RequestTypeInfo& info : kRequestTypeInfo) { |
| registry->RegisterIntegerPref(info.count_pref, 0); |
| + registry->RegisterIntegerPref(info.interactive_count_pref, 0); |
| registry->RegisterIntegerPref(info.day_pref, 0); |
| } |
| } |
| -bool RequestThrottler::DemandQuotaForRequest(bool forced_request) { |
| +bool RequestThrottler::DemandQuotaForRequest(bool interactive_request) { |
| ResetCounterIfDayChanged(); |
| - if (forced_request) { |
| - histogram_request_status_->Add(static_cast<int>(RequestStatus::FORCED)); |
| - return true; |
| + int new_count = GetCount(interactive_request) + 1; |
| + SetCount(interactive_request, new_count); |
| + bool available = (new_count <= GetQuota(interactive_request)); |
| + |
| + if (interactive_request) { |
| + histogram_request_status_->Add(static_cast<int>( |
| + available ? RequestStatus::INTERACTIVE_QUOTA_GRANTED |
| + : RequestStatus::INTERACTIVE_QUOTA_EXCEEDED)); |
| + } else { |
| + histogram_request_status_->Add( |
| + static_cast<int>(available ? RequestStatus::BACKGROUND_QUOTA_GRANTED |
| + : RequestStatus::BACKGROUND_QUOTA_EXCEEDED)); |
| } |
| - |
| - int new_count = GetCount() + 1; |
| - SetCount(new_count); |
| - bool available = (new_count <= quota_); |
| - |
| - histogram_request_status_->Add( |
| - static_cast<int>(available ? RequestStatus::QUOTA_GRANTED |
| - : RequestStatus::QUOTA_EXCEEDED)); |
| return available; |
| } |
| @@ -112,10 +135,12 @@ void RequestThrottler::ResetCounterIfDayChanged() { |
| // The counter is used for the first time in this profile. |
| SetDay(now_day); |
| } else if (now_day != GetDay()) { |
| - // Day has changed - report the number of requests from the previous day. |
| - histogram_per_day_->Add(GetCount()); |
| + // Day has changed - report the number of background requests from the |
| + // previous day. |
| + histogram_per_day_->Add(GetCount(/*interactive_request=*/false)); |
| // Reset the counter. |
| - SetCount(0); |
| + SetCount(/*interactive_request=*/false, 0); |
| + SetCount(/*interactive_request=*/true, 0); |
| SetDay(now_day); |
| } |
| } |
| @@ -124,12 +149,21 @@ const char* RequestThrottler::GetRequestTypeAsString() const { |
| return type_info_.name; |
| } |
| -int RequestThrottler::GetCount() const { |
| - return pref_service_->GetInteger(type_info_.count_pref); |
| +int RequestThrottler::GetQuota(bool interactive_request) const { |
| + return interactive_request ? interactive_quota_ : quota_; |
| +} |
| + |
| +int RequestThrottler::GetCount(bool interactive_request) const { |
| + return pref_service_->GetInteger(interactive_request |
| + ? type_info_.interactive_count_pref |
| + : type_info_.count_pref); |
| } |
| -void RequestThrottler::SetCount(int count) { |
| - pref_service_->SetInteger(type_info_.count_pref, count); |
| +void RequestThrottler::SetCount(bool interactive_request, int count) { |
| + pref_service_->SetInteger(interactive_request |
| + ? type_info_.interactive_count_pref |
| + : type_info_.count_pref, |
| + count); |
| } |
| int RequestThrottler::GetDay() const { |