ryan-johnson-databricks opened a new pull request, #37573:
URL: https://github.com/apache/spark/pull/37573

   <!--
   Thanks for sending a pull request!  Here are some tips for you:
     1. If this is your first time, please read our contributor guidelines: 
https://spark.apache.org/contributing.html
     2. Ensure you have added or run the appropriate tests for your PR: 
https://spark.apache.org/developer-tools.html
     3. If the PR is unfinished, add '[WIP]' in your PR title, e.g., 
'[WIP][SPARK-XXXX] Your PR title ...'.
     4. Be sure to keep the PR description updated to reflect all changes.
     5. Please write your PR title to summarize what this PR proposes.
     6. If possible, provide a concise example to reproduce the issue for a 
faster review.
     7. If you want to add a new configuration, please read the guideline first 
for naming configurations in
        
'core/src/main/scala/org/apache/spark/internal/config/ConfigEntry.scala'.
     8. If you want to add or modify an error type or message, please read the 
guideline first in
        'core/src/main/resources/error/README.md'.
   -->
   
   ### What changes were proposed in this pull request?
   
   `TaskContext` currently defines two sets of functions for registering 
listeners:
   ```scala
   def addTaskCompletionListener(listener: TaskCompletionListener): TaskContext
   def addTaskCompletionListener[U](f: (TaskContext) => U): TaskContext
   
   def addTaskFailureListener(listener: TaskFailureListener): TaskContext
   def addTaskFailureListener(f: (TaskContext, Throwable) => Unit): TaskContext
   ```
   
   Before JDK8, the overloads were a convenient way to register a new listener 
without having to instantiate a new class. However, with the introduction of 
[functional 
interfaces](https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html#approach5)
 in JDK8+, the two signatures are now equivalent, because a function whose 
signature matches the only method of a functional interface can be used in 
place of that interface. 
   
   Result: cryptic ambiguous overload errors when trying to use the 
function-only overload, which prompted a [scala bug 
report](https://github.com/scala/bug/issues/11016) (which was never addressed), 
as well as an attempted workaround that makes `addTaskCompletionListener` 
gratuitously generic, so that the compiler no longer considers e.g. 
`addTaskCompletionListener[Unit]` as equivalent to the overload that accepts a 
`TaskFailureListener`. The latter workaround was never applied to 
`addTaskFailureListener` for some reason). 
   
   Now that JDK8 is the minimum supported version, we can dispense with the 
overloads and rely entirely on functional interfaces to work as expected. The 
vast majority of call sites can now use the function form instead of the class 
form, which simplifies the code considerably.
   
   While we're at it, standardize the call sites. One-liners use the functional 
form:
   ```scala
   addTaskCompletionListener(_ => ...)
   ```
   while multi-liners use the block form:
   ```scala
   addTaskCompletionListener { _ =>
     ...
   }
   ```
   
   ### Why are the changes needed?
   
   JDK8+ functional interfaces conflict with the existing overloads. The task 
listener interface becomes simpler and easier to use if we align with the JDK.
   
   ### Does this PR introduce _any_ user-facing change?
   
   Developers who rely on this developer API will need to remove the gratuitous 
`[Unit]` when registering functions as listeners.
   
   ### How was this patch tested?
   
   All use sites in the spark code base have been updated to use the new 
mechanism. The fact that they continue to compile is the strongest evidence 
that the change worked. The tests that exercise the changed code sites also 
verify correctness. 
   


-- 
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