Return-Path: X-Original-To: apmail-felix-dev-archive@www.apache.org Delivered-To: apmail-felix-dev-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id CDC7D10301 for ; Mon, 6 Jan 2014 08:30:11 +0000 (UTC) Received: (qmail 98390 invoked by uid 500); 6 Jan 2014 08:30:06 -0000 Delivered-To: apmail-felix-dev-archive@felix.apache.org Received: (qmail 98285 invoked by uid 500); 6 Jan 2014 08:29:54 -0000 Mailing-List: contact dev-help@felix.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@felix.apache.org Delivered-To: mailing list dev@felix.apache.org Received: (qmail 98259 invoked by uid 99); 6 Jan 2014 08:29:50 -0000 Received: from arcas.apache.org (HELO arcas.apache.org) (140.211.11.28) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 06 Jan 2014 08:29:50 +0000 Date: Mon, 6 Jan 2014 08:29:50 +0000 (UTC) From: "Clement Escoffier (JIRA)" To: dev@felix.apache.org Message-ID: In-Reply-To: References: Subject: [jira] [Assigned] (FELIX-4374) IPOJO: ConcurrentModificationException in ProvidedService MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-JIRA-FingerPrint: 30527f35849b9dde25b450d4833f0394 [ https://issues.apache.org/jira/browse/FELIX-4374?page=3Dcom.atlassia= n.jira.plugin.system.issuetabpanels:all-tabpanel ] Clement Escoffier reassigned FELIX-4374: ---------------------------------------- Assignee: Clement Escoffier > IPOJO: ConcurrentModificationException in ProvidedService > --------------------------------------------------------- > > Key: FELIX-4374 > URL: https://issues.apache.org/jira/browse/FELIX-4374 > Project: Felix > Issue Type: Bug > Components: iPOJO > Affects Versions: ipojo-runtime-1.11.0 > Environment: Karaf 2.3.3 > Reporter: Klaus Schr=C3=B6der > Assignee: Clement Escoffier > > I have a problem with a ManagedServices and IPOJO.=20 > We have a service that provides externally configured properties. We want= to use the managed service approach to get automatic refreshs of changed p= roperties. The properties are read from a file {karaf}/etc/na.default.prope= rties containing ~500 properties and are injected into the service by @Upda= ted, see code below.=20 > Basically the code works fine, but from time to time the service startup = fails with a ConcurrentModificationException in class ProvidedService. The = exception does not show always, but it is reproducible by starting and stop= ping the bundle various times. The code has been stripped down to be very s= imple and the problem could still be reproduced.=20 > IPOJO version is 1.11.0, Karaf version 2.3.3=20 > Short stacktrace:=20 > {code} > 2014-01-03 16:17:41,357 | INFO | pool-1-thread-1 | product-properties-s= ervices | ? ? | 64 - product-propert= ies-services - 0.0.1.SNAPSHOT | [INFO] com.nextaudience.clustor.product.pro= perties.services.DefaultPropertiesResolverService : An error occurred when = creating an instance of com.nextaudience.clustor.product.properties.service= s.DefaultPropertiesResolverService=20 > java.util.ConcurrentModificationException=20 > at java.util.TreeMap$PrivateEntryIterator.nextEntry(TreeMap.java:= 1115)[:1.7.0_45]=20 > at java.util.TreeMap$ValueIterator.next(TreeMap.java:1160)[:1.7.0= _45]=20 > at org.apache.felix.ipojo.handlers.providedservice.ProvidedServic= e.getServiceProperties(ProvidedService.java:447)[55:org.apache.felix.ipojo:= 1.11.0]=20 > at org.apache.felix.ipojo.handlers.providedservice.ProvidedServic= e.registerService(ProvidedService.java:357)[55:org.apache.felix.ipojo:1.11.= 0]=20 > at org.apache.felix.ipojo.handlers.providedservice.ProvidedServic= eHandler.__M_stateChanged(ProvidedServiceHandler.java:484)[55:org.apache.fe= lix.ipojo:1.11.0]=20 > at org.apache.felix.ipojo.handlers.providedservice.ProvidedServic= eHandler.stateChanged(ProvidedServiceHandler.java)[55:org.apache.felix.ipoj= o:1.11.0]=20 > at org.apache.felix.ipojo.InstanceManager.setState(InstanceManage= r.java:536)[55:org.apache.felix.ipojo:1.11.0]=20 > at org.apache.felix.ipojo.InstanceManager.start(InstanceManager.j= ava:418)[55:org.apache.felix.ipojo:1.11.0]=20 > at org.apache.felix.ipojo.ComponentFactory.createInstance(Compone= ntFactory.java:179)[55:org.apache.felix.ipojo:1.11.0]=20 > at org.apache.felix.ipojo.IPojoFactory.createComponentInstance(IP= ojoFactory.java:319)[55:org.apache.felix.ipojo:1.11.0]=20 > at org.apache.felix.ipojo.IPojoFactory.createComponentInstance(IP= ojoFactory.java:240)[55:org.apache.felix.ipojo:1.11.0]=20 > at org.apache.felix.ipojo.extender.internal.linker.ManagedType$In= stanceSupport$1.call(ManagedType.java:312)[55:org.apache.felix.ipojo:1.11.0= ]=20 > at org.apache.felix.ipojo.extender.internal.linker.ManagedType$In= stanceSupport$1.call(ManagedType.java:306)[55:org.apache.felix.ipojo:1.11.0= ]=20 > at org.apache.felix.ipojo.extender.internal.queue.JobInfoCallable= .call(JobInfoCallable.java:114)[55:org.apache.felix.ipojo:1.11.0]=20 > at java.util.concurrent.FutureTask.run(FutureTask.java:262)[:1.7.= 0_45]=20 > at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolEx= ecutor.java:1145)[:1.7.0_45]=20 > at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolE= xecutor.java:615)[:1.7.0_45]=20 > at java.lang.Thread.run(Thread.java:744)[:1.7.0_45]=20 > 2014-01-03 16:17:41,357 | ERROR | pool-1-thread-1 | product-properties-s= ervices | ? ? | 64 - product-propert= ies-services - 0.0.1.SNAPSHOT | [ERROR] com.nextaudience.clustor.product.pr= operties.services.DefaultPropertiesResolverService : null=20 > {code} > Our service:=20 > {code > @Component(managedservice =3D "na.default.properties", publicFactory =3D = false)=20 > @Instantiate=20 > @Provides=20 > public class DefaultPropertiesResolverService implements ObservableProper= tiesResolver {=20 > private static final Logger LOG =3D LoggerFactory.getLogger(DefaultPr= opertiesResolverService.class);=20 > @ServiceController=20 > private boolean ready;=20 > private Dictionary properties;=20 > =20 > @Validate=20 > synchronized private void startService() {=20 > LOG.info("startService start...");=20 > if (getProperties() =3D=3D null) {=20 > LOG.warn("No properties for " + getClass().getName());=20 > return;=20 > }=20 > if (getProperties().isEmpty()) {=20 > LOG.warn("Empty properties for " + getClass().getName());=20 > return;=20 > }=20 > ready =3D true;=20 > LOG.info(DefaultPropertiesResolverService.class.getName() + "::St= art");=20 > }=20 > @Invalidate=20 > synchronized private void stopService() {=20 > ready =3D false;=20 > LOG.info(DefaultPropertiesResolverService.class.getName() + "::St= op");=20 > }=20 > synchronized public Dictionary getProperties() {=20 > return properties;=20 > }=20 > =20 > @Updated=20 > synchronized public void updateLocalProperties(Dictionary cfgProperties) {=20 > LOG.info("DefaultProperties: updateLocalProperties start...");=20 > properties =3D cfgProperties;=20 > LOG.info("DefaultProperties: updateLocalProperties end");=20 > }=20 > }=20 > {code -- This message was sent by Atlassian JIRA (v6.1.5#6160)