X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=dom%2Fmdsal-dom-spi%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fmdsal%2Fdom%2Fspi%2FPingPongTransactionChain.java;h=ec2b5a2d5eacc3d4b7f70dc93061992217ca16df;hb=a5b5d9b7882531440d4c7335cd917b1e00075bc1;hp=b9fd8ec266c2f159be89905de1b9b64ce24679aa;hpb=3304ba5005a3b0b9d3cdd030badd2ee92713920c;p=mdsal.git diff --git a/dom/mdsal-dom-spi/src/main/java/org/opendaylight/mdsal/dom/spi/PingPongTransactionChain.java b/dom/mdsal-dom-spi/src/main/java/org/opendaylight/mdsal/dom/spi/PingPongTransactionChain.java index b9fd8ec266..ec2b5a2d5e 100644 --- a/dom/mdsal-dom-spi/src/main/java/org/opendaylight/mdsal/dom/spi/PingPongTransactionChain.java +++ b/dom/mdsal-dom-spi/src/main/java/org/opendaylight/mdsal/dom/spi/PingPongTransactionChain.java @@ -92,7 +92,7 @@ public final class PingPongTransactionChain implements DOMTransactionChain { public PingPongTransactionChain(final Function 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) { @@ -267,12 +267,15 @@ public final class PingPongTransactionChain implements DOMTransactionChain { 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; } } @@ -401,68 +404,81 @@ public final class PingPongTransactionChain implements DOMTransactionChain { @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>> read( - final LogicalDatastoreType store, final YangInstanceIdentifier path) { - return tx.getTransaction().read(store, path); - } + @Override + public DOMDataTreeWriteTransaction newWriteOnlyTransaction() { + return newReadWriteTransaction(); + } - @Override - public FluentFuture 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> read(final LogicalDatastoreType store, + final YangInstanceIdentifier path) { + return tx.getTransaction().read(store, path); + } + + @Override + public FluentFuture 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 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 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(); + } } }