Index: chrome/browser/chrome_browser_field_trials.cc |
diff --git a/chrome/browser/chrome_browser_field_trials.cc b/chrome/browser/chrome_browser_field_trials.cc |
index e63dfea0c464edd0fc8efa3d960487181d4d9a42..8dc2258aa4015bef36b59263c16857a9fa05a129 100644 |
--- a/chrome/browser/chrome_browser_field_trials.cc |
+++ b/chrome/browser/chrome_browser_field_trials.cc |
@@ -8,16 +8,20 @@ |
#include "base/command_line.h" |
#include "base/feature_list.h" |
+#include "base/files/file_util.h" |
#include "base/metrics/field_trial.h" |
#include "base/metrics/histogram_base.h" |
#include "base/metrics/persistent_histogram_allocator.h" |
+#include "base/path_service.h" |
#include "base/strings/string_util.h" |
#include "base/time/time.h" |
#include "build/build_config.h" |
#include "chrome/browser/metrics/chrome_metrics_service_client.h" |
#include "chrome/browser/tracing/background_tracing_field_trial.h" |
+#include "chrome/common/chrome_paths.h" |
#include "chrome/common/chrome_switches.h" |
#include "components/metrics/metrics_pref_names.h" |
+#include "components/variations/variations_associated_data.h" |
#if defined(OS_ANDROID) |
#include "chrome/browser/chrome_browser_field_trials_mobile.h" |
@@ -29,21 +33,58 @@ namespace { |
// Check for feature enabling the use of persistent histogram storage and |
// enable the global allocator if so. |
+// TODO(bcwhite): Move this and CreateInstallerFileMetricsProvider into a new |
+// file and make kBrowserMetricsName local to that file. |
void InstantiatePersistentHistograms() { |
- if (base::FeatureList::IsEnabled(base::kPersistentHistogramsFeature)) { |
- // Create persistent/shared memory and allow histograms to be stored in |
- // it. Memory that is not actualy used won't be physically mapped by the |
- // system. BrowserMetrics usage, as reported in UMA, peaked around 1.9MiB |
- // as of 2016-02-20. |
- base::GlobalHistogramAllocator::CreateWithLocalMemory( |
- 3 << 20, // 3 MiB |
- 0x935DDD43, // SHA1(BrowserMetrics) |
- ChromeMetricsServiceClient::kBrowserMetricsName); |
- base::GlobalHistogramAllocator* allocator = |
- base::GlobalHistogramAllocator::Get(); |
- allocator->CreateTrackingHistograms( |
+ base::FilePath metrics_dir; |
+ if (!base::PathService::Get(chrome::DIR_USER_DATA, &metrics_dir)) |
+ return; |
+ |
+ base::FilePath metrics_file = |
+ metrics_dir |
+ .AppendASCII(ChromeMetricsServiceClient::kBrowserMetricsName) |
+ .AddExtension(base::PersistentMemoryAllocator::kFileExtension); |
+ base::FilePath active_file = |
+ metrics_dir |
+ .AppendASCII( |
+ std::string(ChromeMetricsServiceClient::kBrowserMetricsName) + |
+ "-active") |
+ .AddExtension(base::PersistentMemoryAllocator::kFileExtension); |
+ |
+ // Move any existing "active" file to the final name from which it will be |
+ // read when reporting initial stability metrics. If there is no file to |
+ // move, remove any old, existing file from before the previous session. |
+ if (!base::ReplaceFile(active_file, metrics_file, nullptr)) |
+ base::DeleteFile(metrics_file, /*recursive=*/false); |
+ |
+ // Create persistent/shared memory and allow histograms to be stored in |
+ // it. Memory that is not actualy used won't be physically mapped by the |
+ // system. BrowserMetrics usage, as reported in UMA, peaked around 1.9MiB |
+ // as of 2016-02-20. |
+ const size_t kAllocSize = 3 << 20; // 3 MiB |
+ const uint32_t kAllocId = 0x935DDD43; // SHA1(BrowserMetrics) |
+ std::string storage = variations::GetVariationParamValueByFeature( |
+ base::kPersistentHistogramsFeature, "storage"); |
+ if (storage == "MappedFile") { |
+ // Create global allocator with the "active" file. |
+ base::GlobalHistogramAllocator::CreateWithFile( |
+ active_file, kAllocSize, kAllocId, |
ChromeMetricsServiceClient::kBrowserMetricsName); |
+ } else if (storage == "LocalMemory") { |
+ // Use local memory for storage even though it will not persist across |
+ // an unclean shutdown. |
+ base::GlobalHistogramAllocator::CreateWithLocalMemory( |
+ kAllocSize, kAllocId, ChromeMetricsServiceClient::kBrowserMetricsName); |
+ } else { |
+ // Persistent metric storage is disabled. |
+ return; |
} |
+ |
+ base::GlobalHistogramAllocator* allocator = |
+ base::GlobalHistogramAllocator::Get(); |
+ allocator->CreateTrackingHistograms( |
+ ChromeMetricsServiceClient::kBrowserMetricsName); |
+ allocator->SetPersistentLocation(active_file); |
} |
} // namespace |