| /* |
| * 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.deploy.master |
| |
| import org.apache.spark.deploy.ApplicationDescription |
| import java.util.Date |
| import akka.actor.ActorRef |
| import scala.collection.mutable |
| |
| private[spark] class ApplicationInfo( |
| val startTime: Long, |
| val id: String, |
| val desc: ApplicationDescription, |
| val submitDate: Date, |
| val driver: ActorRef, |
| val appUiUrl: String) |
| extends Serializable { |
| |
| @transient var state: ApplicationState.Value = _ |
| @transient var executors: mutable.HashMap[Int, ExecutorInfo] = _ |
| @transient var coresGranted: Int = _ |
| @transient var endTime: Long = _ |
| @transient var appSource: ApplicationSource = _ |
| |
| @transient private var nextExecutorId: Int = _ |
| |
| init() |
| |
| private def readObject(in: java.io.ObjectInputStream) : Unit = { |
| in.defaultReadObject() |
| init() |
| } |
| |
| private def init() { |
| state = ApplicationState.WAITING |
| executors = new mutable.HashMap[Int, ExecutorInfo] |
| coresGranted = 0 |
| endTime = -1L |
| appSource = new ApplicationSource(this) |
| nextExecutorId = 0 |
| } |
| |
| private def newExecutorId(useID: Option[Int] = None): Int = { |
| useID match { |
| case Some(id) => |
| nextExecutorId = math.max(nextExecutorId, id + 1) |
| id |
| case None => |
| val id = nextExecutorId |
| nextExecutorId += 1 |
| id |
| } |
| } |
| |
| def addExecutor(worker: WorkerInfo, cores: Int, useID: Option[Int] = None): ExecutorInfo = { |
| val exec = new ExecutorInfo(newExecutorId(useID), this, worker, cores, desc.memoryPerSlave) |
| executors(exec.id) = exec |
| coresGranted += cores |
| exec |
| } |
| |
| def removeExecutor(exec: ExecutorInfo) { |
| if (executors.contains(exec.id)) { |
| executors -= exec.id |
| coresGranted -= exec.cores |
| } |
| } |
| |
| def coresLeft: Int = desc.maxCores - coresGranted |
| |
| private var _retryCount = 0 |
| |
| def retryCount = _retryCount |
| |
| def incrementRetryCount = { |
| _retryCount += 1 |
| _retryCount |
| } |
| |
| def markFinished(endState: ApplicationState.Value) { |
| state = endState |
| endTime = System.currentTimeMillis() |
| } |
| |
| def duration: Long = { |
| if (endTime != -1) { |
| endTime - startTime |
| } else { |
| System.currentTimeMillis() - startTime |
| } |
| } |
| |
| } |