| 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
|
|
|