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);
     }

Reply via email to