When we receive SIGINT more than once, we call System.exit to terminate the JVM. System.exit runs the shutdown hooks which in turn calls SparkClientFactory.stop. All the methods in SparkClientFactory are synchronized and at this point, we may be waiting to create a SparkClientImpl in SparkClientFactory.createClient. Therefore SparkClientFactory.stop will be blocked until SparkClientFactory.createClient returns.
The reason why we may be waiting to create SparkClientImpl is usually to wait for RemoteDriver to connect. If RemoteDriver runs into problem, the JVM won't exit until we timeout.