in pkg/jobmgr/cached/task.go [171:270]
func (t *task) validateState(newRuntime *pbtask.RuntimeInfo) bool {
currentRuntime := t.runtime
if newRuntime == nil {
// no runtime is invalid
return false
}
// if current goal state is deleted, it cannot be overwritten
// till the desired configuration version also changes
if currentRuntime.GetGoalState() == pbtask.TaskState_DELETED &&
newRuntime.GetGoalState() != currentRuntime.GetGoalState() {
if currentRuntime.GetDesiredConfigVersion() == newRuntime.GetDesiredConfigVersion() {
return false
}
}
if newRuntime.GetMesosTaskId() != nil {
if currentRuntime.GetMesosTaskId().GetValue() !=
newRuntime.GetMesosTaskId().GetValue() {
// Validate post migration, new runid is greater than previous one
if !validateMesosTaskID(newRuntime.GetMesosTaskId().GetValue(),
currentRuntime.GetMesosTaskId().GetValue()) {
return false
}
// mesos task id has changed
if newRuntime.GetState() == pbtask.TaskState_INITIALIZED {
return true
}
return false
}
}
// desired mesos task id should not have runID decrease at
// any time
if newRuntime.GetDesiredMesosTaskId() != nil &&
!validateMesosTaskID(newRuntime.GetDesiredMesosTaskId().GetValue(),
currentRuntime.GetDesiredMesosTaskId().GetValue()) {
return false
}
// if state update is not requested, then return true
if newRuntime.GetState() == currentRuntime.GetState() {
return true
}
//TBD replace if's with more structured checks
if util.IsPelotonStateTerminal(currentRuntime.GetState()) {
// cannot overwrite terminal state without changing the mesos task id
return false
}
if IsMesosOwnedState(newRuntime.GetState()) {
// update from mesos eventstream is ok from mesos states, resource manager states
// and from INITIALIZED and LAUNCHED states.
if IsMesosOwnedState(currentRuntime.GetState()) || IsResMgrOwnedState(currentRuntime.GetState()) {
return true
}
if currentRuntime.GetState() == pbtask.TaskState_INITIALIZED || currentRuntime.GetState() == pbtask.TaskState_LAUNCHED {
return true
}
// Update from KILLING state to only terminal states is allowed
if util.IsPelotonStateTerminal(newRuntime.GetState()) && currentRuntime.GetState() == pbtask.TaskState_KILLING {
return true
}
}
if IsResMgrOwnedState(newRuntime.GetState()) {
// update from resource manager evenstream is ok from resource manager states or INITIALIZED state
if IsResMgrOwnedState(currentRuntime.GetState()) {
return true
}
if currentRuntime.GetState() == pbtask.TaskState_INITIALIZED {
return true
}
}
if newRuntime.GetState() == pbtask.TaskState_LAUNCHED {
// update to LAUNCHED state from resource manager states and INITIALIZED state is ok
if IsResMgrOwnedState(currentRuntime.GetState()) {
return true
}
if currentRuntime.GetState() == pbtask.TaskState_INITIALIZED {
return true
}
}
if newRuntime.GetState() == pbtask.TaskState_KILLING {
// update to KILLING state from any non-terminal state is ok
return true
}
// any other state transition is invalid
return false
}