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%2FFlappingSingletonService.java;h=90ce618f3d14a403146e44a1c4ed07401eea2f17;hb=0cb5ce07fc959deed2e7887ed22dfde81cb2c9a2;hp=21e6acf1c7124ac26da757185f5f4f6fa0c32311;hpb=d2d8e123aa7ee34c47f12b959592631c0538482b;p=controller.git diff --git a/opendaylight/md-sal/samples/clustering-test-app/provider/src/main/java/org/opendaylight/controller/clustering/it/provider/impl/FlappingSingletonService.java b/opendaylight/md-sal/samples/clustering-test-app/provider/src/main/java/org/opendaylight/controller/clustering/it/provider/impl/FlappingSingletonService.java index 21e6acf1c7..90ce618f3d 100644 --- a/opendaylight/md-sal/samples/clustering-test-app/provider/src/main/java/org/opendaylight/controller/clustering/it/provider/impl/FlappingSingletonService.java +++ b/opendaylight/md-sal/samples/clustering-test-app/provider/src/main/java/org/opendaylight/controller/clustering/it/provider/impl/FlappingSingletonService.java @@ -10,10 +10,8 @@ package org.opendaylight.controller.clustering.it.provider.impl; import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicLong; import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonService; import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceProvider; import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceRegistration; @@ -29,14 +27,11 @@ public class FlappingSingletonService implements ClusterSingletonService { ServiceGroupIdentifier.create("flapping-singleton-service"); private final ClusterSingletonServiceProvider singletonServiceProvider; + private final AtomicBoolean active = new AtomicBoolean(true); - private volatile long flapCount = 0; - private AtomicBoolean active = new AtomicBoolean(true); - + private final AtomicLong flapCount = new AtomicLong(); private volatile ClusterSingletonServiceRegistration registration; - private static ScheduledExecutorService EXECUTOR = Executors.newSingleThreadScheduledExecutor(); - public FlappingSingletonService(final ClusterSingletonServiceProvider singletonServiceProvider) { LOG.debug("Registering flapping-singleton-service."); @@ -45,37 +40,38 @@ public class FlappingSingletonService implements ClusterSingletonService { } @Override + @SuppressWarnings("checkstyle:IllegalCatch") public void instantiateServiceInstance() { LOG.debug("Instantiating flapping-singleton-service."); - - // TODO direct registration/close seem to trigger a bug in singleton state transitions, - // remove the whole executor shenanigans after it's fixed. - EXECUTOR.submit(() -> { - try { - registration.close(); - registration = null; - } catch (final Exception e) { - LOG.warn("There was a problem closing flapping singleton service.", e); - flapCount = -flapCount; - } - }); + try { + registration.close(); + registration = null; + } catch (Exception e) { + LOG.warn("There was a problem closing flapping singleton service.", e); + setInactive(); + + final long count = flapCount.get(); + flapCount.compareAndSet(count, -count); + } } @Override + @SuppressWarnings("checkstyle:IllegalCatch") public ListenableFuture closeServiceInstance() { LOG.debug("Closing flapping-singleton-service, flapCount: {}", flapCount); - flapCount++; + flapCount.incrementAndGet(); if (active.get()) { - // TODO direct registration/close seem to trigger a bug in singleton state transitions, - // remove whole executor shenanigans after it's fixed. - // Needs to be delayed slightly otherwise it's triggered as well. - EXECUTOR.schedule(() -> { - LOG.debug("Running registration"); - registration = - singletonServiceProvider.registerClusterSingletonService(this); - - }, 200, TimeUnit.MILLISECONDS); + LOG.debug("Running re-registration"); + try { + registration = singletonServiceProvider.registerClusterSingletonService(this); + } catch (RuntimeException e) { + LOG.warn("There was a problem re-registering flapping singleton service.", e); + setInactive(); + + final long count = flapCount.get(); + flapCount.compareAndSet(count, -count - 1); + } } return Futures.immediateFuture(null); @@ -90,6 +86,6 @@ public class FlappingSingletonService implements ClusterSingletonService { LOG.debug("Setting flapping-singleton-service to inactive, flap-count: {}", flapCount); active.set(false); - return flapCount; + return flapCount.get(); } }