From b72468698fd0ec9f29b6533bd367b485775e744d Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Wed, 20 Feb 2019 14:47:12 +0100 Subject: [PATCH] Improve aborted transaction logging The fact that a snapshot is recorded does not mean it has not been closed -- in fact write-aspect transactions do not actively remove themselves. When we prune recorded snapshots on transaction chain close, we need to pay attention to the return value of abort(), as that is indicating whether we should in fact warn about an unclosed transaction. This means that the actual set of transactions we warn about cannot be determined until we have traversed all recorded snapshots, hence modify the logic to record the identifiers that were in fact aborted and report all of them in a single message along with a stack trace so the offender may be identifier. Change-Id: I8b176f1990c9aa9c056cd03203ea50fb9b9549a0 JIRA: CONTROLLER-1886 Signed-off-by: Robert Varga (cherry picked from commit 21eed79684671b9a44e34edbd589419cb9bb6087) --- .../databroker/ClientBackedTransactionChain.java | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/databroker/ClientBackedTransactionChain.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/databroker/ClientBackedTransactionChain.java index 4168fc9acd..81174cbcd3 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/databroker/ClientBackedTransactionChain.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/databroker/ClientBackedTransactionChain.java @@ -8,9 +8,12 @@ package org.opendaylight.controller.cluster.databroker; import com.google.common.base.Preconditions; +import java.util.ArrayList; +import java.util.List; import java.util.Map; import java.util.WeakHashMap; import javax.annotation.concurrent.GuardedBy; +import org.opendaylight.controller.cluster.access.concepts.TransactionIdentifier; import org.opendaylight.controller.cluster.databroker.actors.dds.AbstractClientHandle; import org.opendaylight.controller.cluster.databroker.actors.dds.ClientLocalHistory; import org.opendaylight.controller.cluster.databroker.actors.dds.ClientSnapshot; @@ -59,12 +62,19 @@ final class ClientBackedTransactionChain implements DOMStoreTransactionChain { @Override public synchronized void close() { + final List abortedSnapshots = new ArrayList<>(); for (AbstractClientHandle snap : openSnapshots.keySet()) { - LOG.warn("Aborting unclosed transaction {}", snap.getIdentifier()); - snap.abort(); + final TransactionIdentifier id = snap.getIdentifier(); + LOG.debug("Aborting recorded transaction {}", id); + if (snap.abort()) { + abortedSnapshots.add(id); + } } openSnapshots.clear(); + if (!abortedSnapshots.isEmpty()) { + LOG.warn("Aborted unclosed transactions {}", abortedSnapshots, new Throwable("at")); + } history.close(); } -- 2.36.6