Chromium Code Reviews| Index: components/metrics/file_metrics_provider.cc |
| diff --git a/components/metrics/file_metrics_provider.cc b/components/metrics/file_metrics_provider.cc |
| index 44df25c5fd67a62230ded244d2844314996e24ad..4062c8fc2543ab2fc6742762efe4800253e05fcd 100644 |
| --- a/components/metrics/file_metrics_provider.cc |
| +++ b/components/metrics/file_metrics_provider.cc |
| @@ -69,6 +69,7 @@ FileMetricsProvider::~FileMetricsProvider() {} |
| void FileMetricsProvider::RegisterFile(const base::FilePath& path, |
| FileType type, |
| + FileAssociation file_association, |
| const base::StringPiece prefs_key) { |
| DCHECK(thread_checker_.CalledOnValidThread()); |
| @@ -84,7 +85,15 @@ void FileMetricsProvider::RegisterFile(const base::FilePath& path, |
| file->prefs_key)); |
| } |
| - files_to_check_.push_back(std::move(file)); |
| + switch (file_association) { |
| + case ASSOCIATE_CURRENT_RUN: |
| + files_to_check_.push_back(std::move(file)); |
| + break; |
| + case ASSOCIATE_PREVIOUS_RUN: |
| + DCHECK_EQ(FILE_HISTOGRAMS_ATOMIC, file->type); |
| + files_for_previous_run_.push_back(std::move(file)); |
| + break; |
| + } |
| } |
| // static |
| @@ -187,7 +196,7 @@ void FileMetricsProvider::RecordHistogramSnapshotsFromFile( |
| if (!histogram) |
| break; |
| if (file->type == FILE_HISTOGRAMS_ATOMIC) |
| - snapshot_manager->PrepareAbsoluteTakingOwnership(std::move(histogram)); |
| + snapshot_manager->PrepareFinalDeltaTakingOwnership(std::move(histogram)); |
| else |
| snapshot_manager->PrepareDeltaTakingOwnership(std::move(histogram)); |
| ++histogram_count; |
| @@ -268,17 +277,66 @@ void FileMetricsProvider::OnDidCreateMetricsLog() { |
| // check is run off of the worker-pool so as to not cause delays on the |
| // main UI thread (which is currently where metric collection is done). |
| ScheduleFilesCheck(); |
| + |
| + // Clear any data for initial metrics since they're always reported |
| + // before the first call to this method. It couldn't be released after |
| + // being reported in RecordInitialHistogramSnapshots because the data |
| + // will continue to be used by the caller after that method returns. Once |
| + // here, though, all actions to be done on the data have been completed. |
| +#if DCHECK_IS_ON() |
| + for (const std::unique_ptr<FileInfo>& file : files_for_previous_run_) |
| + DCHECK(file->read_complete); |
| +#endif |
| + files_for_previous_run_.clear(); |
| +} |
| + |
| +bool FileMetricsProvider::HasInitialStabilityMetrics() { |
| + DCHECK(thread_checker_.CalledOnValidThread()); |
| + |
| + SCOPED_UMA_HISTOGRAM_TIMER("UMA.FileMetricsProvider.InitialTotalCheckTime"); |
|
Alexei Svitkine (slow)
2016/05/09 21:24:10
Nit: Add a comment above these scoped timers menti
bcwhite
2016/05/10 15:42:41
Done.
|
| + |
| + // Check all files for previous run to see if they need to be read. |
| + for (auto iter = files_for_previous_run_.begin(); |
| + iter != files_for_previous_run_.end();) { |
| + SCOPED_UMA_HISTOGRAM_TIMER("UMA.FileMetricsProvider.InitialFileCheckTime"); |
|
Alexei Svitkine (slow)
2016/05/09 21:24:10
How about:
UMA.FileMetricsProvider.InitialCheckTi
bcwhite
2016/05/10 15:42:40
Done.
|
| + |
| + auto temp = iter++; |
| + FileInfo* file = temp->get(); |
| + |
| + // This would normally be done on a background I/O thread but there |
| + // hasn't been a chance to run any at the time this method is called. |
| + // Do the check in-line. |
| + AccessResult result = CheckAndMapNewMetrics(file); |
| + UMA_HISTOGRAM_ENUMERATION("UMA.FileMetricsProvider.InitialAccessResult", |
| + result, ACCESS_RESULT_MAX); |
| + |
| + // If it couldn't be accessed, remove it from the list. There is only ever |
| + // one chance to record it so no point keeping it around for later. Also |
| + // mark it as having been read since uploading it with a future browser |
| + // run would associate it with the previous run which would no longer be |
| + // the run from which it came. |
| + if (result != ACCESS_RESULT_SUCCESS) { |
| + RecordFileAsSeen(file); |
| + files_for_previous_run_.erase(temp); |
| + } |
| + } |
| + |
| + return !files_for_previous_run_.empty(); |
| } |
| void FileMetricsProvider::RecordHistogramSnapshots( |
| base::HistogramSnapshotManager* snapshot_manager) { |
| DCHECK(thread_checker_.CalledOnValidThread()); |
| + SCOPED_UMA_HISTOGRAM_TIMER("UMA.FileMetricsProvider.TotalSnapshotTime"); |
| + |
| for (std::unique_ptr<FileInfo>& file : files_to_read_) { |
| // Skip this file if the data has already been read. |
| if (file->read_complete) |
| continue; |
| + SCOPED_UMA_HISTOGRAM_TIMER("UMA.FileMetricsProvider.FileSnapshotTime"); |
| + |
| // If the file is mapped or loaded then it needs to have an allocator |
| // attached to it in order to read histograms out of it. |
| if (file->mapped || !file->data.empty()) |
| @@ -300,4 +358,29 @@ void FileMetricsProvider::RecordHistogramSnapshots( |
| } |
| } |
| +void FileMetricsProvider::RecordInitialHistogramSnapshots( |
| + base::HistogramSnapshotManager* snapshot_manager) { |
| + DCHECK(thread_checker_.CalledOnValidThread()); |
| + |
| + SCOPED_UMA_HISTOGRAM_TIMER( |
| + "UMA.FileMetricsProvider.InitialTotalSnapshotTime"); |
| + |
| + for (const std::unique_ptr<FileInfo>& file : files_for_previous_run_) { |
| + SCOPED_UMA_HISTOGRAM_TIMER( |
| + "UMA.FileMetricsProvider.InitialFileSnapshotTime"); |
| + |
| + // The file needs to have an allocator attached to it in order to read |
| + // histograms out of it. |
| + DCHECK(file->mapped || !file->data.empty()); |
| + CreateAllocatorForFile(file.get()); |
| + DCHECK(file->allocator); |
| + |
| + // Dump all histograms contained within the file to the snapshot-manager. |
| + RecordHistogramSnapshotsFromFile(snapshot_manager, file.get()); |
| + |
| + // Update the last-seen time so it isn't read again unless it changes. |
| + RecordFileAsSeen(file.get()); |
| + } |
| +} |
| + |
| } // namespace metrics |