Performance improvements for CDash reporter

* Record build output as an array of lines rather than concatenating to a
  single large string.
* Use string.find to avoid running re.search on every line of output.
This commit is contained in:
Zack Galbreath 2018-12-11 16:52:31 -05:00 committed by Todd Gamblin
parent 6355ee208c
commit b90f619037

View file

@ -78,7 +78,7 @@ def build_report(self, filename, report_data):
for phase in cdash_phases: for phase in cdash_phases:
report_data[phase] = {} report_data[phase] = {}
report_data[phase]['log'] = "" report_data[phase]['loglines'] = []
report_data[phase]['status'] = 0 report_data[phase]['status'] = 0
report_data[phase]['endtime'] = self.endtime report_data[phase]['endtime'] = self.endtime
@ -97,7 +97,9 @@ def build_report(self, filename, report_data):
current_phase = '' current_phase = ''
cdash_phase = '' cdash_phase = ''
for line in package['stdout'].splitlines(): for line in package['stdout'].splitlines():
match = phase_regexp.search(line) match = None
if line.find("Executing phase: '") != -1:
match = phase_regexp.search(line)
if match: if match:
current_phase = match.group(1) current_phase = match.group(1)
if current_phase not in map_phases_to_cdash: if current_phase not in map_phases_to_cdash:
@ -107,12 +109,12 @@ def build_report(self, filename, report_data):
map_phases_to_cdash[current_phase] map_phases_to_cdash[current_phase]
if cdash_phase not in phases_encountered: if cdash_phase not in phases_encountered:
phases_encountered.append(cdash_phase) phases_encountered.append(cdash_phase)
report_data[cdash_phase]['log'] += \ report_data[cdash_phase]['loglines'].append(
text_type("{0} output for {1}:\n".format( text_type("{0} output for {1}:".format(
cdash_phase, package['name'])) cdash_phase, package['name'])))
elif cdash_phase: elif cdash_phase:
report_data[cdash_phase]['log'] += \ report_data[cdash_phase]['loglines'].append(
xml.sax.saxutils.escape(line) + "\n" xml.sax.saxutils.escape(line))
phases_encountered.append('update') phases_encountered.append('update')
@ -126,8 +128,9 @@ def build_report(self, filename, report_data):
self.starttime = self.endtime - total_duration self.starttime = self.endtime - total_duration
for phase in phases_encountered: for phase in phases_encountered:
report_data[phase]['starttime'] = self.starttime report_data[phase]['starttime'] = self.starttime
errors, warnings = parse_log_events( report_data[phase]['log'] = \
report_data[phase]['log'].splitlines()) '\n'.join(report_data[phase]['loglines'])
errors, warnings = parse_log_events(report_data[phase]['loglines'])
nerrors = len(errors) nerrors = len(errors)
if phase == 'configure' and nerrors > 0: if phase == 'configure' and nerrors > 0: