Optimize transaction collection 95/60295/3
authorRobert Varga <robert.varga@pantheon.tech>
Thu, 13 Jul 2017 15:34:56 +0000 (17:34 +0200)
committerTom Pantelis <tompantelis@gmail.com>
Fri, 14 Jul 2017 17:18:12 +0000 (17:18 +0000)
For cases when we have a single transaction it is not necessary
to use Futures.allAsList(). Discover this property and reuse returned
future directly.

Change-Id: I10c2d0371d8bc2c2c0585de41a114adcb7250f3c
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
dom/mdsal-dom-broker/src/main/java/org/opendaylight/mdsal/dom/broker/ShardedDOMDataTreeWriteTransaction.java

index 319b9ed2198085ef69eb9bff1e2e6d557d5aaa1b..5068e87a6d7244dfb9419701e416368a53b69252 100644 (file)
@@ -17,7 +17,6 @@ import com.google.common.util.concurrent.MoreExecutors;
 import com.google.common.util.concurrent.SettableFuture;
 import java.util.ArrayDeque;
 import java.util.Deque;
-import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.concurrent.atomic.AtomicLong;
@@ -133,17 +132,29 @@ final class ShardedDOMDataTreeWriteTransaction implements DOMDataTreeCursorAware
 
     void doSubmit(final Consumer<ShardedDOMDataTreeWriteTransaction> success,
             final BiConsumer<ShardedDOMDataTreeWriteTransaction, Throwable> failure) {
-
-        final ListenableFuture<List<Void>> listListenableFuture = Futures.allAsList(
-            transactions.values().stream().map(tx -> {
-                LOG.debug("Readying tx {}", identifier);
+        LOG.debug("Readying tx {}", identifier);
+
+        final ListenableFuture<?> future;
+        switch (transactions.size()) {
+            case 0:
+                success.accept(this);
+                return;
+            case 1: {
+                final DOMDataTreeShardWriteTransaction tx = transactions.values().iterator().next();
                 tx.ready();
-                return tx.submit();
-            }).collect(Collectors.toList()));
+                future = tx.submit();
+                break;
+            }
+            default:
+                future = Futures.allAsList(transactions.values().stream().map(tx -> {
+                    tx.ready();
+                    return tx.submit();
+                }).collect(Collectors.toList()));
+        }
 
-        Futures.addCallback(listListenableFuture, new FutureCallback<List<Void>>() {
+        Futures.addCallback(future, new FutureCallback<Object>() {
             @Override
-            public void onSuccess(final List<Void> result) {
+            public void onSuccess(final Object result) {
                 success.accept(ShardedDOMDataTreeWriteTransaction.this);
             }