Let test driver nuke test perf data on errors.
authormachenbach@chromium.org <machenbach@chromium.org@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Fri, 27 Jun 2014 09:51:08 +0000 (09:51 +0000)
committermachenbach@chromium.org <machenbach@chromium.org@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Fri, 27 Jun 2014 09:51:08 +0000 (09:51 +0000)
BUG=
R=jkummerow@chromium.org

Review URL: https://codereview.chromium.org/350913004

git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@22055 ce2b1a6d-e550-0410-aec6-3dcde31c8c00

tools/testrunner/local/execution.py

index ac69eab..79f856c 100644 (file)
@@ -27,6 +27,7 @@
 
 
 import os
+import shutil
 import time
 
 from pool import Pool
@@ -60,9 +61,10 @@ def RunTest(job):
 class Runner(object):
 
   def __init__(self, suites, progress_indicator, context):
-    datapath = os.path.join("out", "testrunner_data")
-    self.perf_data_manager = perfdata.PerfDataManager(datapath)
+    self.datapath = os.path.join("out", "testrunner_data")
+    self.perf_data_manager = perfdata.PerfDataManager(self.datapath)
     self.perfdata = self.perf_data_manager.GetStore(context.arch, context.mode)
+    self.perf_failures = False
     self.tests = [ t for s in suites for t in s.tests ]
     if not context.no_sorting:
       for t in self.tests:
@@ -80,6 +82,13 @@ class Runner(object):
     self.failed = []
     self.crashed = 0
 
+  def _RunPerfSafe(self, fun):
+    try:
+      fun()
+    except Exception, e:
+      print("PerfData exception: %s" % e)
+      self.perf_failures = True
+
   def Run(self, jobs):
     self.indicator.Starting()
     self._RunInternal(jobs)
@@ -130,17 +139,18 @@ class Runner(object):
           if test.output.HasCrashed():
             self.crashed += 1
         else:
+          self._RunPerfSafe(lambda: self.perfdata.UpdatePerfData(test))
           self.succeeded += 1
         self.remaining -= 1
-        try:
-          self.perfdata.UpdatePerfData(test)
-        except Exception, e:
-          print("UpdatePerfData exception: %s" % e)
-          pass  # Just keep working.
         self.indicator.HasRun(test, has_unexpected_output)
     finally:
       pool.terminate()
-      self.perf_data_manager.close()
+      self._RunPerfSafe(lambda: self.perf_data_manager.close())
+      if self.perf_failures:
+        # Nuke perf data in case of failures. This might not work on windows as
+        # some files might still be open.
+        print "Deleting perf test data due to db corruption."
+        shutil.rmtree(self.datapath)
     if queued_exception:
       raise queued_exception