Repository: aurora Updated Branches: refs/heads/master 7c78519ef -> dfd06771a
Allow transitions from any state to STOPPED in CallOrderEnforcingStorage - Allow transitions from any state to STOPPED in CallOrderEnforcingStorage, including adding a STOPPED -> STOPPED transition so stop() can be used idempotent. - Use the StateMachines.checkState method (I wasn't sure if the current checkInState was designed for anything other than throwing a TransientStorageException) Bugs closed: AURORA-1950 Reviewed at https://reviews.apache.org/r/62621/ Project: http://git-wip-us.apache.org/repos/asf/aurora/repo Commit: http://git-wip-us.apache.org/repos/asf/aurora/commit/dfd06771 Tree: http://git-wip-us.apache.org/repos/asf/aurora/tree/dfd06771 Diff: http://git-wip-us.apache.org/repos/asf/aurora/diff/dfd06771 Branch: refs/heads/master Commit: dfd06771a5e4c63f2e3407cdf3bbb20201a7fbc1 Parents: 7c78519 Author: Jordan Ly <[email protected]> Authored: Fri Sep 29 00:18:14 2017 +0200 Committer: Stephan Erb <[email protected]> Committed: Fri Sep 29 00:18:14 2017 +0200 ---------------------------------------------------------------------- .../storage/CallOrderEnforcingStorage.java | 34 +++++++++++++------- .../aurora/scheduler/storage/Storage.java | 4 +++ 2 files changed, 27 insertions(+), 11 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/aurora/blob/dfd06771/src/main/java/org/apache/aurora/scheduler/storage/CallOrderEnforcingStorage.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/aurora/scheduler/storage/CallOrderEnforcingStorage.java b/src/main/java/org/apache/aurora/scheduler/storage/CallOrderEnforcingStorage.java index 2a5ec9c..1b10ec5 100644 --- a/src/main/java/org/apache/aurora/scheduler/storage/CallOrderEnforcingStorage.java +++ b/src/main/java/org/apache/aurora/scheduler/storage/CallOrderEnforcingStorage.java @@ -63,9 +63,19 @@ public class CallOrderEnforcingStorage implements NonVolatileStorage { private final StateMachine<State> stateMachine = StateMachine.<State>builder("storage") .logTransitions() .initialState(State.CONSTRUCTED) - .addState(State.CONSTRUCTED, State.PREPARED) - .addState(State.PREPARED, State.READY) - .addState(State.READY, State.STOPPED) + .addState( + State.CONSTRUCTED, + State.PREPARED, State.STOPPED) + .addState( + State.PREPARED, + State.READY, State.STOPPED) + .addState( + State.READY, + State.STOPPED) + .addState( + State.STOPPED, + // Allow cycles in STOPPED to prevent throwing and avoid the need for call-site checking. + State.STOPPED) .build(); @Inject @@ -74,22 +84,24 @@ public class CallOrderEnforcingStorage implements NonVolatileStorage { this.eventSink = requireNonNull(eventSink); } - private void checkInState(State state) throws StorageException { - if (stateMachine.getState() != state) { - throw new TransientStorageException("Storage is not " + state); + private void checkState(State state) throws StorageException { + try { + stateMachine.checkState(state); + } catch (IllegalStateException e) { + throw new TransientStorageException("Storage is not " + state, e); } } @Override public void prepare() throws StorageException { - checkInState(State.CONSTRUCTED); + checkState(State.CONSTRUCTED); wrapped.prepare(); stateMachine.transition(State.PREPARED); } @Override public void start(Quiet initializationLogic) throws StorageException { - checkInState(State.PREPARED); + checkState(State.PREPARED); wrapped.start(initializationLogic); stateMachine.transition(State.READY); wrapped.write((NoResult.Quiet) storeProvider -> { @@ -109,20 +121,20 @@ public class CallOrderEnforcingStorage implements NonVolatileStorage { @Override public <T, E extends Exception> T read(Work<T, E> work) throws StorageException, E { - checkInState(State.READY); + checkState(State.READY); return wrapped.read(work); } @Override public <T, E extends Exception> T write(MutateWork<T, E> work) throws StorageException, E { - checkInState(State.READY); + checkState(State.READY); return wrapped.write(work); } @Override public void snapshot() throws StorageException { - checkInState(State.READY); + checkState(State.READY); wrapped.snapshot(); } http://git-wip-us.apache.org/repos/asf/aurora/blob/dfd06771/src/main/java/org/apache/aurora/scheduler/storage/Storage.java ---------------------------------------------------------------------- diff --git a/src/main/java/org/apache/aurora/scheduler/storage/Storage.java b/src/main/java/org/apache/aurora/scheduler/storage/Storage.java index 859c964..6c67669 100644 --- a/src/main/java/org/apache/aurora/scheduler/storage/Storage.java +++ b/src/main/java/org/apache/aurora/scheduler/storage/Storage.java @@ -190,6 +190,10 @@ public interface Storage { * Indicates that stable storage is temporarily unavailable. */ class TransientStorageException extends StorageException { + public TransientStorageException(String message, Throwable cause) { + super(message, cause); + } + public TransientStorageException(String message) { super(message); }
