Commit 1a905fff authored by Ryan Sturm's avatar Ryan Sturm Committed by Commit Bot

Rate limiting search prefetch

The rate limiting is based on the number of attempted prefetches in the
last minute (technically, it is the number of prefetches in the caching
limit that were not served).

Bug: 1138650
Change-Id: I0ed6108a8f065c2fb7acc5a90521d978dca0f830
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2490551Reviewed-by: default avatarRobert Ogden <robertogden@chromium.org>
Commit-Queue: Ryan Sturm <ryansturm@chromium.org>
Cr-Commit-Position: refs/heads/master@{#819894}
parent cda029d2
...@@ -35,3 +35,9 @@ base::TimeDelta SearchPrefetchCachingLimit() { ...@@ -35,3 +35,9 @@ base::TimeDelta SearchPrefetchCachingLimit() {
"prefetch_caching_limit_ms", "prefetch_caching_limit_ms",
60000)); 60000));
} }
size_t SearchPrefetchMaxAttemptsPerCachingDuration() {
return base::GetFieldTrialParamByFeatureAsInt(
kSearchPrefetchServicePrefetching, "max_attempts_per_caching_duration",
2);
}
...@@ -20,4 +20,8 @@ bool SearchPrefetchServicePrefetchingIsEnabled(); ...@@ -20,4 +20,8 @@ bool SearchPrefetchServicePrefetchingIsEnabled();
// The amount of time a response is considered valid after the prefetch starts. // The amount of time a response is considered valid after the prefetch starts.
base::TimeDelta SearchPrefetchCachingLimit(); base::TimeDelta SearchPrefetchCachingLimit();
// The number of prefetches that can be initiated (but not served) within a time
// period as long as |SearchPrefetchCachingLimit()|
size_t SearchPrefetchMaxAttemptsPerCachingDuration();
#endif // CHROME_BROWSER_PREFETCH_SEARCH_PREFETCH_FIELD_TRIAL_SETTINGS_H_ #endif // CHROME_BROWSER_PREFETCH_SEARCH_PREFETCH_FIELD_TRIAL_SETTINGS_H_
...@@ -149,6 +149,9 @@ bool SearchPrefetchService::MaybePrefetchURL(const GURL& url) { ...@@ -149,6 +149,9 @@ bool SearchPrefetchService::MaybePrefetchURL(const GURL& url) {
if (search_terms.size() == 0) if (search_terms.size() == 0)
return false; return false;
if (prefetches_.size() >= SearchPrefetchMaxAttemptsPerCachingDuration())
return false;
// Don't prefetch the same search terms twice within the expiry duration. // Don't prefetch the same search terms twice within the expiry duration.
if (prefetches_.find(search_terms) != prefetches_.end()) { if (prefetches_.find(search_terms) != prefetches_.end()) {
return false; return false;
......
...@@ -293,6 +293,35 @@ IN_PROC_BROWSER_TEST_F(SearchPrefetchServiceEnabledBrowserTest, ...@@ -293,6 +293,35 @@ IN_PROC_BROWSER_TEST_F(SearchPrefetchServiceEnabledBrowserTest,
prefetch_status.value()); prefetch_status.value());
} }
IN_PROC_BROWSER_TEST_F(SearchPrefetchServiceEnabledBrowserTest,
PrefetchRateLimiting) {
auto* search_prefetch_service =
SearchPrefetchServiceFactory::GetForProfile(browser()->profile());
EXPECT_NE(nullptr, search_prefetch_service);
EXPECT_TRUE(search_prefetch_service->MaybePrefetchURL(
GetSearchServerQueryURL("prefetch_1")));
EXPECT_TRUE(search_prefetch_service->MaybePrefetchURL(
GetSearchServerQueryURL("prefetch_2")));
EXPECT_FALSE(search_prefetch_service->MaybePrefetchURL(
GetSearchServerQueryURL("prefetch_3")));
auto prefetch_status =
search_prefetch_service->GetSearchPrefetchStatusForTesting(
base::ASCIIToUTF16("prefetch_1"));
ASSERT_TRUE(prefetch_status.has_value());
EXPECT_EQ(SearchPrefetchStatus::kInFlight, prefetch_status.value());
prefetch_status = search_prefetch_service->GetSearchPrefetchStatusForTesting(
base::ASCIIToUTF16("prefetch_2"));
ASSERT_TRUE(prefetch_status.has_value());
EXPECT_EQ(SearchPrefetchStatus::kInFlight, prefetch_status.value());
prefetch_status = search_prefetch_service->GetSearchPrefetchStatusForTesting(
base::ASCIIToUTF16("prefetch_3"));
EXPECT_FALSE(prefetch_status.has_value());
}
IN_PROC_BROWSER_TEST_F(SearchPrefetchServiceEnabledBrowserTest, IN_PROC_BROWSER_TEST_F(SearchPrefetchServiceEnabledBrowserTest,
502PrefetchFunctionality) { 502PrefetchFunctionality) {
auto* search_prefetch_service = auto* search_prefetch_service =
...@@ -480,3 +509,22 @@ IN_PROC_BROWSER_TEST_F(SearchPrefetchServiceZeroCacheTimeBrowserTest, ...@@ -480,3 +509,22 @@ IN_PROC_BROWSER_TEST_F(SearchPrefetchServiceZeroCacheTimeBrowserTest,
EXPECT_FALSE(prefetch_status.has_value()); EXPECT_FALSE(prefetch_status.has_value());
EXPECT_TRUE(search_prefetch_service->MaybePrefetchURL(prefetch_url)); EXPECT_TRUE(search_prefetch_service->MaybePrefetchURL(prefetch_url));
} }
IN_PROC_BROWSER_TEST_F(SearchPrefetchServiceZeroCacheTimeBrowserTest,
PrefetchRateLimitingClearsAfterRemoval) {
auto* search_prefetch_service =
SearchPrefetchServiceFactory::GetForProfile(browser()->profile());
EXPECT_NE(nullptr, search_prefetch_service);
EXPECT_TRUE(search_prefetch_service->MaybePrefetchURL(
GetSearchServerQueryURL("prefetch_1")));
EXPECT_TRUE(search_prefetch_service->MaybePrefetchURL(
GetSearchServerQueryURL("prefetch_2")));
EXPECT_FALSE(search_prefetch_service->MaybePrefetchURL(
GetSearchServerQueryURL("prefetch_3")));
WaitUntilStatusChanges(base::ASCIIToUTF16("prefetch_1"));
EXPECT_TRUE(search_prefetch_service->MaybePrefetchURL(
GetSearchServerQueryURL("prefetch_4")));
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment