diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/state/MultipleArcTransition.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/state/MultipleArcTransition.java index 3923016..f1664c5 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/state/MultipleArcTransition.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/state/MultipleArcTransition.java @@ -39,6 +39,6 @@ * state may change. * @param event causal event */ - public STATE transition(OPERAND operand, EVENT event); + public STATE transition(OPERAND operand, EVENT event) throws TransitionFailException; } diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/state/SingleArcTransition.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/state/SingleArcTransition.java index 6f60d08..b27fd85 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/state/SingleArcTransition.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/state/SingleArcTransition.java @@ -35,6 +35,6 @@ * state may change. * @param event causal event */ - public void transition(OPERAND operand, EVENT event); + public void transition(OPERAND operand, EVENT event) throws TransitionFailException; } diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/state/StateMachineFactory.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/state/StateMachineFactory.java index 55ac4cf..0c05750 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/state/StateMachineFactory.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/state/StateMachineFactory.java @@ -289,7 +289,7 @@ public StateMachineFactory(STATE defaultInitialState) { */ private STATE doTransition (OPERAND operand, STATE oldState, EVENTTYPE eventType, EVENT event) - throws InvalidStateTransitonException { + throws InvalidStateTransitonException, TransitionFailException { // We can assume that stateMachineTable is non-null because we call // maybeMakeStateMachineTable() when we build an InnerStateMachine , // and this code only gets called from inside a working InnerStateMachine . @@ -340,7 +340,7 @@ private void makeStateMachineTable() { private interface Transition, EVENTTYPE extends Enum, EVENT> { STATE doTransition(OPERAND operand, STATE oldState, - EVENT event, EVENTTYPE eventType); + EVENT event, EVENTTYPE eventType) throws TransitionFailException; } private class SingleInternalArc @@ -357,7 +357,7 @@ STATE doTransition(OPERAND operand, STATE oldState, @Override public STATE doTransition(OPERAND operand, STATE oldState, - EVENT event, EVENTTYPE eventType) { + EVENT event, EVENTTYPE eventType) throws TransitionFailException { if (hook != null) { hook.transition(operand, event); } @@ -381,7 +381,7 @@ public STATE doTransition(OPERAND operand, STATE oldState, @Override public STATE doTransition(OPERAND operand, STATE oldState, EVENT event, EVENTTYPE eventType) - throws InvalidStateTransitonException { + throws InvalidStateTransitonException, TransitionFailException { STATE postState = hook.transition(operand, event); if (!validPostStates.contains(postState)) { @@ -406,7 +406,12 @@ public STATE doTransition(OPERAND operand, STATE oldState, */ public StateMachine make(OPERAND operand, STATE initialState) { - return new InternalStateMachine(operand, initialState); + return new InternalStateMachine(operand, initialState, null); + } + + public StateMachine + make(OPERAND operand, STATE initialState, TransitionFailCallback callback) { + return new InternalStateMachine(operand, initialState, callback); } /* @@ -421,20 +426,31 @@ public STATE doTransition(OPERAND operand, STATE oldState, * */ public StateMachine make(OPERAND operand) { - return new InternalStateMachine(operand, defaultInitialState); + return new InternalStateMachine(operand, defaultInitialState, null); + } + + public StateMachine make(OPERAND operand, + TransitionFailCallback callback) { + return new InternalStateMachine(operand, defaultInitialState, callback); + } + + public interface TransitionFailCallback { + public void onFail(STATE curState, EVENT event, TransitionFailException e); } private class InternalStateMachine implements StateMachine { private final OPERAND operand; private STATE currentState; + private TransitionFailCallback failCallback; - InternalStateMachine(OPERAND operand, STATE initialState) { + InternalStateMachine(OPERAND operand, STATE initialState, TransitionFailCallback failCallback) { this.operand = operand; this.currentState = initialState; if (!optimized) { maybeMakeStateMachineTable(); } + this.failCallback = failCallback; } @Override @@ -445,8 +461,16 @@ public synchronized STATE getCurrentState() { @Override public synchronized STATE doTransition(EVENTTYPE eventType, EVENT event) throws InvalidStateTransitonException { - currentState = StateMachineFactory.this.doTransition - (operand, currentState, eventType, event); + try { + currentState = StateMachineFactory.this.doTransition + (operand, currentState, eventType, event); + } catch (TransitionFailException e) { + if (failCallback != null) { + failCallback.onFail(currentState, event, e); + } else { + throw new RuntimeException("no callback for TransitionFailException", e); + } + } return currentState; } } diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/state/TransitionFailException.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/state/TransitionFailException.java new file mode 100644 index 0000000..4d8f60b --- /dev/null +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/state/TransitionFailException.java @@ -0,0 +1,38 @@ +/** + * 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.hadoop.yarn.state; + + +/** + * Wrap the exception happens in state machine transition + * + */ +public class TransitionFailException extends Exception { + + private static final long serialVersionUID = -411751884355271818L; + + public TransitionFailException(String message, Throwable cause) { + super(message, cause); + } + + public TransitionFailException(Throwable cause) { + super(cause); + } + +}