From 80127935df06a829b734cafc2447aa1f3df40288 Mon Sep 17 00:00:00 2001 From: Jakob Odersky Date: Thu, 21 Apr 2016 22:04:08 -0700 Subject: [SPARK-10001] [CORE] Interrupt tasks in repl with Ctrl+C ## What changes were proposed in this pull request? Improve signal handling to allow interrupting running tasks from the REPL (with Ctrl+C). If no tasks are running or Ctrl+C is pressed twice, the signal is forwarded to the default handler resulting in the usual termination of the application. This PR is a rewrite of -- and therefore closes #8216 -- as per piaozhexiu's request ## How was this patch tested? Signal handling is not easily testable therefore no unit tests were added. Nevertheless, the new functionality is implemented in a best-effort approach, soft-failing in case signals aren't available on a specific OS. Author: Jakob Odersky Closes #12557 from jodersky/SPARK-10001-sigint. --- .../scala/org/apache/spark/repl/Signaling.scala | 42 ++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 repl/src/main/scala/org/apache/spark/repl/Signaling.scala (limited to 'repl/src/main/scala/org/apache') diff --git a/repl/src/main/scala/org/apache/spark/repl/Signaling.scala b/repl/src/main/scala/org/apache/spark/repl/Signaling.scala new file mode 100644 index 0000000000..c305ed545c --- /dev/null +++ b/repl/src/main/scala/org/apache/spark/repl/Signaling.scala @@ -0,0 +1,42 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.spark.repl + +import org.apache.spark.SparkContext +import org.apache.spark.internal.Logging +import org.apache.spark.util.{Signaling => USignaling} + +private[repl] object Signaling extends Logging { + + /** + * Register a SIGINT handler, that terminates all active spark jobs or terminates + * when no jobs are currently running. + * This makes it possible to interrupt a running shell job by pressing Ctrl+C. + */ + def cancelOnInterrupt(ctx: SparkContext): Unit = USignaling.register("INT") { + if (!ctx.statusTracker.getActiveJobIds().isEmpty) { + logWarning("Cancelling all active jobs, this can take a while. " + + "Press Ctrl+C again to exit now.") + ctx.cancelAllJobs() + true + } else { + false + } + } + +} -- cgit v1.2.3