BUG-5280: add basic concept of ClientSnapshot
[controller.git] / opendaylight / md-sal / sal-distributed-datastore / src / main / java / org / opendaylight / controller / cluster / databroker / actors / dds / ClientLocalHistory.java
index ac1872835ac37a612acdd0e9401c57c17f789c6a..26b03e39b092c57d00876b030df15d1aeda015e8 100644 (file)
@@ -39,38 +39,50 @@ public final class ClientLocalHistory extends AbstractClientHistory implements A
         }
     }
 
-    @Override
-    ClientTransaction doCreateTransaction() {
+    private State ensureIdleState() {
         final State local = state();
         Preconditions.checkState(local == State.IDLE, "Local history %s state is %s", this, local);
-        updateState(local, State.TX_OPEN);
+        return local;
+    }
+
+    @Override
+    ClientSnapshot doCreateSnapshot() {
+        ensureIdleState();
+        return new ClientSnapshot(this, new TransactionIdentifier(getIdentifier(), nextTx()));
+    }
 
+    @Override
+    ClientTransaction doCreateTransaction() {
+        updateState(ensureIdleState(), State.TX_OPEN);
         return new ClientTransaction(this, new TransactionIdentifier(getIdentifier(), nextTx()));
     }
 
     @Override
-    void onTransactionAbort(final TransactionIdentifier txId) {
-        final State local = state();
-        if (local == State.TX_OPEN) {
-            updateState(local, State.IDLE);
+    void onTransactionAbort(final AbstractClientHandle<?> snap) {
+        if (snap instanceof ClientTransaction) {
+            final State local = state();
+            if (local == State.TX_OPEN) {
+                updateState(local, State.IDLE);
+            }
         }
 
-        super.onTransactionAbort(txId);
+        super.onTransactionAbort(snap);
     }
 
     @Override
-    AbstractTransactionCommitCohort onTransactionReady(final TransactionIdentifier txId,
+    AbstractTransactionCommitCohort onTransactionReady(final ClientTransaction tx,
             final AbstractTransactionCommitCohort cohort) {
+
         final State local = state();
         switch (local) {
             case CLOSED:
-                return super.onTransactionReady(txId, cohort);
+                return super.onTransactionReady(tx, cohort);
             case IDLE:
                 throw new IllegalStateException(String.format("Local history %s is idle when readying transaction %s",
-                    this, txId));
+                    this, tx.getIdentifier()));
             case TX_OPEN:
                 updateState(local, State.IDLE);
-                return super.onTransactionReady(txId, cohort);
+                return super.onTransactionReady(tx, cohort);
             default:
                 throw new IllegalStateException(String.format("Local history %s in unhandled state %s", this, local));