X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;ds=sidebyside;f=opendaylight%2Fmd-sal%2Fsamples%2Fclustering-test-app%2Fprovider%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fclustering%2Fit%2Fprovider%2Fimpl%2FIdIntsListener.java;h=ed93b380e3f31fc060e1d599e7814879b791f1ee;hb=5d18e15c0dd806791414e069fffdf4cb273688e3;hp=3e644393f163975fb13ab220da40b2e80ab00fda;hpb=e05ce1d480cb463571e17cceb305290d6134bfbb;p=controller.git diff --git a/opendaylight/md-sal/samples/clustering-test-app/provider/src/main/java/org/opendaylight/controller/clustering/it/provider/impl/IdIntsListener.java b/opendaylight/md-sal/samples/clustering-test-app/provider/src/main/java/org/opendaylight/controller/clustering/it/provider/impl/IdIntsListener.java index 3e644393f1..ed93b380e3 100644 --- a/opendaylight/md-sal/samples/clustering-test-app/provider/src/main/java/org/opendaylight/controller/clustering/it/provider/impl/IdIntsListener.java +++ b/opendaylight/md-sal/samples/clustering-test-app/provider/src/main/java/org/opendaylight/controller/clustering/it/provider/impl/IdIntsListener.java @@ -8,17 +8,27 @@ package org.opendaylight.controller.clustering.it.provider.impl; +import static org.opendaylight.controller.clustering.it.provider.impl.AbstractTransactionHandler.ITEM; + import com.google.common.base.Preconditions; import com.google.common.util.concurrent.SettableFuture; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.util.Collection; +import java.util.HashMap; +import java.util.Map; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicLong; import javax.annotation.Nonnull; import org.opendaylight.controller.md.sal.dom.api.ClusteredDOMDataTreeChangeListener; +import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; +import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates; +import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode; +import org.opendaylight.yangtools.yang.data.api.schema.MapNode; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; import org.opendaylight.yangtools.yang.data.api.schema.tree.DataTreeCandidate; import org.slf4j.Logger; @@ -29,10 +39,11 @@ public class IdIntsListener implements ClusteredDOMDataTreeChangeListener { private static final Logger LOG = LoggerFactory.getLogger(IdIntsListener.class); private static final long SECOND_AS_NANO = 1000000000; - private NormalizedNode localCopy = null; + private volatile NormalizedNode localCopy; private final AtomicLong lastNotifTimestamp = new AtomicLong(0); private ScheduledExecutorService executorService; private ScheduledFuture scheduledFuture; + private final AtomicBoolean loggedIgnoredNotificationDiff = new AtomicBoolean(); @Override public void onDataTreeChanged(@Nonnull final Collection changes) { @@ -55,7 +66,8 @@ public class IdIntsListener implements ClusteredDOMDataTreeChangeListener { if (localCopy == null || checkEqual(change.getRootNode().getDataBefore().get())) { localCopy = change.getRootNode().getDataAfter().get(); } else { - LOG.warn("Ignoring notification."); + LOG.warn("Ignoring notification {}", loggedIgnoredNotificationDiff.compareAndSet(false, true) + ? diffWithLocalCopy(change.getRootNode().getDataBefore().get()) : ""); LOG.trace("Ignored notification content: {}", change); } } else { @@ -72,6 +84,11 @@ public class IdIntsListener implements ClusteredDOMDataTreeChangeListener { return localCopy.equals(expected); } + @SuppressFBWarnings("BC_UNCONFIRMED_CAST") + public String diffWithLocalCopy(final NormalizedNode expected) { + return diffNodes((MapNode)expected, (MapNode)localCopy); + } + public Future tryFinishProcessing() { executorService = Executors.newSingleThreadScheduledExecutor(); final SettableFuture settableFuture = SettableFuture.create(); @@ -81,6 +98,44 @@ public class IdIntsListener implements ClusteredDOMDataTreeChangeListener { return settableFuture; } + public static String diffNodes(final MapNode expected, final MapNode actual) { + StringBuilder builder = new StringBuilder("MapNodes diff:"); + + final YangInstanceIdentifier.NodeIdentifier itemNodeId = new YangInstanceIdentifier.NodeIdentifier(ITEM); + + Map expIdIntMap = new HashMap<>(); + expected.getValue().forEach(node -> expIdIntMap.put(node.getIdentifier(), node)); + + actual.getValue().forEach(actIdInt -> { + final MapEntryNode expIdInt = expIdIntMap.remove(actIdInt.getIdentifier()); + if (expIdInt == null) { + builder.append('\n').append(" Unexpected id-int entry for ").append(actIdInt.getIdentifier()); + return; + } + + Map expItemMap = new HashMap<>(); + ((MapNode)expIdInt.getChild(itemNodeId).get()).getValue() + .forEach(node -> expItemMap.put(node.getIdentifier(), node)); + + ((MapNode)actIdInt.getChild(itemNodeId).get()).getValue().forEach(actItem -> { + final MapEntryNode expItem = expItemMap.remove(actItem.getIdentifier()); + if (expItem == null) { + builder.append('\n').append(" Unexpected item entry ").append(actItem.getIdentifier()) + .append(" for id-int entry ").append(actIdInt.getIdentifier()); + } + }); + + expItemMap.values().forEach(node -> builder.append('\n') + .append(" Actual is missing item entry ").append(node.getIdentifier()) + .append(" for id-int entry ").append(actIdInt.getIdentifier())); + }); + + expIdIntMap.values().forEach(node -> builder.append('\n') + .append(" Actual is missing id-int entry for ").append(node.getIdentifier())); + + return builder.toString(); + } + private class CheckFinishedTask implements Runnable { private final SettableFuture future;