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;
+ }
}
}