Github user andrewor14 commented on a diff in the pull request:

    https://github.com/apache/spark/pull/2577#discussion_r18239465
  
    --- Diff: 
yarn/common/src/main/scala/org/apache/spark/deploy/yarn/ApplicationMaster.scala 
---
    @@ -383,40 +404,80 @@ private[spark] class ApplicationMaster(args: 
ApplicationMasterArguments,
         }
       }
     
    +  /**
    +   * Start the user class, which contains the spark driver.
    +   * If the main routine exits cleanly or exits with System.exit(0) we
    +   * assume it was successful, for all other cases we assume failure.
    +   */
       private def startUserClass(): Thread = {
         logInfo("Starting the user JAR in a separate Thread")
         System.setProperty("spark.executor.instances", 
args.numExecutors.toString)
    +    var stopped = false
         val mainMethod = Class.forName(args.userClass, false,
           Thread.currentThread.getContextClassLoader).getMethod("main", 
classOf[Array[String]])
     
    -    userClassThread = new Thread {
    +    val userThread = new Thread {
           override def run() {
    -        var status = FinalApplicationStatus.FAILED
    +
    +        try {
    +          // Note this security manager applies to the entire process, not
    +          // just this thread. It's here to handle the case if the user 
code
    +          // does System.exit
    +          System.setSecurityManager(new java.lang.SecurityManager() {
    +            override def checkExit(paramInt: Int) {
    +              if (!stopped) {
    +                logInfo("In securityManager checkExit, exit code: " + 
paramInt)
    +                if (paramInt == 0) {
    +                  finish(FinalApplicationStatus.SUCCEEDED, 
ApplicationMaster.EXIT_SUCCESS)
    +                } else {
    +                  finish(FinalApplicationStatus.FAILED,
    +                    paramInt,
    +                    "User class exited with non-zero exit code")
    +                }
    +                stopped = true
    +              }
    +            }
    +
    +            // required for the checkExit to work properly
    +            override def checkPermission(perm: java.security.Permission): 
Unit = {
    +            }
    +          })
    +        }
    +        catch {
    +          case e: SecurityException => {
    +            finish(FinalApplicationStatus.FAILED,
    +              ApplicationMaster.EXIT_SECURITY,
    +              "Error in setSecurityManager")
    +            logError("Error in setSecurityManager:", e)
    +          }
    +        }
    +
    --- End diff --
    
    Does this block have to execute inside the thread, since it's a system-wide 
setting?


---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at infrastruct...@apache.org or file a JIRA ticket
with INFRA.
---

---------------------------------------------------------------------
To unsubscribe, e-mail: reviews-unsubscr...@spark.apache.org
For additional commands, e-mail: reviews-h...@spark.apache.org

Reply via email to