BUG-5280: add frontend state lifecycle
[controller.git] / opendaylight / md-sal / sal-distributed-datastore / src / main / java / org / opendaylight / controller / cluster / datastore / AbstractShardDataTreeTransaction.java
index dd8ec0b12ab30f3a947ac1d795347772cd119e0d..56e11c124984c6042f269cced30b06322d9e9475 100644 (file)
@@ -10,7 +10,11 @@ package org.opendaylight.controller.cluster.datastore;
 import com.google.common.base.MoreObjects;
 import com.google.common.base.Preconditions;
 import javax.annotation.concurrent.NotThreadSafe;
+import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier;
+import org.opendaylight.yangtools.concepts.Identifiable;
 import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeSnapshot;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * Abstract base for transactions running on SharrdDataTree.
@@ -18,16 +22,32 @@ import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeSnapshot;
  * @param <T> Backing transaction type.
  */
 @NotThreadSafe
-abstract class AbstractShardDataTreeTransaction<T extends DataTreeSnapshot> {
+abstract class AbstractShardDataTreeTransaction<T extends DataTreeSnapshot>
+        implements Identifiable<TransactionIdentifier> {
+    private static final Logger LOG = LoggerFactory.getLogger(AbstractShardDataTreeTransaction.class);
+
+    private final ShardDataTreeTransactionParent parent;
+    private final TransactionIdentifier id;
     private final T snapshot;
-    private final String id;
+
     private boolean closed;
 
-    protected AbstractShardDataTreeTransaction(final String id, final T snapshot) {
+    AbstractShardDataTreeTransaction(final ShardDataTreeTransactionParent parent, final TransactionIdentifier id,
+        final T snapshot) {
+        this.parent = Preconditions.checkNotNull(parent);
         this.snapshot = Preconditions.checkNotNull(snapshot);
         this.id = Preconditions.checkNotNull(id);
     }
 
+    @Override
+    public final TransactionIdentifier getIdentifier() {
+        return id;
+    }
+
+    final ShardDataTreeTransactionParent getParent() {
+        return parent;
+    }
+
     final T getSnapshot() {
         return snapshot;
     }
@@ -50,10 +70,21 @@ abstract class AbstractShardDataTreeTransaction<T extends DataTreeSnapshot> {
         return true;
     }
 
+    final void abort(final Runnable callback) {
+        Preconditions.checkState(close(), "Transaction is already closed");
+        parent.abortTransaction(this, callback);
+    }
+
+    final void purge(final Runnable callback) {
+        if (!closed) {
+            LOG.warn("Purging unclosed transaction {}", id);
+        }
+        parent.purgeTransaction(id, callback);
+    }
+
     @Override
     public final String toString() {
-        return MoreObjects.toStringHelper(this).add("id", id).add("closed", closed).add("snapshot", snapshot).toString();
+        return MoreObjects.toStringHelper(this).add("id", id).add("closed", closed).add("snapshot", snapshot)
+                .toString();
     }
-
-    abstract void abort();
 }