X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=opendaylight%2Fmd-sal%2Fsamples%2Fclustering-test-app%2Fprovider%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fclustering%2Fit%2Fprovider%2Fimpl%2FIdIntsListener.java;h=f98822b6f70f020e65d4235337770be49c270491;hb=2a2a1d93bf71c5b5b341f1664f474a349e7739c9;hp=445b22c7e7f624a40309347699fe3acc08191698;hpb=b8657ab0b6d3053f47f5f9ff99e0a9f75540bde7;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 445b22c7e7..f98822b6f7 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 @@ -9,7 +9,14 @@ package org.opendaylight.controller.clustering.it.provider.impl; import com.google.common.base.Preconditions; +import com.google.common.util.concurrent.SettableFuture; import java.util.Collection; +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.AtomicLong; import javax.annotation.Nonnull; import org.opendaylight.controller.md.sal.dom.api.ClusteredDOMDataTreeChangeListener; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; @@ -20,8 +27,12 @@ import org.slf4j.LoggerFactory; 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 AtomicLong lastNotifTimestamp = new AtomicLong(0); + private ScheduledExecutorService executorService; + private ScheduledFuture scheduledFuture; @Override public void onDataTreeChanged(@Nonnull final Collection changes) { @@ -29,6 +40,8 @@ public class IdIntsListener implements ClusteredDOMDataTreeChangeListener { // There should only be one candidate reported Preconditions.checkState(changes.size() == 1); + lastNotifTimestamp.set(System.nanoTime()); + // do not log the change into debug, only use trace since it will lead to OOM on default heap settings LOG.debug("Received data tree changed"); @@ -58,4 +71,31 @@ public class IdIntsListener implements ClusteredDOMDataTreeChangeListener { public boolean checkEqual(final NormalizedNode expected) { return localCopy.equals(expected); } + + public Future tryFinishProcessing() { + executorService = Executors.newSingleThreadScheduledExecutor(); + final SettableFuture settableFuture = SettableFuture.create(); + + scheduledFuture = executorService.scheduleAtFixedRate(new CheckFinishedTask(settableFuture), 0, 1, TimeUnit.SECONDS); + return settableFuture; + } + + private class CheckFinishedTask implements Runnable { + + private final SettableFuture future; + + public CheckFinishedTask(final SettableFuture future) { + this.future = future; + } + + @Override + public void run() { + if (System.nanoTime() - lastNotifTimestamp.get() > SECOND_AS_NANO * 4) { + scheduledFuture.cancel(false); + future.set(null); + + executorService.shutdown(); + } + } + } }