Keep stable output path for TraceProcessorProbe

When merging profile symbols we created a new symbolize_trace.zip file
and removed merged_trace.zip which breaks running trace_processor
queries.

This CL ensures we only ever and up with a merged_trace.zip file when
we have a symbolized trace.

Change-Id: I29465c066b43cfd40af629cae5772065ee0482f4
Reviewed-on: https://chromium-review.googlesource.com/c/crossbench/+/7532109
Commit-Queue: Camillo Bruni <cbruni@chromium.org>
Reviewed-by: Patrick Thier <pthier@chromium.org>
Reviewed-by: Michael Lippautz <mlippautz@chromium.org>
diff --git a/crossbench/probes/trace_processor/context/base.py b/crossbench/probes/trace_processor/context/base.py
index a5f4030..0f4561f 100644
--- a/crossbench/probes/trace_processor/context/base.py
+++ b/crossbench/probes/trace_processor/context/base.py
@@ -142,5 +142,5 @@
     return self.local_result_path / "merged_trace.zip"
 
   @property
-  def symbolized_trace_path(self) -> pth.LocalPath:
+  def _symbolized_trace_path(self) -> pth.LocalPath:
     return self.local_result_path / "symbolized_trace.zip"
diff --git a/crossbench/probes/trace_processor/context/symbolizing.py b/crossbench/probes/trace_processor/context/symbolizing.py
index 7b4ab4e..fa13eae 100644
--- a/crossbench/probes/trace_processor/context/symbolizing.py
+++ b/crossbench/probes/trace_processor/context/symbolizing.py
@@ -17,6 +17,7 @@
     TraceProcessorProbeContext
 
 if TYPE_CHECKING:
+  from crossbench import path as pth
   from crossbench.probes.results import LocalProbeResult
 
 KB = 1024
@@ -67,15 +68,23 @@
       logging.error("Could not generate valid symbols file: %s", symbols_result)
       return result
 
-    with zipfile.ZipFile(self.symbolized_trace_path, "w") as zip_file:
+    return self._maybe_symbolized_result(result, symbols_result)
+
+  def _maybe_symbolized_result(
+      self, result: LocalProbeResult,
+      symbols_result: pth.LocalPath) -> LocalProbeResult:
+    with zipfile.ZipFile(self._symbolized_trace_path, "w") as zip_file:
       for f in (*result.perfetto_list, symbols_result):
         zip_file.write(f, arcname=f.relative_to(self.run.out_dir))
-    self._cleanup()
-    return self.local_result(perfetto=(self.symbolized_trace_path,))
 
-  def _cleanup(self) -> None:
-    # If we have a successfully symbolized trace file we don't need the merged
-    # one anymore.
-    if (self.host_platform.file_size(self.symbolized_trace_path)
-        > self.host_platform.file_size(self.merged_trace_path)):
-      self.host_platform.rm(self.merged_trace_path)
+    if (self.host_platform.file_size(self._symbolized_trace_path)
+        < self.host_platform.file_size(self.merged_trace_path)):
+      logging.error("Failed to generated symbolized trace file")
+      return result
+
+    # If we have a successfully symbolized trace file we can replace
+    # the original merged_trace.zip.
+    self.host_platform.rm(self.merged_trace_path)
+    self.host_platform.rename(self._symbolized_trace_path,
+                              self.merged_trace_path)
+    return self.local_result(perfetto=(self.merged_trace_path,))