Index: chrome/browser/chrome_browser_main.cc |
=================================================================== |
--- chrome/browser/chrome_browser_main.cc (revision 100345) |
+++ chrome/browser/chrome_browser_main.cc (working copy) |
@@ -51,7 +51,7 @@ |
#include "chrome/browser/net/chrome_dns_cert_provenance_checker.h" |
#include "chrome/browser/net/chrome_dns_cert_provenance_checker_factory.h" |
#include "chrome/browser/net/chrome_net_log.h" |
-#include "chrome/browser/net/predictor_api.h" |
+#include "chrome/browser/net/predictor.h" |
#include "chrome/browser/net/sdch_dictionary_fetcher.h" |
#include "chrome/browser/plugin_prefs.h" |
#include "chrome/browser/policy/browser_policy_connector.h" |
@@ -974,6 +974,88 @@ |
} |
} |
+void ChromeBrowserMainParts::PredictorFieldTrial() { |
+ const base::FieldTrial::Probability kDivisor = 1000; |
+ // For each option (i.e., non-default), we have a fixed probability. |
+ // 0.1% probability. |
+ const base::FieldTrial::Probability kProbabilityPerGroup = 1; |
+ |
+ // After June 30, 2011 builds, it will always be in default group |
+ // (default_enabled_prefetch). |
+ scoped_refptr<base::FieldTrial> trial( |
+ new base::FieldTrial("DnsImpact", kDivisor, |
+ "default_enabled_prefetch", 2011, 10, 30)); |
+ |
+ // First option is to disable prefetching completely. |
+ int disabled_prefetch = trial->AppendGroup("disabled_prefetch", |
+ kProbabilityPerGroup); |
+ |
+ // We're running two experiments at the same time. The first set of trials |
+ // modulates the delay-time until we declare a congestion event (and purge |
+ // our queue). The second modulates the number of concurrent resolutions |
+ // we do at any time. Users are in exactly one trial (or the default) during |
+ // any one run, and hence only one experiment at a time. |
+ // Experiment 1: |
+ // Set congestion detection at 250, 500, or 750ms, rather than the 1 second |
+ // default. |
+ int max_250ms_prefetch = trial->AppendGroup("max_250ms_queue_prefetch", |
+ kProbabilityPerGroup); |
+ int max_500ms_prefetch = trial->AppendGroup("max_500ms_queue_prefetch", |
+ kProbabilityPerGroup); |
+ int max_750ms_prefetch = trial->AppendGroup("max_750ms_queue_prefetch", |
+ kProbabilityPerGroup); |
+ // Set congestion detection at 2 seconds instead of the 1 second default. |
+ int max_2s_prefetch = trial->AppendGroup("max_2s_queue_prefetch", |
+ kProbabilityPerGroup); |
+ // Experiment 2: |
+ // Set max simultaneous resoultions to 2, 4, or 6, and scale the congestion |
+ // limit proportionally (so we don't impact average probability of asserting |
+ // congesion very much). |
+ int max_2_concurrent_prefetch = trial->AppendGroup( |
+ "max_2 concurrent_prefetch", kProbabilityPerGroup); |
+ int max_4_concurrent_prefetch = trial->AppendGroup( |
+ "max_4 concurrent_prefetch", kProbabilityPerGroup); |
+ int max_6_concurrent_prefetch = trial->AppendGroup( |
+ "max_6 concurrent_prefetch", kProbabilityPerGroup); |
+ |
+ if (trial->group() != disabled_prefetch) { |
+ // Initialize the DNS prefetch system. |
+ size_t max_parallel_resolves = |
+ chrome_browser_net::Predictor::kMaxSpeculativeParallelResolves; |
+ int max_queueing_delay_ms = |
+ chrome_browser_net::Predictor::kMaxSpeculativeResolveQueueDelayMs; |
+ |
+ if (trial->group() == max_2_concurrent_prefetch) |
+ max_parallel_resolves = 2; |
+ else if (trial->group() == max_4_concurrent_prefetch) |
+ max_parallel_resolves = 4; |
+ else if (trial->group() == max_6_concurrent_prefetch) |
+ max_parallel_resolves = 6; |
+ chrome_browser_net::Predictor::set_max_parallel_resolves( |
+ max_parallel_resolves); |
+ |
+ if (trial->group() == max_250ms_prefetch) { |
+ max_queueing_delay_ms = |
+ (250 * chrome_browser_net::Predictor::kTypicalSpeculativeGroupSize) / |
+ max_parallel_resolves; |
+ } else if (trial->group() == max_500ms_prefetch) { |
+ max_queueing_delay_ms = |
+ (500 * chrome_browser_net::Predictor::kTypicalSpeculativeGroupSize) / |
+ max_parallel_resolves; |
+ } else if (trial->group() == max_750ms_prefetch) { |
+ max_queueing_delay_ms = |
+ (750 * chrome_browser_net::Predictor::kTypicalSpeculativeGroupSize) / |
+ max_parallel_resolves; |
+ } else if (trial->group() == max_2s_prefetch) { |
+ max_queueing_delay_ms = |
+ (2000 * chrome_browser_net::Predictor::kTypicalSpeculativeGroupSize) / |
+ max_parallel_resolves; |
+ } |
+ chrome_browser_net::Predictor::set_max_queueing_delay( |
+ max_queueing_delay_ms); |
+ } |
+} |
+ |
// Test the impact on subsequent Google searches of getting suggestions from |
// www.google.TLD instead of clients1.google.TLD. |
void ChromeBrowserMainParts::SuggestPrefixFieldTrial() { |
@@ -1045,6 +1127,7 @@ |
ConnectBackupJobsFieldTrial(); |
SuggestPrefixFieldTrial(); |
WarmConnectionFieldTrial(); |
+ PredictorFieldTrial(); |
} |
// ----------------------------------------------------------------------------- |
@@ -1549,20 +1632,6 @@ |
RegisterApplicationRestart(parsed_command_line()); |
#endif // OS_WIN |
- // Initialize and maintain network predictor module, which handles DNS |
- // pre-resolution, as well as TCP/IP connection pre-warming. |
- // This also registers an observer to discard data when closing incognito |
- // mode. |
- bool preconnect_enabled = true; // Default status (easy to change!). |
- if (parsed_command_line().HasSwitch(switches::kDisablePreconnect)) |
- preconnect_enabled = false; |
- else if (parsed_command_line().HasSwitch(switches::kEnablePreconnect)) |
- preconnect_enabled = true; |
- chrome_browser_net::PredictorInit dns_prefetch( |
- user_prefs, |
- local_state, |
- preconnect_enabled); |
- |
#if defined(OS_WIN) && defined(GOOGLE_CHROME_BUILD) |
// Init the RLZ library. This just binds the dll and schedules a task on the |
// file thread to be run sometime later. If this is the first run we record |