BUG-5280: expand ShardDataTree to cover transaction mechanics
[controller.git] / opendaylight / md-sal / sal-distributed-datastore / src / main / java / org / opendaylight / controller / cluster / datastore / ShardDataTreeCohort.java
index 47876123cfa7b716edae5b72e74ee50c7faacd12..0a3a6ae177d7827cf2afb6441f3f6006a9209795 100644 (file)
@@ -8,11 +8,29 @@
 package org.opendaylight.controller.cluster.datastore;
 
 import com.google.common.annotations.VisibleForTesting;
+import com.google.common.primitives.UnsignedLong;
+import com.google.common.util.concurrent.FutureCallback;
 import com.google.common.util.concurrent.ListenableFuture;
+import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier;
+import org.opendaylight.yangtools.concepts.Identifiable;
+import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeCandidate;
 import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeCandidateTip;
 import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeModification;
 
-public abstract class ShardDataTreeCohort {
+public abstract class ShardDataTreeCohort implements Identifiable<TransactionIdentifier> {
+    public enum State {
+        READY,
+        CAN_COMMIT_PENDING,
+        CAN_COMMIT_COMPLETE,
+        PRE_COMMIT_PENDING,
+        PRE_COMMIT_COMPLETE,
+        COMMIT_PENDING,
+
+        ABORTED,
+        COMMITTED,
+        FAILED,
+    }
+
     ShardDataTreeCohort() {
         // Prevent foreign instantiation
     }
@@ -20,15 +38,23 @@ public abstract class ShardDataTreeCohort {
     // FIXME: This leaks internal state generated in preCommit,
     // should be result of canCommit
     abstract DataTreeCandidateTip getCandidate();
+
     abstract DataTreeModification getDataTreeModification();
 
     // FIXME: Should return rebased DataTreeCandidateTip
     @VisibleForTesting
-    public abstract ListenableFuture<Boolean> canCommit();
+    public abstract void canCommit(FutureCallback<Void> callback);
+
     @VisibleForTesting
-    public abstract ListenableFuture<Void> preCommit();
+    public abstract void preCommit(FutureCallback<DataTreeCandidate> callback);
+
     @VisibleForTesting
     public abstract ListenableFuture<Void> abort();
+
     @VisibleForTesting
-    public abstract ListenableFuture<Void> commit();
+    public abstract void commit(FutureCallback<UnsignedLong> callback);
+
+    public abstract boolean isFailed();
+
+    public abstract State getState();
 }