[kernel_worker] retry on failure

Workaround for https://github.com/dart-lang/sdk/issues/36644

See similar for dartdevc: https://dart-review.googlesource.com/c/sdk/+/99442

Change-Id: Id02549a7bd8110b4691a724fa8930ede477464f8
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/99735
Commit-Queue: Vijay Menon <vsm@google.com>
Reviewed-by: Jake Macdonald <jakemac@google.com>
diff --git a/utils/bazel/kernel_worker.dart b/utils/bazel/kernel_worker.dart
index f288208..53cf818 100644
--- a/utils/bazel/kernel_worker.dart
+++ b/utils/bazel/kernel_worker.dart
@@ -53,11 +53,24 @@
       } else {
         previousState = null;
       }
-      var result = await computeKernel(request.arguments,
-          isWorker: true,
-          outputBuffer: outputBuffer,
-          inputs: request.inputs,
-          previousState: previousStateToPass);
+      ComputeKernelResult result;
+      // TODO(vsm): See https://github.com/dart-lang/sdk/issues/36644.
+      // If the CFE is crashing with previous state, then clear compilation
+      // state and try again.
+      try {
+        result = await computeKernel(request.arguments,
+            isWorker: true,
+            outputBuffer: outputBuffer,
+            inputs: request.inputs,
+            previousState: previousStateToPass);
+      } catch (_) {
+        outputBuffer.clear();
+        result = await computeKernel(request.arguments,
+            isWorker: true,
+            outputBuffer: outputBuffer,
+            inputs: request.inputs,
+            previousState: null);
+      }
       previousState = result.previousState;
       if (!result.succeeded) {
         response.exitCode = 15;