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.
@NotThreadSafe
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 boolean closed;
- AbstractShardDataTreeTransaction(final TransactionIdentifier 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);
}
return id;
}
+ final ShardDataTreeTransactionParent getParent() {
+ return parent;
+ }
+
final T getSnapshot() {
return snapshot;
}
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();
}
-
- abstract void abort();
}