LuciferYang opened a new pull request, #56900:
URL: https://github.com/apache/spark/pull/56900

   ### What changes were proposed in this pull request?
   `PipelinesHandler.startRun` rethrows a failed pipeline run to the Spark 
Connect client via `runFailureEvent.foreach { event => throw event.error.get 
}`. But `event.error` is `None` for run termination reasons that carry no cause 
- `UnexpectedRunFailure` and `FailureStoppingFlow` both have `cause = None` - 
so `event.error.get` raised a `NoSuchElementException`, crashing the handler 
and hiding the real failure from the client.
   
   This PR extracts the rethrow into `throwRunFailure`: when the failure has a 
cause it is rethrown unchanged; when it does not, a `SparkException` with a new 
`PIPELINE_RUN_FAILED` error condition is thrown, carrying the run's termination 
message. `PIPELINE_RUN_FAILED` (rather than `INTERNAL_ERROR`) is used so that 
operational outcomes such as `FailureStoppingFlow` are not mislabeled as Spark 
bugs.
   
   ### Why are the changes needed?
   A run that fails without an attached cause (e.g. `UnexpectedRunFailure`, or 
a flow that fails to stop) currently surfaces to the Connect client as an 
opaque `NoSuchElementException` ("None.get") instead of the actual run-failure 
message. That masks the real problem and looks like an internal error. These 
reasons reach this code via the asynchronous `onCompletion` path, where 
`PipelineExecution.runPipeline`'s own catch never fires.
   
   ### Does this PR introduce _any_ user-facing change?
   Yes. When a pipeline run fails without an attached cause, the Spark Connect 
client now receives a `PIPELINE_RUN_FAILED` error carrying the run's 
termination message (e.g. "Run failed unexpectedly.") instead of a 
`NoSuchElementException`.
   
   ### How was this patch tested?
   New `PipelinesHandlerSuite` unit-tests `throwRunFailure` for both cases: the 
cause-present case rethrows the original cause, and the no-cause case throws a 
`PIPELINE_RUN_FAILED` `SparkException` carrying the termination message 
(verified with `checkError`, using the real `UnexpectedRunFailure` and 
`FailureStoppingFlow` messages). The cause-less termination reasons cannot be 
triggered deterministically through the end-to-end run path, so the rethrow is 
unit-tested directly. `SparkThrowableSuite` validates the new error condition.
   
   ### Was this patch authored or co-authored using generative AI tooling?
   Generated-by: Claude Code (Claude Opus 4.8)
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to