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()


Reply via email to