public PingPongTransactionChain(final Function<DOMTransactionChainListener, DOMTransactionChain> delegateFactory,
final DOMTransactionChainListener listener) {
this.listener = requireNonNull(listener);
- this.delegate = delegateFactory.apply(new DOMTransactionChainListener() {
+ delegate = delegateFactory.apply(new DOMTransactionChainListener() {
@Override
public void onTransactionChainFailed(final DOMTransactionChain chain,
final DOMDataTreeTransaction transaction, final Throwable cause) {
checkState(success, "Completed transaction %s while %s was submitted", tx, inflightTx);
final PingPongTransaction nextTx = READY_UPDATER.getAndSet(this, null);
- if (nextTx != null) {
+ if (nextTx == null) {
+ final PingPongTransaction local = shutdownTx;
+ if (local != null) {
+ processTransaction(local);
+ delegate.close();
+ shutdownTx = null;
+ }
+ } else {
processTransaction(nextTx);
- } else if (shutdownTx != null) {
- processTransaction(shutdownTx);
- delegate.close();
- shutdownTx = null;
}
}
@Override
public DOMDataTreeReadTransaction newReadOnlyTransaction() {
+ return new PingPongReadTransaction(allocateTransaction());
+ }
+
+ @Override
+ public DOMDataTreeReadWriteTransaction newReadWriteTransaction() {
final PingPongTransaction tx = allocateTransaction();
+ final DOMDataTreeReadWriteTransaction ret = new PingPongReadWriteTransaction(tx);
+ tx.recordFrontendTransaction(ret);
+ return ret;
+ }
- return new DOMDataTreeReadTransaction() {
- @Override
- public FluentFuture<Optional<NormalizedNode<?, ?>>> read(
- final LogicalDatastoreType store, final YangInstanceIdentifier path) {
- return tx.getTransaction().read(store, path);
- }
+ @Override
+ public DOMDataTreeWriteTransaction newWriteOnlyTransaction() {
+ return newReadWriteTransaction();
+ }
- @Override
- public FluentFuture<Boolean> exists(final LogicalDatastoreType store, final YangInstanceIdentifier path) {
- return tx.getTransaction().exists(store, path);
- }
+ private final class PingPongReadTransaction implements DOMDataTreeReadTransaction {
+ private final @NonNull PingPongTransaction tx;
- @Override
- public Object getIdentifier() {
- return tx.getTransaction().getIdentifier();
- }
+ PingPongReadTransaction(final PingPongTransaction tx) {
+ this.tx = requireNonNull(tx);
+ }
- @Override
- public void close() {
- readyTransaction(tx);
- }
- };
+ @Override
+ public FluentFuture<Optional<NormalizedNode>> read(final LogicalDatastoreType store,
+ final YangInstanceIdentifier path) {
+ return tx.getTransaction().read(store, path);
+ }
+
+ @Override
+ public FluentFuture<Boolean> exists(final LogicalDatastoreType store, final YangInstanceIdentifier path) {
+ return tx.getTransaction().exists(store, path);
+ }
+
+ @Override
+ public Object getIdentifier() {
+ return tx.getTransaction().getIdentifier();
+ }
+
+ @Override
+ public void close() {
+ readyTransaction(tx);
+ }
}
- @Override
- public DOMDataTreeReadWriteTransaction newReadWriteTransaction() {
- final PingPongTransaction tx = allocateTransaction();
- final DOMDataTreeReadWriteTransaction ret = new ForwardingDOMDataReadWriteTransaction() {
- private boolean isOpen = true;
+ private final class PingPongReadWriteTransaction extends ForwardingDOMDataReadWriteTransaction {
+ private final @NonNull PingPongTransaction tx;
- @Override
- protected DOMDataTreeReadWriteTransaction delegate() {
- return tx.getTransaction();
- }
+ private boolean isOpen = true;
- @Override
- public FluentFuture<? extends CommitInfo> commit() {
- readyTransaction(tx);
- isOpen = false;
- return tx.getCommitFuture().transform(ignored -> CommitInfo.empty(), MoreExecutors.directExecutor());
- }
+ PingPongReadWriteTransaction(final PingPongTransaction tx) {
+ this.tx = requireNonNull(tx);
+ }
- @Override
- public boolean cancel() {
- if (isOpen) {
- cancelTransaction(tx, this);
- isOpen = false;
- return true;
- }
-
- return false;
+ @Override
+ public FluentFuture<? extends CommitInfo> commit() {
+ readyTransaction(tx);
+ isOpen = false;
+ return tx.getCommitFuture().transform(ignored -> CommitInfo.empty(), MoreExecutors.directExecutor());
+ }
+
+ @Override
+ public boolean cancel() {
+ if (isOpen) {
+ cancelTransaction(tx, this);
+ isOpen = false;
+ return true;
}
- };
- tx.recordFrontendTransaction(ret);
- return ret;
- }
+ return false;
+ }
- @Override
- public DOMDataTreeWriteTransaction newWriteOnlyTransaction() {
- return newReadWriteTransaction();
+ @Override
+ protected DOMDataTreeReadWriteTransaction delegate() {
+ return tx.getTransaction();
+ }
}
}