Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(40)

Unified Diff: tools/perf/profile_creators/history_profile_extender.py

Issue 914253005: Telemetry: Create new profile creator large_profile_creator. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Comments from sullivan. Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: tools/perf/profile_creators/history_profile_extender.py
diff --git a/tools/perf/profile_creators/history_profile_extender.py b/tools/perf/profile_creators/history_profile_extender.py
new file mode 100644
index 0000000000000000000000000000000000000000..6e1c133f21a8ab30ecce969b5cea391ea729a5d1
--- /dev/null
+++ b/tools/perf/profile_creators/history_profile_extender.py
@@ -0,0 +1,90 @@
+# Copyright 2015 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+import multiprocessing
+import tempfile
+import os
+
+from profile_creators import fast_navigation_profile_extender
+
+
+class HistoryProfileExtender(
+ fast_navigation_profile_extender.FastNavigationProfileExtender):
+ """This extender navigates Chrome to a large number of URIs pointing to local
+ files. It continues running until the history DB becomes full."""
+ _HISTORY_DB_MAX_SIZE_IN_MB = 10
+
+ def __init__(self):
+ # The rate limiting factors are the speed of page navigation, and the speed
+ # of python bindings. The former is larger than the latter, so having a
+ # large batch size skews the amortized average time per page load towards
+ # the latter.
+ maximum_batch_size = multiprocessing.cpu_count() * 2
+ super(HistoryProfileExtender, self).__init__(maximum_batch_size)
+
+ # A list of paths of temporary files. The instance is responsible for
+ # making sure that the files are deleted before they are removed from this
+ # list.
+ self._generated_temp_files = []
+
+ def _MakeTemporaryFile(self):
+ """Makes a temporary file and returns a URI to the file.
+
+ This method has the side effect of appending the temporary file to
+ self._generated_temp_files. The instance is responsible for deleting the
+ file at a later point in time.
+ """
+ # Adding a long suffix to the name of the file fills up the history
+ # database faster. The suffix can't be too long, since some file systems
+ # have a 256 character limit on the length of the path. While we could
+ # dynamically vary the length of the path, that would generate different
+ # profiles on different OSes, which is not ideal.
+ suffix = "reallylongsuffixintendedtoartificiallyincreasethelengthoftheurl"
+
+ # Neither tempfile.TemporaryFile() nor tempfile.NamedTemporaryFile() work
+ # well here. The former doesn't work at all, since it doesn't gaurantee a
+ # file-system visible path. The latter doesn't work well, since the
+ # returned file cannot be opened a second time on Windows. The returned
+ # file would have to be closed, and the method would need to be called with
+ # Delete=False, which makes its functionality no simpler than
+ # tempfile.mkstemp().
+ handle, path = tempfile.mkstemp(suffix=suffix)
+ os.close(handle)
+ self._generated_temp_files.append(path)
+
+ file_url = "file://" + path
+ return file_url
+
+ def GetUrlIterator(self):
+ """Superclass override."""
+ while True:
+ yield self._MakeTemporaryFile()
+
+ def ShouldExitAfterBatchNavigation(self):
+ """Superclass override."""
+ return self._IsHistoryDBAtMaxSize()
+
+ def TearDown(self):
+ """Superclass override."""
+ super(HistoryProfileExtender, self).TearDown()
+ for path in self._generated_temp_files:
+ os.remove(path)
+ self._generated_temp_files = []
+
+ def CleanUpAfterBatchNavigation(self):
+ """Superclass override."""
+ for path in self._generated_temp_files:
+ os.remove(path)
+ self._generated_temp_files = []
+
+ def _IsHistoryDBAtMaxSize(self):
+ """Whether the history DB has reached its maximum size."""
+ history_db_path = os.path.join(self.profile_path, "Default", "History")
+ stat_info = os.stat(history_db_path)
+ size = stat_info.st_size
+
+ max_size_threshold = 0.95
+ bytes_in_megabyte = 2**10
+ max_size = (bytes_in_megabyte *
+ HistoryProfileExtender._HISTORY_DB_MAX_SIZE_IN_MB * max_size_threshold)
+ return size > max_size

Powered by Google App Engine
This is Rietveld 408576698