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

Unified Diff: tools/telemetry/telemetry/value/trace.py

Issue 920523002: [Telemetry] Reduce memory usage in presence of TraceValues (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Address Ned's comments and fix bad logic 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/telemetry/telemetry/value/trace.py
diff --git a/tools/telemetry/telemetry/value/trace.py b/tools/telemetry/telemetry/value/trace.py
index ba73e7b77185ca30e13bef81f8056051631e64ca..db3244ea84b64a629da58fa8929eab1cb1d6cb3f 100644
--- a/tools/telemetry/telemetry/value/trace.py
+++ b/tools/telemetry/telemetry/value/trace.py
@@ -30,18 +30,18 @@ class TraceValue(value_module.Value):
super(TraceValue, self).__init__(
page, name='trace', units='', important=important,
description=description)
- self._trace_data = trace_data
+ self._temp_file = self._GetTempFileHandle(trace_data)
self._cloud_url = None
self._serialized_file_handle = None
- def _GetTempFileHandle(self):
+ def _GetTempFileHandle(self, trace_data):
tf = tempfile.NamedTemporaryFile(delete=False, suffix='.html')
if self.page:
title = self.page.display_name
else:
title = ''
trace2html.WriteHTMLForTraceDataToFile(
- [self._trace_data.GetEventsFor(trace_data_module.CHROME_TRACE_PART)],
+ [trace_data.GetEventsFor(trace_data_module.CHROME_TRACE_PART)],
title,
tf)
tf.close()
@@ -54,6 +54,23 @@ class TraceValue(value_module.Value):
page_name = None
return 'TraceValue(%s, %s)' % (page_name, self.name)
+ def CleanUp(self):
+ """Cleans up tempfile after it is no longer needed.
+
+ A cleaned up TraceValue cannot be used for further operations. CleanUp()
+ may be called more than once without error.
+ """
+ if self._temp_file is None:
+ return
+ os.remove(self._temp_file.GetAbsPath())
+ self._temp_file = None
+
+ def __enter__(self):
+ return self
+
+ def __exit__(self, _, __, ___):
+ self.CleanUp()
+
def GetBuildbotDataType(self, output_context):
return None
@@ -84,6 +101,8 @@ class TraceValue(value_module.Value):
return None
def AsDict(self):
+ if self._temp_file is None:
+ raise ValueError('Tried to serialize TraceValue without tempfile.')
d = super(TraceValue, self).AsDict()
if self._serialized_file_handle:
d['file_id'] = self._serialized_file_handle.id
@@ -92,21 +111,22 @@ class TraceValue(value_module.Value):
return d
def Serialize(self, dir_path):
- fh = self._GetTempFileHandle()
- file_name = str(fh.id) + fh.extension
+ if self._temp_file is None:
+ raise ValueError('Tried to serialize nonexistent trace.')
+ file_name = str(self._temp_file.id) + self._temp_file.extension
file_path = os.path.abspath(os.path.join(dir_path, file_name))
- shutil.move(fh.GetAbsPath(), file_path)
+ shutil.copy(self._temp_file.GetAbsPath(), file_path)
self._serialized_file_handle = file_handle.FromFilePath(file_path)
return self._serialized_file_handle
def UploadToCloud(self, bucket):
- temp_fh = None
+ if self._temp_file is None:
+ raise ValueError('Tried to upload nonexistent trace to Cloud Storage.')
try:
if self._serialized_file_handle:
fh = self._serialized_file_handle
else:
- temp_fh = self._GetTempFileHandle()
- fh = temp_fh
+ fh = self._temp_file
remote_path = ('trace-file-id_%s-%s-%d%s' % (
fh.id,
datetime.datetime.now().strftime('%Y-%m-%d_%H-%M-%S'),
@@ -121,6 +141,3 @@ class TraceValue(value_module.Value):
except cloud_storage.PermissionError as e:
logging.error('Cannot upload trace files to cloud storage due to '
' permission error: %s' % e.message)
- finally:
- if temp_fh:
- os.remove(temp_fh.GetAbsPath())

Powered by Google App Engine
This is Rietveld 408576698