Author: djencks
Date: Wed Mar 6 02:51:24 2013
New Revision: 1453153
URL: http://svn.apache.org/r1453153
Log:
FELIX-3952 don't hang indefinitely if a service tracking event is missing. Add
more logging
Modified:
felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/AbstractComponentManager.java
felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/DependencyManager.java
Modified:
felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/AbstractComponentManager.java
URL:
http://svn.apache.org/viewvc/felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/AbstractComponentManager.java?rev=1453153&r1=1453152&r2=1453153&view=diff
==============================================================================
---
felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/AbstractComponentManager.java
(original)
+++
felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/AbstractComponentManager.java
Wed Mar 6 02:51:24 2013
@@ -34,6 +34,7 @@ import java.util.concurrent.atomic.Atomi
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicLong;
import java.util.concurrent.atomic.AtomicReference;
+import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
@@ -119,6 +120,8 @@ public abstract class AbstractComponentM
private volatile int ceiling;
+ private final Lock missingLock = new ReentrantLock();
+ private final Condition missingCondition = missingLock.newCondition();
private final Set<Integer> missing = new TreeSet<Integer>( );
@@ -218,7 +221,8 @@ public abstract class AbstractComponentM
//service event tracking
void tracked( int trackingCount )
{
- synchronized ( missing )
+ missingLock.lock();
+ try
{
if (trackingCount == floor + 1 )
{
@@ -237,13 +241,18 @@ public abstract class AbstractComponentM
}
ceiling = trackingCount;
}
- missing.notifyAll();
+ missingCondition.signalAll();
+ }
+ finally
+ {
+ missingLock.unlock();
}
}
void waitForTracked( int trackingCount )
{
- synchronized ( missing )
+ missingLock.lock();
+ try
{
while ( ceiling < trackingCount || ( !missing.isEmpty() &&
missing.iterator().next() < trackingCount))
{
@@ -251,7 +260,14 @@ public abstract class AbstractComponentM
new Object[] {trackingCount, ceiling, missing}, null );
try
{
- missing.wait( );
+ if ( !missingCondition.await( getLockTimeout(),
TimeUnit.MILLISECONDS ))
+ {
+ log( LogService.LOG_ERROR, "waitForTracked timed out:
{0} ceiling: {1} missing: {2}, Expect further errors",
+ new Object[] {trackingCount, ceiling,
missing}, null );
+ missing.clear();
+ return;
+
+ }
}
catch ( InterruptedException e )
{
@@ -259,6 +275,10 @@ public abstract class AbstractComponentM
}
}
}
+ finally
+ {
+ missingLock.unlock();
+ }
}
//---------- Component ID management
Modified:
felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/DependencyManager.java
URL:
http://svn.apache.org/viewvc/felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/DependencyManager.java?rev=1453153&r1=1453152&r2=1453153&view=diff
==============================================================================
---
felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/DependencyManager.java
(original)
+++
felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/DependencyManager.java
Wed Mar 6 02:51:24 2013
@@ -316,6 +316,7 @@ public class DependencyManager<S, T> imp
public void addedService( ServiceReference<T> serviceReference,
RefPair<T> refPair, int trackingCount )
{
+ m_componentManager.log( LogService.LOG_DEBUG, "dm {0} tracking {1}
MultipleDynamic added {2} (enter)", new Object[]
{m_dependencyMetadata.getName(), trackingCount, serviceReference}, null );
boolean tracked = false;
if ( getPreviousRefMap().remove( serviceReference ) == null )
{
@@ -336,7 +337,7 @@ public class DependencyManager<S, T> imp
m_componentManager.activateInternal( trackingCount );
}
}
- m_componentManager.log( LogService.LOG_DEBUG, "dm {0} tracking {1}
MultipleDynamic added {2}", new Object[] {m_dependencyMetadata.getName(),
trackingCount, serviceReference}, null );
+ m_componentManager.log( LogService.LOG_DEBUG, "dm {0} tracking {1}
MultipleDynamic added {2} (exit)", new Object[]
{m_dependencyMetadata.getName(), trackingCount, serviceReference}, null );
if ( !tracked )
{
tracked(trackingCount);
@@ -345,16 +346,18 @@ public class DependencyManager<S, T> imp
public void modifiedService( ServiceReference<T> serviceReference,
RefPair<T> refPair, int trackingCount )
{
+ m_componentManager.log( LogService.LOG_DEBUG, "dm {0} tracking {1}
MultipleDynamic modified {2} (enter)", new Object[]
{m_dependencyMetadata.getName(), trackingCount, serviceReference}, null );
if (isActive())
{
m_componentManager.update( DependencyManager.this, refPair,
trackingCount );
}
- m_componentManager.log( LogService.LOG_DEBUG, "dm {0} tracking {1}
MultipleDynamic modified {2}", new Object[] {m_dependencyMetadata.getName(),
trackingCount, serviceReference}, null );
+ m_componentManager.log( LogService.LOG_DEBUG, "dm {0} tracking {1}
MultipleDynamic modified {2} (exit)", new Object[]
{m_dependencyMetadata.getName(), trackingCount, serviceReference}, null );
tracked( trackingCount );
}
public void removedService( ServiceReference<T> serviceReference,
RefPair<T> refPair, int trackingCount )
{
+ m_componentManager.log( LogService.LOG_DEBUG, "dm {0} tracking {1}
MultipleDynamic removed {2} (enter)", new Object[]
{m_dependencyMetadata.getName(), trackingCount, serviceReference}, null );
if ( isActive() )
{
boolean unbind = isOptional() || !getTracker().isEmpty();
@@ -368,10 +371,10 @@ public class DependencyManager<S, T> imp
{
lastRefPair = refPair;
lastRefPairTrackingCount = trackingCount;
- m_componentManager.log( LogService.LOG_DEBUG, "dm {0}
tracking {1} MultipleDynamic removed (deactivate) {2}", new Object[]
{m_dependencyMetadata.getName(), trackingCount, serviceReference}, null );
tracked( trackingCount );
m_componentManager.deactivateInternal(
ComponentConstants.DEACTIVATION_REASON_REFERENCE, false, trackingCount );
lastRefPair = null;
+ m_componentManager.log( LogService.LOG_DEBUG, "dm {0}
tracking {1} MultipleDynamic removed (deactivate) {2}", new Object[]
{m_dependencyMetadata.getName(), trackingCount, serviceReference}, null );
}
}
else
@@ -444,6 +447,7 @@ public class DependencyManager<S, T> imp
public void addedService( ServiceReference<T> serviceReference,
RefPair<T> refPair, int trackingCount )
{
+ m_componentManager.log( LogService.LOG_DEBUG, "dm {0} tracking {1}
MultipleStaticGreedy added {2} (enter)", new Object[]
{m_dependencyMetadata.getName(), trackingCount, serviceReference}, null );
tracked( trackingCount );
if (isActive())
{
@@ -458,21 +462,23 @@ public class DependencyManager<S, T> imp
{
m_componentManager.activateInternal( trackingCount );
}
- m_componentManager.log( LogService.LOG_DEBUG, "dm {0} tracking {1}
MultipleStaticGreedy added {2}", new Object[] {m_dependencyMetadata.getName(),
trackingCount, serviceReference}, null );
+ m_componentManager.log( LogService.LOG_DEBUG, "dm {0} tracking {1}
MultipleStaticGreedy added {2} (exit)", new Object[]
{m_dependencyMetadata.getName(), trackingCount, serviceReference}, null );
}
public void modifiedService( ServiceReference<T> serviceReference,
RefPair<T> refPair, int trackingCount )
{
+ m_componentManager.log( LogService.LOG_DEBUG, "dm {0} tracking {1}
MultipleStaticGreedy modified {2} (enter)", new Object[]
{m_dependencyMetadata.getName(), trackingCount, serviceReference}, null );
if (isActive())
{
m_componentManager.update( DependencyManager.this, refPair,
trackingCount );
}
- m_componentManager.log( LogService.LOG_DEBUG, "dm {0} tracking {1}
MultipleStaticGreedy modified {2}", new Object[]
{m_dependencyMetadata.getName(), trackingCount, serviceReference}, null );
+ m_componentManager.log( LogService.LOG_DEBUG, "dm {0} tracking {1}
MultipleStaticGreedy modified {2} (exit)", new Object[]
{m_dependencyMetadata.getName(), trackingCount, serviceReference}, null );
tracked( trackingCount );
}
public void removedService( ServiceReference<T> serviceReference,
RefPair<T> refPair, int trackingCount )
{
+ m_componentManager.log( LogService.LOG_DEBUG, "dm {0} tracking {1}
MultipleStaticGreedy removed {2} (enter)", new Object[]
{m_dependencyMetadata.getName(), trackingCount, serviceReference}, null );
tracked( trackingCount );
if ( isActive() )
{
@@ -486,7 +492,7 @@ public class DependencyManager<S, T> imp
}
//This is unlikely
ungetService( refPair );
- m_componentManager.log( LogService.LOG_DEBUG, "dm {0} tracking {1}
MultipleStaticGreedy removed {2}", new Object[]
{m_dependencyMetadata.getName(), trackingCount, serviceReference}, null );
+ m_componentManager.log( LogService.LOG_DEBUG, "dm {0} tracking {1}
MultipleStaticGreedy removed {2} (exit)", new Object[]
{m_dependencyMetadata.getName(), trackingCount, serviceReference}, null );
}
public boolean open()
@@ -533,26 +539,29 @@ public class DependencyManager<S, T> imp
public void addedService( ServiceReference<T> serviceReference,
RefPair<T> refPair, int trackingCount )
{
+ m_componentManager.log( LogService.LOG_DEBUG, "dm {0} tracking {1}
MultipleStaticReluctant added {2} (enter)", new Object[]
{m_dependencyMetadata.getName(), trackingCount, serviceReference}, null );
tracked( trackingCount );
if ( isTrackerOpened() && !isOptional() && !isActive())
{
m_componentManager.activateInternal( trackingCount );
}
- m_componentManager.log( LogService.LOG_DEBUG, "dm {0} tracking {1}
MultipleStaticReluctant added {2}", new Object[]
{m_dependencyMetadata.getName(), trackingCount, serviceReference}, null );
+ m_componentManager.log( LogService.LOG_DEBUG, "dm {0} tracking {1}
MultipleStaticReluctant added {2} (exit)", new Object[]
{m_dependencyMetadata.getName(), trackingCount, serviceReference}, null );
}
public void modifiedService( ServiceReference<T> serviceReference,
RefPair<T> refPair, int trackingCount )
{
+ m_componentManager.log( LogService.LOG_DEBUG, "dm {0} tracking {1}
MultipleStaticReluctant modified {2} (enter)", new Object[]
{m_dependencyMetadata.getName(), trackingCount, serviceReference}, null );
if (isActive())
{
m_componentManager.update( DependencyManager.this, refPair,
trackingCount );
}
- m_componentManager.log( LogService.LOG_DEBUG, "dm {0} tracking {1}
MultipleStaticReluctant modified {2}", new Object[]
{m_dependencyMetadata.getName(), trackingCount, serviceReference}, null );
+ m_componentManager.log( LogService.LOG_DEBUG, "dm {0} tracking {1}
MultipleStaticReluctant modified {2} (exit)", new Object[]
{m_dependencyMetadata.getName(), trackingCount, serviceReference}, null );
tracked( trackingCount );
}
public void removedService( ServiceReference<T> serviceReference,
RefPair<T> refPair, int trackingCount )
{
+ m_componentManager.log( LogService.LOG_DEBUG, "dm {0} tracking {1}
MultipleStaticReluctant removed {2} (enter)", new Object[]
{m_dependencyMetadata.getName(), trackingCount, serviceReference}, null );
tracked( trackingCount );
if ( isActive() )
{
@@ -570,7 +579,7 @@ public class DependencyManager<S, T> imp
}
}
ungetService( refPair );
- m_componentManager.log( LogService.LOG_DEBUG, "dm {0} tracking {1}
MultipleStaticReluctant removed {2}", new Object[]
{m_dependencyMetadata.getName(), trackingCount, serviceReference}, null );
+ m_componentManager.log( LogService.LOG_DEBUG, "dm {0} tracking {1}
MultipleStaticReluctant removed {2} (exit)", new Object[]
{m_dependencyMetadata.getName(), trackingCount, serviceReference}, null );
}
public boolean open()
@@ -625,6 +634,7 @@ public class DependencyManager<S, T> imp
public void addedService( ServiceReference<T> serviceReference,
RefPair<T> refPair, int trackingCount )
{
+ m_componentManager.log( LogService.LOG_DEBUG, "dm {0} tracking {1}
SingleDynamic added {2} (enter)", new Object[] {m_dependencyMetadata.getName(),
trackingCount, serviceReference}, null );
boolean tracked = false;
if ( getPreviousRefMap().remove( serviceReference ) == null )
{
@@ -660,7 +670,7 @@ public class DependencyManager<S, T> imp
}
}
this.trackingCount = trackingCount;
- m_componentManager.log( LogService.LOG_DEBUG, "dm {0} tracking {1}
SingleDynamic added {2}", new Object[] {m_dependencyMetadata.getName(),
trackingCount, serviceReference}, null );
+ m_componentManager.log( LogService.LOG_DEBUG, "dm {0} tracking {1}
SingleDynamic added {2} (exit)", new Object[] {m_dependencyMetadata.getName(),
trackingCount, serviceReference}, null );
if ( !tracked )
{
tracked(trackingCount);
@@ -669,17 +679,19 @@ public class DependencyManager<S, T> imp
public void modifiedService( ServiceReference<T> serviceReference,
RefPair<T> refPair, int trackingCount )
{
+ m_componentManager.log( LogService.LOG_DEBUG, "dm {0} tracking {1}
SingleDynamic modified {2} (enter)", new Object[]
{m_dependencyMetadata.getName(), trackingCount, serviceReference}, null );
if (isActive())
{
m_componentManager.update( DependencyManager.this, refPair,
trackingCount );
}
this.trackingCount = trackingCount;
- m_componentManager.log( LogService.LOG_DEBUG, "dm {0} tracking {1}
SingleDynamic modified {2}", new Object[] {m_dependencyMetadata.getName(),
trackingCount, serviceReference}, null );
+ m_componentManager.log( LogService.LOG_DEBUG, "dm {0} tracking {1}
SingleDynamic modified {2} (exit)", new Object[]
{m_dependencyMetadata.getName(), trackingCount, serviceReference}, null );
tracked( trackingCount );
}
public void removedService( ServiceReference<T> serviceReference,
RefPair<T> refPair, int trackingCount )
{
+ m_componentManager.log( LogService.LOG_DEBUG, "dm {0} tracking {1}
SingleDynamic removed {2} (enter)", new Object[]
{m_dependencyMetadata.getName(), trackingCount, serviceReference}, null );
if (refPair == this.refPair)
{
if ( isActive() )
@@ -731,7 +743,7 @@ public class DependencyManager<S, T> imp
this.trackingCount = trackingCount;
tracked( trackingCount );
}
- m_componentManager.log( LogService.LOG_DEBUG, "dm {0} tracking {1}
SingleDynamic removed {2}", new Object[] {m_dependencyMetadata.getName(),
trackingCount, serviceReference}, null );
+ m_componentManager.log( LogService.LOG_DEBUG, "dm {0} tracking {1}
SingleDynamic removed {2} (exit)", new Object[]
{m_dependencyMetadata.getName(), trackingCount, serviceReference}, null );
}
public boolean open()
@@ -794,6 +806,7 @@ public class DependencyManager<S, T> imp
public void addedService( ServiceReference<T> serviceReference,
RefPair<T> refPair, int trackingCount )
{
+ m_componentManager.log( LogService.LOG_DEBUG, "dm {0} tracking {1}
SingleStatic added {2} (enter)", new Object[] {m_dependencyMetadata.getName(),
trackingCount, serviceReference}, null );
this.trackingCount = trackingCount;
tracked( trackingCount );
if ( isActive() )
@@ -808,22 +821,24 @@ public class DependencyManager<S, T> imp
{
m_componentManager.activateInternal( trackingCount );
}
- m_componentManager.log( LogService.LOG_DEBUG, "dm {0} tracking {1}
SingleStatic added {2}", new Object[] {m_dependencyMetadata.getName(),
trackingCount, serviceReference}, null );
+ m_componentManager.log( LogService.LOG_DEBUG, "dm {0} tracking {1}
SingleStatic added {2} (exit)", new Object[] {m_dependencyMetadata.getName(),
trackingCount, serviceReference}, null );
}
public void modifiedService( ServiceReference<T> serviceReference,
RefPair<T> refPair, int trackingCount )
{
+ m_componentManager.log( LogService.LOG_DEBUG, "dm {0} tracking {1}
SingleStatic modified {2} (enter)", new Object[]
{m_dependencyMetadata.getName(), trackingCount, serviceReference}, null );
if ( isActive() )
{
m_componentManager.update( DependencyManager.this, refPair,
trackingCount );
}
this.trackingCount = trackingCount;
- m_componentManager.log( LogService.LOG_DEBUG, "dm {0} tracking {1}
SingleStatic modified {2}", new Object[] {m_dependencyMetadata.getName(),
trackingCount, serviceReference}, null );
+ m_componentManager.log( LogService.LOG_DEBUG, "dm {0} tracking {1}
SingleStatic modified {2} (exit)", new Object[]
{m_dependencyMetadata.getName(), trackingCount, serviceReference}, null );
tracked( trackingCount );
}
public void removedService( ServiceReference<T> serviceReference,
RefPair<T> refPair, int trackingCount )
{
+ m_componentManager.log( LogService.LOG_DEBUG, "dm {0} tracking {1}
SingleStatic removed {2} (enter)", new Object[]
{m_dependencyMetadata.getName(), trackingCount, serviceReference}, null );
this.trackingCount = trackingCount;
tracked( trackingCount );
if ( isActive() && refPair == this.refPair )
@@ -831,7 +846,7 @@ public class DependencyManager<S, T> imp
m_componentManager.deactivateInternal(
ComponentConstants.DEACTIVATION_REASON_REFERENCE, false, trackingCount );
m_componentManager.activateInternal( trackingCount );
}
- m_componentManager.log( LogService.LOG_DEBUG, "dm {0} tracking {1}
SingleStatic removed {2}", new Object[] {m_dependencyMetadata.getName(),
trackingCount, serviceReference}, null );
+ m_componentManager.log( LogService.LOG_DEBUG, "dm {0} tracking {1}
SingleStatic removed {2} (exit)", new Object[] {m_dependencyMetadata.getName(),
trackingCount, serviceReference}, null );
}
public boolean open()