Optimize empty transactions 84/5384/3
authorRobert Varga <rovarga@cisco.com>
Tue, 18 Feb 2014 08:34:14 +0000 (09:34 +0100)
committerRobert Varga <rovarga@cisco.com>
Tue, 18 Feb 2014 08:48:32 +0000 (09:48 +0100)
This is a micro-optimization: if we know there are no affected paths,
we used to spin an entire transaction -- which ended up revalidating an
empty delta. Let's skip the entire circus and proceed to commit
directly.

Change-Id: Ia6250663c01348dd08610c2a44dc01743761a05c
Signed-off-by: Robert Varga <rovarga@cisco.com>
opendaylight/md-sal/sal-common-impl/src/main/java/org/opendaylight/controller/md/sal/common/impl/service/AbstractDataBroker.java
opendaylight/md-sal/sal-common-impl/src/main/java/org/opendaylight/controller/md/sal/common/impl/service/TwoPhaseCommit.java

index bfffb594cb6fd73d9654d402be5a66aa076eaa30..ed186dcf314fd0ea075ad81bc3b3e19fb942a48b 100644 (file)
@@ -408,7 +408,7 @@ public abstract class AbstractDataBroker<P extends Path<P>, D extends Object, DC
         Preconditions.checkNotNull(transaction);
         transaction.changeStatus(TransactionStatus.SUBMITED);
         final TwoPhaseCommit<P, D, DCL> task = new TwoPhaseCommit<P, D, DCL>(transaction, this);
-        ;
+
         this.getSubmittedTransactionsCount().getAndIncrement();
         return this.getExecutor().submit(task);
     }
index e99fc0f24c16d424524c2d1642d2109a5193c173..33de1d83dae3cf40ff875625b979a3182783cf20 100644 (file)
@@ -61,6 +61,17 @@ public class TwoPhaseCommit<P extends Path<P>, D extends Object, DCL extends Dat
 
         log.trace("Transaction: {} Affected Subtrees:", transactionId, changedPaths);
 
+        // The transaction has no effects, let's just shortcut it
+        if (changedPaths.isEmpty()) {
+            dataBroker.getFinishedTransactionsCount().getAndIncrement();
+            transaction.changeStatus(TransactionStatus.COMMITED);
+
+            log.trace("Transaction: {} Finished successfully (no effects).", transactionId);
+
+            return Rpcs.<TransactionStatus> getRpcResult(true, TransactionStatus.COMMITED,
+                    Collections.<RpcError> emptySet());
+        }
+
         final ImmutableList.Builder<ListenerStateCapture<P, D, DCL>> listenersBuilder = ImmutableList.builder();
         listenersBuilder.addAll(dataBroker.affectedListeners(changedPaths));
         filterProbablyAffectedListeners(dataBroker.probablyAffectedListeners(changedPaths),listenersBuilder);
@@ -211,14 +222,12 @@ public class TwoPhaseCommit<P extends Path<P>, D extends Object, DCL extends Dat
             @Override
             public void run() {
                 for (final ListenerStateCapture<P, D, DCL> listenerSet : listeners) {
-                    {
-                        DataChangeEvent<P, D> changeEvent = listenerSet.createEvent(transaction);
-                        for (final DataChangeListenerRegistration<P, D, DCL> listener : listenerSet.getListeners()) {
-                            try {
-                                listener.getInstance().onDataChanged(changeEvent);
-                            } catch (Exception e) {
-                                log.error("Unhandled exception when invoking listener {}", listener);
-                            }
+                    DataChangeEvent<P, D> changeEvent = listenerSet.createEvent(transaction);
+                    for (final DataChangeListenerRegistration<P, D, DCL> listener : listenerSet.getListeners()) {
+                        try {
+                            listener.getInstance().onDataChanged(changeEvent);
+                        } catch (Exception e) {
+                            log.error("Unhandled exception when invoking listener {}", listener, e);
                         }
                     }
                 }