You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by cz...@apache.org on 2018/07/28 08:25:04 UTC

svn commit: r1836873 - in /felix/trunk/configadmin/src: main/java/org/apache/felix/cm/impl/ test/java/org/apache/felix/cm/integration/

Author: cziegeler
Date: Sat Jul 28 08:25:04 2018
New Revision: 1836873

URL: http://svn.apache.org/viewvc?rev=1836873&view=rev
Log:
FELIX-5892 : Repeated calls to getFactoryConfiguration return different configuration instances. Apply patch from Tim Ward

Modified:
    felix/trunk/configadmin/src/main/java/org/apache/felix/cm/impl/ConfigurationAdminImpl.java
    felix/trunk/configadmin/src/main/java/org/apache/felix/cm/impl/ConfigurationManager.java
    felix/trunk/configadmin/src/test/java/org/apache/felix/cm/integration/ConfigurationAdminUpdateStressTest.java

Modified: felix/trunk/configadmin/src/main/java/org/apache/felix/cm/impl/ConfigurationAdminImpl.java
URL: http://svn.apache.org/viewvc/felix/trunk/configadmin/src/main/java/org/apache/felix/cm/impl/ConfigurationAdminImpl.java?rev=1836873&r1=1836872&r2=1836873&view=diff
==============================================================================
--- felix/trunk/configadmin/src/main/java/org/apache/felix/cm/impl/ConfigurationAdminImpl.java (original)
+++ felix/trunk/configadmin/src/main/java/org/apache/felix/cm/impl/ConfigurationAdminImpl.java Sat Jul 28 08:25:04 2018
@@ -348,7 +348,7 @@ public class ConfigurationAdminImpl impl
         ConfigurationImpl config = configurationManager.getConfiguration( pid );
         if ( config == null )
         {
-            config = configurationManager.createConfiguration( pid, factoryPid, location );
+            config = configurationManager.createFactoryConfiguration( pid, factoryPid, location );
         }
         else
         {
@@ -375,7 +375,7 @@ public class ConfigurationAdminImpl impl
         ConfigurationImpl config = configurationManager.getConfiguration( pid );
         if ( config == null )
         {
-            config = configurationManager.createConfiguration( pid, factoryPid, null );
+            config = configurationManager.createFactoryConfiguration( pid, factoryPid, null );
 
             // FELIX-3360: configuration creation with implicit binding is dynamic
             config.setDynamicBundleLocation( getBundle().getLocation(), false );

Modified: felix/trunk/configadmin/src/main/java/org/apache/felix/cm/impl/ConfigurationManager.java
URL: http://svn.apache.org/viewvc/felix/trunk/configadmin/src/main/java/org/apache/felix/cm/impl/ConfigurationManager.java?rev=1836873&r1=1836872&r2=1836873&view=diff
==============================================================================
--- felix/trunk/configadmin/src/main/java/org/apache/felix/cm/impl/ConfigurationManager.java (original)
+++ felix/trunk/configadmin/src/main/java/org/apache/felix/cm/impl/ConfigurationManager.java Sat Jul 28 08:25:04 2018
@@ -345,7 +345,12 @@ public class ConfigurationManager implem
 
     ConfigurationImpl createFactoryConfiguration( String factoryPid, String location ) throws IOException
     {
-        return cacheConfiguration( createConfiguration( createPid( factoryPid ), factoryPid, location ) );
+        return cacheConfiguration( internalCreateConfiguration( createPid( factoryPid ), factoryPid, location ) );
+    }
+
+    ConfigurationImpl createFactoryConfiguration(String pid, String factoryPid, String location ) throws IOException
+    {
+    	return cacheConfiguration( internalCreateConfiguration( pid, factoryPid, location ) );
     }
 
     /**
@@ -480,7 +485,7 @@ public class ConfigurationManager implem
 
         // else create new configuration also setting the bundle location
         // and cache the new configuration
-        config = createConfiguration( pid, null, bundleLocation );
+        config = internalCreateConfiguration( pid, null, bundleLocation );
         return cacheConfiguration( config );
     }
 
@@ -781,7 +786,7 @@ public class ConfigurationManager implem
      *             May be thrown if an error occurrs persisting the new
      *             configuration object.
      */
-    ConfigurationImpl createConfiguration( String pid, String factoryPid, String bundleLocation ) throws IOException
+    private ConfigurationImpl internalCreateConfiguration( String pid, String factoryPid, String bundleLocation ) throws IOException
     {
         Log.logger.log( LogService.LOG_DEBUG, "createConfiguration({0}, {1}, {2})", new Object[]
                 { pid, factoryPid, bundleLocation } );

Modified: felix/trunk/configadmin/src/test/java/org/apache/felix/cm/integration/ConfigurationAdminUpdateStressTest.java
URL: http://svn.apache.org/viewvc/felix/trunk/configadmin/src/test/java/org/apache/felix/cm/integration/ConfigurationAdminUpdateStressTest.java?rev=1836873&r1=1836872&r2=1836873&view=diff
==============================================================================
--- felix/trunk/configadmin/src/test/java/org/apache/felix/cm/integration/ConfigurationAdminUpdateStressTest.java (original)
+++ felix/trunk/configadmin/src/test/java/org/apache/felix/cm/integration/ConfigurationAdminUpdateStressTest.java Sat Jul 28 08:25:04 2018
@@ -19,6 +19,7 @@
 package org.apache.felix.cm.integration;
 
 
+import java.io.IOException;
 import java.io.PrintWriter;
 import java.io.StringWriter;
 import java.util.Dictionary;
@@ -28,7 +29,7 @@ import java.util.Set;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 
-import junit.framework.Assert;
+import org.junit.Assert;
 
 import org.junit.After;
 import org.junit.Before;
@@ -38,6 +39,7 @@ import org.junit.runner.RunWith;
 import org.ops4j.pax.exam.junit.JUnit4TestRunner;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.ServiceReference;
+import org.osgi.service.cm.Configuration;
 import org.osgi.service.cm.ConfigurationAdmin;
 import org.osgi.service.cm.ConfigurationException;
 import org.osgi.service.cm.ManagedServiceFactory;
@@ -59,12 +61,13 @@ public class ConfigurationAdminUpdateStr
     public static final int UPDATE_LOOP = 100;
 
     private String _FACTORYPID = "MyPID";
+    private String _FACTORYNAME = "MyName";
 
     private volatile CountDownLatch _factoryConfigCreateLatch;
     private volatile CountDownLatch _factoryConfigUpdateLatch;
     private volatile CountDownLatch _factoryConfigDeleteLatch;
     private volatile CountDownLatch _testLatch;
-    private volatile ServiceTracker _tracker;
+    private volatile ServiceTracker<ConfigurationAdmin, ConfigurationAdmin> _tracker;
 
 
     // ----------------------- Initialization -------------------------------------------
@@ -73,7 +76,7 @@ public class ConfigurationAdminUpdateStr
     public void startup()
     {
         bundleContext.registerService( LogService.class.getName(), this, null );
-        _tracker = new ServiceTracker( bundleContext, ConfigurationAdmin.class.getName(), null );
+        _tracker = new ServiceTracker<>( bundleContext, ConfigurationAdmin.class, null );
         _tracker.open();
     }
 
@@ -108,7 +111,7 @@ public class ConfigurationAdminUpdateStr
     }
 
 
-    public void log( ServiceReference sr, int level, String message )
+    public void log( @SuppressWarnings("rawtypes") ServiceReference sr, int level, String message )
     {
         StringBuilder sb = new StringBuilder();
         sb.append( "[LogService/" + level + "] " );
@@ -117,7 +120,7 @@ public class ConfigurationAdminUpdateStr
     }
 
 
-    public void log( ServiceReference sr, int level, String message, Throwable exception )
+    public void log( @SuppressWarnings("rawtypes") ServiceReference sr, int level, String message, Throwable exception )
     {
         StringBuilder sb = new StringBuilder();
         sb.append( "[LogService/" + level + "] " );
@@ -148,7 +151,7 @@ public class ConfigurationAdminUpdateStr
         _testLatch = new CountDownLatch( 1 );
         try
         {
-            CreateUpdateStress stress = new CreateUpdateStress( bundleContext );
+            CreateStress stress = new CreateUpdateStress( bundleContext );
             stress.start();
 
             if ( !_testLatch.await( 15, TimeUnit.SECONDS ) )
@@ -167,6 +170,31 @@ public class ConfigurationAdminUpdateStr
         }
     }
 
+    @Test
+    public void testCMUpdateNamedStress()
+    {
+    	_testLatch = new CountDownLatch( 1 );
+    	try
+    	{
+    		CreateStress stress = new CreateUpdateNamedStress( bundleContext );
+    		stress.start();
+    		
+    		if ( !_testLatch.await( 15, TimeUnit.SECONDS ) )
+    		{
+    			
+    			log( LogService.LOG_DEBUG, "create latch: " + _factoryConfigCreateLatch.getCount() );
+    			log( LogService.LOG_DEBUG, "update latch: " + _factoryConfigUpdateLatch.getCount() );
+    			log( LogService.LOG_DEBUG, "delete latch: " + _factoryConfigDeleteLatch.getCount() );
+    			
+    			Assert.fail( "Test did not completed timely" );
+    		}
+    	}
+    	catch ( InterruptedException e )
+    	{
+    		Assert.fail( "Test interrupted" );
+    	}
+    }
+
 
     /**
      * Setup the latches used throughout this test
@@ -190,7 +218,7 @@ public class ConfigurationAdminUpdateStr
         Set<String> _pids = new HashSet<String>();
 
 
-        public synchronized void updated( String pid, Dictionary properties ) throws ConfigurationException
+        public synchronized void updated( String pid, Dictionary<String, ?> properties ) throws ConfigurationException
         {
             if ( _pids.add( pid ) )
             {
@@ -224,6 +252,8 @@ public class ConfigurationAdminUpdateStr
 
         public void deleted( String pid )
         {
+        	// We need to remove this as the same PID can re-occur after deletion
+        	_pids.remove(pid);
             _factoryConfigDeleteLatch.countDown();
             log( LogService.LOG_DEBUG, "Config deleted; delete latch= " + _factoryConfigDeleteLatch.getCount() );
         }
@@ -239,12 +269,12 @@ public class ConfigurationAdminUpdateStr
      * This class creates/update/delete some factory configuration instances, using a separate thread.
      */
     @Ignore
-    class CreateUpdateStress extends Thread
+    abstract class CreateStress extends Thread
     {
         BundleContext _bc;
 
 
-        CreateUpdateStress( BundleContext bctx )
+        CreateStress( BundleContext bctx )
         {
             _bc = bctx;
         }
@@ -265,10 +295,9 @@ public class ConfigurationAdminUpdateStr
                 for ( int l = 0; l < TEST_LOOP; l++ )
                 {
                     // Create factory configuration
-                    org.osgi.service.cm.Configuration conf = cm.createFactoryConfiguration( _FACTORYPID, null );
                     Hashtable<String, Object> props = new Hashtable<String, Object>();
                     props.put( "foo", "bar" );
-                    conf.update( props );
+                    obtainConfiguration(cm).update( props );
 
                     // Check if our Factory has seen the factory configuration creation
                     if ( !_factoryConfigCreateLatch.await( 10, TimeUnit.SECONDS ) )
@@ -281,8 +310,8 @@ public class ConfigurationAdminUpdateStr
                     {
                         props = new Hashtable<String, Object>();
                         props.put( "foo", "bar" + i );
-                        props.put( "number", new Long( UPDATE_LOOP - i ) );
-                        conf.update( props );
+                        props.put( "number", Long.valueOf( UPDATE_LOOP - i ) );
+                        obtainConfiguration(cm).update( props );
                     }
 
                     // Check if all configuration updates have been caught by our Factory
@@ -292,7 +321,7 @@ public class ConfigurationAdminUpdateStr
                     }
 
                     // Remove factory configuration
-                    conf.delete();
+                    obtainConfiguration(cm).delete();
 
                     // Check if our Factory has seen the configration removal
                     if ( !_factoryConfigDeleteLatch.await( 10, TimeUnit.SECONDS ) )
@@ -311,5 +340,46 @@ public class ConfigurationAdminUpdateStr
             }
             _testLatch.countDown(); // Notify that our test is done
         }
+
+
+		protected abstract org.osgi.service.cm.Configuration obtainConfiguration(ConfigurationAdmin cm)
+				throws Exception;
+
+    }
+    
+    @Ignore
+    class CreateUpdateStress extends CreateStress {
+    	CreateUpdateStress(BundleContext bctx) {
+			super(bctx);
+		}
+
+		protected org.osgi.service.cm.Configuration obtainConfiguration(ConfigurationAdmin cm) 
+				throws Exception {
+			Configuration[] cfgs = cm.listConfigurations("(service.factoryPid=" + _FACTORYPID + ")" );
+			
+			org.osgi.service.cm.Configuration conf;
+			if(cfgs == null) {
+				conf = cm.createFactoryConfiguration( _FACTORYPID, null );
+			} else if (cfgs.length == 1) {
+				conf = cfgs[0];
+			} else {
+				throw new IllegalArgumentException("Only one configuration expected");
+			}
+			
+			return conf;
+		}
+    }
+
+    @Ignore
+    class CreateUpdateNamedStress extends CreateStress {
+    	CreateUpdateNamedStress(BundleContext bctx) {
+    		super(bctx);
+    	}
+    	
+		protected org.osgi.service.cm.Configuration obtainConfiguration(ConfigurationAdmin cm) 
+				throws IOException {
+			org.osgi.service.cm.Configuration conf = cm.getFactoryConfiguration( _FACTORYPID, _FACTORYNAME, null );
+			return conf;
+		}
     }
 }