Hi,


Context : Figuring out the best possible way to gracefully shutdown Karaf 
process using standard Karaf commands.

This would be required because framework-level shutdown-sequence in Karaf would 
give opportunity framework to properly execute bundle lifecycle listeners. What 
I mean is - abrupt kill can potentially prevent lifecycle listeners from being 
properly executed and may also impact any inflight transactions which may be in 
various stages of replication and/or commit phases. This can in turn lead to 
troubles during recovery / restart phase.



So, I thought of middle-ground where

1)      We execute karaf stop followed by

2)      Periodic check  if the last PID indeed terminates



Doing a straight kill -9 could lead to rare heisenbugs during wherein recovery 
could suffer since there may not be room for lifecycle listeners to execute 
(unless Karaf handles it as unified shutdownhook and execute same path as that 
of stop or any graceful shutdown methods)



Have anybody tried any better methods without side-effects ?





Option was tried and observation is as follows

Using Karaf stop followed by Karaf status command to check if the process has 
come to a graceful termination. But, it appears that though 'status' command 
reports Karaf instance as 'Not Running', the PID still lingers for 2 to 3 mins 
roughly in ODL context. I am biased to think that there are indeed some 
lifecycle listeners executing ... During this 'PID lingering' phase, the 
thread-dump hints the System Bundle Shutdown is waiting for the BP container to 
shutdown the components (probably executing the lifecycle listeners at 
application and platform levels)


"System Bundle Shutdown" #1582 daemon prio=5 os_prio=0 tid=0x00007fb05003d800 
nid=0xe68 waiting on condition [0x00007faf77678000]
   java.lang.Thread.State: TIMED_WAITING (parking)
                at sun.misc.Unsafe.park(Native Method)
                - parking to wait for  <0x00000000e9064250> (a 
com.google.common.util.concurrent.AbstractFuture$Sync)
                at 
java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215)
                at 
java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedNanos(AbstractQueuedSynchronizer.java:1037)
                at 
java.util.concurrent.locks.AbstractQueuedSynchronizer.tryAcquireSharedNanos(AbstractQueuedSynchronizer.java:1328)
                at 
com.google.common.util.concurrent.AbstractFuture$Sync.get(AbstractFuture.java:268)
                at 
com.google.common.util.concurrent.AbstractFuture.get(AbstractFuture.java:96)
                at 
org.opendaylight.openflowplugin.openflow.md.core.MDController.stop(MDController.java:358)
                at 
org.opendaylight.openflowplugin.openflow.md.core.sal.OpenflowPluginProvider.close(OpenflowPluginProvider.java:121)
                at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
                at 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
                at 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
                at java.lang.reflect.Method.invoke(Method.java:498)
                at 
org.apache.aries.blueprint.utils.ReflectionUtils.invoke(ReflectionUtils.java:299)
                at 
org.apache.aries.blueprint.container.BeanRecipe.invoke(BeanRecipe.java:980)
                at 
org.apache.aries.blueprint.container.BeanRecipe.destroy(BeanRecipe.java:887)
                at 
org.apache.aries.blueprint.container.BlueprintRepository.destroy(BlueprintRepository.java:329)
                at 
org.apache.aries.blueprint.container.BlueprintContainerImpl.destroyComponents(BlueprintContainerImpl.java:765)
                at 
org.apache.aries.blueprint.container.BlueprintContainerImpl.tidyupComponents(BlueprintContainerImpl.java:964)
                at 
org.apache.aries.blueprint.container.BlueprintContainerImpl.destroy(BlueprintContainerImpl.java:909)
                at 
org.apache.aries.blueprint.container.BlueprintExtender$3.run(BlueprintExtender.java:325)
                at 
java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
                at java.util.concurrent.FutureTask.run(FutureTask.java:266)
                at 
org.apache.aries.blueprint.container.BlueprintExtender.destroyContainer(BlueprintExtender.java:346)
                at 
org.apache.aries.blueprint.container.BlueprintExtender.access$400(BlueprintExtender.java:68)
                at 
org.apache.aries.blueprint.container.BlueprintExtender$BlueprintContainerServiceImpl.destroyContainer(BlueprintExtender.java:624)
                at 
org.opendaylight.controller.blueprint.BlueprintBundleTracker.shutdownAllContainers(BlueprintBundleTracker.java:251)
                at 
org.opendaylight.controller.blueprint.BlueprintBundleTracker.bundleChanged(BlueprintBundleTracker.java:150)
                at 
org.eclipse.osgi.framework.internal.core.BundleContextImpl.dispatchEvent(BundleContextImpl.java:847)
                at 
org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:230)
                at 
org.eclipse.osgi.framework.eventmgr.ListenerQueue.dispatchEventSynchronous(ListenerQueue.java:148)
                at 
org.eclipse.osgi.framework.internal.core.Framework.publishBundleEventPrivileged(Framework.java:1568)
                at 
org.eclipse.osgi.framework.internal.core.Framework.publishBundleEvent(Framework.java:1504)
                at 
org.eclipse.osgi.framework.internal.core.Framework.publishBundleEvent(Framework.java:1499)
                at 
org.eclipse.osgi.framework.internal.core.Framework.shutdown(Framework.java:681)
                - locked <0x000000008060b4d0> (a 
org.eclipse.osgi.framework.internal.core.Framework)
                at 
org.eclipse.osgi.framework.internal.core.Framework.close(Framework.java:600)
                - locked <0x000000008060b4d0> (a 
org.eclipse.osgi.framework.internal.core.Framework)
                at 
org.eclipse.osgi.framework.internal.core.InternalSystemBundle$1.run(InternalSystemBundle.java:261)
                at java.lang.Thread.run(Thread.java:745)

"Framework Active Thread" #12 prio=5 os_prio=0 tid=0x00007fb0dc4bd000 nid=0x52a 
waiting for monitor entry [0x00007fb0c14b0000]
   java.lang.Thread.State: BLOCKED (on object monitor)
                at java.lang.Object.wait(Native Method)
                at 
org.eclipse.osgi.framework.internal.core.Framework.run(Framework.java:1862)
                - locked <0x000000008060b4d0> (a 
org.eclipse.osgi.framework.internal.core.Framework)
                at java.lang.Thread.run(Thread.java:745)

"main" #1 prio=5 os_prio=0 tid=0x00007fb0dc00b800 nid=0x514 in Object.wait() 
[0x00007fb0e5134000]
   java.lang.Thread.State: WAITING (on object monitor)
                at java.lang.Object.wait(Native Method)
                - waiting on <0x000000008060b4d0> (a 
org.eclipse.osgi.framework.internal.core.Framework)
                at 
org.eclipse.osgi.framework.internal.core.Framework.waitForStop(Framework.java:1884)
                - locked <0x000000008060b4d0> (a 
org.eclipse.osgi.framework.internal.core.Framework)
                at 
org.eclipse.osgi.framework.internal.core.EquinoxLauncher.waitForStop(EquinoxLauncher.java:118)
                at org.eclipse.osgi.launch.Equinox.waitForStop(Equinox.java:182)
                at org.apache.karaf.main.Main.awaitShutdown(Main.java:487)
                at org.apache.karaf.main.Main.main(Main.java:177)











Regards

Muthu



_______________________________________________
controller-dev mailing list
controller-dev@lists.opendaylight.org
https://lists.opendaylight.org/mailman/listinfo/controller-dev

Reply via email to