Author: gnodet
Date: Wed Nov 13 07:42:20 2013
New Revision: 1541409
URL: http://svn.apache.org/r1541409
Log:
[FELIX-4309] Under high load, SCR leaves some components in DISABLED state
Modified:
felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/Activator.java
Modified: felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/Activator.java
URL:
http://svn.apache.org/viewvc/felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/Activator.java?rev=1541409&r1=1541408&r2=1541409&view=diff
==============================================================================
--- felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/Activator.java
(original)
+++ felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/Activator.java Wed
Nov 13 07:42:20 2013
@@ -23,9 +23,11 @@ import java.io.PrintStream;
import java.text.MessageFormat;
import java.util.HashMap;
import java.util.Map;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.FutureTask;
+import java.util.concurrent.TimeUnit;
import org.apache.felix.scr.impl.config.ScrConfiguration;
-import org.apache.felix.scr.impl.metadata.ComponentMetadata;
import org.apache.felix.utils.extender.AbstractExtender;
import org.apache.felix.utils.extender.Extension;
import org.osgi.framework.Bundle;
@@ -162,18 +164,36 @@ public class Activator extends AbstractE
@Override
protected Extension doCreateExtension(final Bundle bundle) throws Exception
{
- return new Extension()
- {
- public void start() throws Exception
- {
- loadComponents( bundle );
+ return new ScrExtension(bundle);
+ }
+
+ protected class ScrExtension implements Extension {
+
+ private final Bundle bundle;
+ private final CountDownLatch started;
+
+ public ScrExtension(Bundle bundle) {
+ this.bundle = bundle;
+ this.started = new CountDownLatch(1);
+ }
+
+ public void start() {
+ try {
+ loadComponents( ScrExtension.this.bundle );
+ } finally {
+ started.countDown();
}
+ }
- public void destroy() throws Exception
- {
- disposeComponents( bundle );
+ public void destroy() {
+ try {
+ this.started.await(60, TimeUnit.SECONDS);
+ } catch (InterruptedException e) {
+ log( LogService.LOG_WARNING, m_context.getBundle(), "The wait
for bundle {0}/{1} being started before destruction has been interrupted.",
+ new Object[] {bundle.getSymbolicName(),
bundle.getBundleId()}, e );
}
- };
+ disposeComponents( this.bundle );
+ }
}
/**