From 7fa1cff75e3562003a17fcc0ffab0b520976bda5 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Tue, 18 Feb 2014 09:34:14 +0100 Subject: [PATCH] Optimize empty transactions 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 --- .../impl/service/AbstractDataBroker.java | 2 +- .../common/impl/service/TwoPhaseCommit.java | 25 +++++++++++++------ 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/opendaylight/md-sal/sal-common-impl/src/main/java/org/opendaylight/controller/md/sal/common/impl/service/AbstractDataBroker.java b/opendaylight/md-sal/sal-common-impl/src/main/java/org/opendaylight/controller/md/sal/common/impl/service/AbstractDataBroker.java index bfffb594cb..ed186dcf31 100644 --- a/opendaylight/md-sal/sal-common-impl/src/main/java/org/opendaylight/controller/md/sal/common/impl/service/AbstractDataBroker.java +++ b/opendaylight/md-sal/sal-common-impl/src/main/java/org/opendaylight/controller/md/sal/common/impl/service/AbstractDataBroker.java @@ -408,7 +408,7 @@ public abstract class AbstractDataBroker

, D extends Object, DC Preconditions.checkNotNull(transaction); transaction.changeStatus(TransactionStatus.SUBMITED); final TwoPhaseCommit task = new TwoPhaseCommit(transaction, this); - ; + this.getSubmittedTransactionsCount().getAndIncrement(); return this.getExecutor().submit(task); } diff --git a/opendaylight/md-sal/sal-common-impl/src/main/java/org/opendaylight/controller/md/sal/common/impl/service/TwoPhaseCommit.java b/opendaylight/md-sal/sal-common-impl/src/main/java/org/opendaylight/controller/md/sal/common/impl/service/TwoPhaseCommit.java index e99fc0f24c..33de1d83da 100644 --- a/opendaylight/md-sal/sal-common-impl/src/main/java/org/opendaylight/controller/md/sal/common/impl/service/TwoPhaseCommit.java +++ b/opendaylight/md-sal/sal-common-impl/src/main/java/org/opendaylight/controller/md/sal/common/impl/service/TwoPhaseCommit.java @@ -61,6 +61,17 @@ public class TwoPhaseCommit

, 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. getRpcResult(true, TransactionStatus.COMMITED, + Collections. emptySet()); + } + final ImmutableList.Builder> listenersBuilder = ImmutableList.builder(); listenersBuilder.addAll(dataBroker.affectedListeners(changedPaths)); filterProbablyAffectedListeners(dataBroker.probablyAffectedListeners(changedPaths),listenersBuilder); @@ -211,14 +222,12 @@ public class TwoPhaseCommit

, D extends Object, DCL extends Dat @Override public void run() { for (final ListenerStateCapture listenerSet : listeners) { - { - DataChangeEvent changeEvent = listenerSet.createEvent(transaction); - for (final DataChangeListenerRegistration listener : listenerSet.getListeners()) { - try { - listener.getInstance().onDataChanged(changeEvent); - } catch (Exception e) { - log.error("Unhandled exception when invoking listener {}", listener); - } + DataChangeEvent changeEvent = listenerSet.createEvent(transaction); + for (final DataChangeListenerRegistration listener : listenerSet.getListeners()) { + try { + listener.getInstance().onDataChanged(changeEvent); + } catch (Exception e) { + log.error("Unhandled exception when invoking listener {}", listener, e); } } } -- 2.36.6