summaryrefslogtreecommitdiffstats
path: root/jdisc_core/src/main/java/com/yahoo/jdisc/core/ApplicationLoader.java
diff options
context:
space:
mode:
Diffstat (limited to 'jdisc_core/src/main/java/com/yahoo/jdisc/core/ApplicationLoader.java')
-rw-r--r--jdisc_core/src/main/java/com/yahoo/jdisc/core/ApplicationLoader.java48
1 files changed, 8 insertions, 40 deletions
diff --git a/jdisc_core/src/main/java/com/yahoo/jdisc/core/ApplicationLoader.java b/jdisc_core/src/main/java/com/yahoo/jdisc/core/ApplicationLoader.java
index 4e63bc77c9a..8ddc62a6e19 100644
--- a/jdisc_core/src/main/java/com/yahoo/jdisc/core/ApplicationLoader.java
+++ b/jdisc_core/src/main/java/com/yahoo/jdisc/core/ApplicationLoader.java
@@ -15,23 +15,22 @@ import com.yahoo.jdisc.application.OsgiFramework;
import com.yahoo.jdisc.application.OsgiHeader;
import com.yahoo.jdisc.service.ContainerNotReadyException;
import com.yahoo.jdisc.service.CurrentContainer;
-import com.yahoo.jdisc.statistics.ActiveContainerStatistics;
+import com.yahoo.jdisc.statistics.ActiveContainerMetrics;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.osgi.framework.BundleException;
-import java.lang.ref.WeakReference;
import java.net.URI;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicReference;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* @author <a href="mailto:simon@yahoo-inc.com">Simon Thoresen</a>
+ * @author bjorncs
*/
public class ApplicationLoader implements BootstrapLoader, ContainerActivator, CurrentContainer {
@@ -42,7 +41,7 @@ public class ApplicationLoader implements BootstrapLoader, ContainerActivator, C
private final AtomicReference<ActiveContainer> containerRef = new AtomicReference<>();
private final Object appLock = new Object();
private final List<Bundle> appBundles = new ArrayList<>();
- private final ActiveContainerStatistics statistics = new ActiveContainerStatistics();
+ private final ActiveContainerDeactivationWatchdog watchdog = new ActiveContainerDeactivationWatchdog();
private Application application;
private ApplicationInUseTracker applicationInUseTracker;
@@ -71,46 +70,14 @@ public class ApplicationLoader implements BootstrapLoader, ContainerActivator, C
next.retainReference(applicationInUseTracker);
}
+ watchdog.onContainerActivation(next);
prev = containerRef.getAndSet(next);
- statistics.onActivated(next);
if (prev == null) {
return null;
}
- statistics.onDeactivated(prev);
}
prev.release();
- DeactivatedContainer deactivatedContainer = prev.shutdown();
-
- final WeakReference<ActiveContainer> prevContainerReference = new WeakReference<>(prev);
- final Runnable deactivationMonitor = () -> {
- long waitTimeSeconds = 30L;
- long totalTimeWaited = 0L;
-
- while (!Thread.interrupted()) {
- final long currentWaitTimeSeconds = waitTimeSeconds;
- totalTimeWaited += currentWaitTimeSeconds;
-
- Interruption.mapExceptionToThreadState(() ->
- Thread.sleep(TimeUnit.MILLISECONDS.convert(currentWaitTimeSeconds, TimeUnit.SECONDS))
- );
-
- statistics.printSummaryToLog();
- final ActiveContainer prevContainer = prevContainerReference.get();
- if (prevContainer == null || prevContainer.retainCount() == 0) {
- return;
- }
- log.warning("Previous container not terminated in the last " + totalTimeWaited + " seconds."
- + " Reference state={ " + prevContainer.currentState() + " }");
-
- waitTimeSeconds = (long) (waitTimeSeconds * 1.2);
- }
- log.warning("Deactivation monitor thread unexpectedly interrupted");
- };
- final Thread deactivationMonitorThread = new Thread(deactivationMonitor, "Container deactivation monitor");
- deactivationMonitorThread.setDaemon(true);
- deactivationMonitorThread.start();
-
- return deactivatedContainer;
+ return prev.shutdown();
}
@Override
@@ -228,6 +195,7 @@ public class ApplicationLoader implements BootstrapLoader, ContainerActivator, C
@Override
public void destroy() {
log.finer("Destroying application loader.");
+ watchdog.close();
try {
osgiFramework.stop();
} catch (BundleException e) {
@@ -241,8 +209,8 @@ public class ApplicationLoader implements BootstrapLoader, ContainerActivator, C
}
}
- public ActiveContainerStatistics getActiveContainerStatistics() {
- return statistics;
+ public ActiveContainerMetrics getActiveContainerMetrics() {
+ return watchdog;
}
public OsgiFramework osgiFramework() {