From fad74e7ef14ab24e347559b60f98d40a0ac8f90b Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Fri, 21 Feb 2020 06:28:55 +0100 Subject: [PATCH] Expose more fine-grained shutdown methods We want to the user to be in control of timing of shutdown, expose appropriate methods to do that. Change-Id: Id0a787a1b707a3eb6c2909c52023cc5eac3c1402 JIRA: CONTROLLER-1929 Signed-off-by: Robert Varga --- .../akka/impl/ActorSystemProviderImpl.java | 32 ++++++++++++++++--- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/akka/impl/ActorSystemProviderImpl.java b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/akka/impl/ActorSystemProviderImpl.java index 6e805b33d7..4868d04f7d 100644 --- a/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/akka/impl/ActorSystemProviderImpl.java +++ b/opendaylight/md-sal/sal-distributed-datastore/src/main/java/org/opendaylight/controller/cluster/akka/impl/ActorSystemProviderImpl.java @@ -9,9 +9,12 @@ package org.opendaylight.controller.cluster.akka.impl; import akka.actor.ActorSystem; import akka.actor.Props; +import akka.actor.Terminated; +import akka.dispatch.OnComplete; import com.typesafe.config.Config; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; +import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.controller.cluster.ActorSystemProvider; import org.opendaylight.controller.cluster.ActorSystemProviderListener; import org.opendaylight.controller.cluster.common.actor.QuarantinedMonitorActor; @@ -21,13 +24,15 @@ import org.opendaylight.yangtools.util.ListenerRegistry; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import scala.concurrent.Await; +import scala.concurrent.ExecutionContext; +import scala.concurrent.Future; import scala.concurrent.duration.FiniteDuration; public class ActorSystemProviderImpl implements ActorSystemProvider, AutoCloseable { private static final String ACTOR_SYSTEM_NAME = "opendaylight-cluster-data"; private static final Logger LOG = LoggerFactory.getLogger(ActorSystemProviderImpl.class); - private final ActorSystem actorSystem; + private final @NonNull ActorSystem actorSystem; private final ListenerRegistry listeners = ListenerRegistry.create(); public ActorSystemProviderImpl( @@ -35,7 +40,6 @@ public class ActorSystemProviderImpl implements ActorSystemProvider, AutoCloseab LOG.info("Creating new ActorSystem"); actorSystem = ActorSystem.create(ACTOR_SYSTEM_NAME, akkaConfig, classLoader); - actorSystem.actorOf(Props.create(TerminationMonitor.class), TerminationMonitor.ADDRESS); actorSystem.actorOf(quarantinedMonitorActorProps, QuarantinedMonitorActor.ADDRESS); } @@ -51,9 +55,29 @@ public class ActorSystemProviderImpl implements ActorSystemProvider, AutoCloseab return listeners.register(listener); } + public Future asyncClose() { + LOG.info("Shutting down ActorSystem"); + + final Future ret = actorSystem.terminate(); + ret.onComplete(new OnComplete() { + @Override + public void onComplete(final Throwable failure, final Terminated success) throws Throwable { + if (failure != null) { + LOG.warn("ActorSystem failed to shut down", failure); + } else { + LOG.info("ActorSystem shut down"); + } + } + }, ExecutionContext.global()); + return ret; + } + + public void close(final FiniteDuration wait) throws TimeoutException, InterruptedException { + Await.result(asyncClose(), wait); + } + @Override public void close() throws TimeoutException, InterruptedException { - LOG.info("Shutting down ActorSystem"); - Await.result(actorSystem.terminate(), FiniteDuration.create(10, TimeUnit.SECONDS)); + close(FiniteDuration.create(10, TimeUnit.SECONDS)); } } -- 2.36.6