[SPARK-23020][CORE] Fix races in launcher code, test.
authorMarcelo Vanzin <vanzin@cloudera.com>
Mon, 22 Jan 2018 06:49:12 +0000 (14:49 +0800)
committerWenchen Fan <wenchen@databricks.com>
Mon, 22 Jan 2018 06:49:12 +0000 (14:49 +0800)
commitec228976156619ed8df21a85bceb5fd3bdeb5855
treece000d2845c0955e016bf67af31a8a7912d592a8
parent8142a3b883a5fe6fc620a2c5b25b6bde4fda32e5
[SPARK-23020][CORE] Fix races in launcher code, test.

The race in the code is because the handle might update
its state to the wrong state if the connection handling
thread is still processing incoming data; so the handle
needs to wait for the connection to finish up before
checking the final state.

The race in the test is because when waiting for a handle
to reach a final state, the waitFor() method needs to wait
until all handle state is updated (which also includes
waiting for the connection thread above to finish).
Otherwise, waitFor() may return too early, which would cause
a bunch of different races (like the listener not being yet
notified of the state change, or being in the middle of
being notified, or the handle not being properly disposed
and causing postChecks() to assert).

On top of that I found, by code inspection, a couple of
potential races that could make a handle end up in the
wrong state when being killed.

The original version of this fix introduced the flipped
version of the first race described above; the connection
closing might override the handle state before the
handle might have a chance to do cleanup. The fix there
is to only dispose of the handle from the connection
when there is an error, and let the handle dispose
itself in the normal case.

The fix also caused a bug in YarnClusterSuite to be surfaced;
the code was checking for a file in the classpath that was
not expected to be there in client mode. Because of the above
issues, the error was not propagating correctly and the (buggy)
test was incorrectly passing.

Tested by running the existing unit tests a lot (and not
seeing the errors I was seeing before).

Author: Marcelo Vanzin <vanzin@cloudera.com>

Closes #20297 from vanzin/SPARK-23020.
core/src/test/java/org/apache/spark/launcher/SparkLauncherSuite.java
launcher/src/main/java/org/apache/spark/launcher/AbstractAppHandle.java
launcher/src/main/java/org/apache/spark/launcher/ChildProcAppHandle.java
launcher/src/main/java/org/apache/spark/launcher/InProcessAppHandle.java
launcher/src/main/java/org/apache/spark/launcher/LauncherConnection.java
launcher/src/main/java/org/apache/spark/launcher/LauncherServer.java
launcher/src/test/java/org/apache/spark/launcher/BaseSuite.java
launcher/src/test/java/org/apache/spark/launcher/LauncherServerSuite.java
resource-managers/yarn/src/test/scala/org/apache/spark/deploy/yarn/YarnClusterSuite.scala