Return-Path: Delivered-To: apmail-felix-dev-archive@www.apache.org Received: (qmail 3510 invoked from network); 25 Nov 2009 14:54:04 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.3) by minotaur.apache.org with SMTP; 25 Nov 2009 14:54:04 -0000 Received: (qmail 29537 invoked by uid 500); 25 Nov 2009 14:54:04 -0000 Delivered-To: apmail-felix-dev-archive@felix.apache.org Received: (qmail 29450 invoked by uid 500); 25 Nov 2009 14:54:04 -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 29440 invoked by uid 99); 25 Nov 2009 14:54:04 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 25 Nov 2009 14:54:04 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.140] (HELO brutus.apache.org) (140.211.11.140) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 25 Nov 2009 14:54:01 +0000 Received: from brutus (localhost [127.0.0.1]) by brutus.apache.org (Postfix) with ESMTP id A432B234C1F1 for ; Wed, 25 Nov 2009 06:53:39 -0800 (PST) Message-ID: <2128252567.1259160819671.JavaMail.jira@brutus> Date: Wed, 25 Nov 2009 14:53:39 +0000 (UTC) From: "Felix Meschberger (JIRA)" To: dev@felix.apache.org Subject: [jira] Commented: (FELIX-1841) SCR invokes bind method twice when dependency service properties are modified In-Reply-To: <142004620.1257252419463.JavaMail.jira@brutus> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-JIRA-FingerPrint: 30527f35849b9dde25b450d4833f0394 X-Virus-Checked: Checked by ClamAV on apache.org [ https://issues.apache.org/jira/browse/FELIX-1841?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12782457#action_12782457 ] Felix Meschberger commented on FELIX-1841: ------------------------------------------ Commited the DependencyManager part of the patch in Rev. 884122 along with a series of integration tests verifying that the bind methods are not called without need. > SCR invokes bind method twice when dependency service properties are modified > ----------------------------------------------------------------------------- > > Key: FELIX-1841 > URL: https://issues.apache.org/jira/browse/FELIX-1841 > Project: Felix > Issue Type: Bug > Components: Declarative Services (SCR) > Reporter: Pierre De Rop > Assignee: Felix Meschberger > Priority: Minor > Attachments: DependencyManager.java, FELIX-1841.patch, FELIX-1841.patch.2 > > > It seems that when a service S is depending on another service D, and when D service properties are modified (using ServiceRegistration.setProperties method), then D is > re-bound twice into the using service S. > For example, I have a service "Client" has a "1..1" dependency over "Service": > > > > interface="service.Service" > policy="dynamic" > cardinality="1..1" > target="(foo=bar)" > bind="bind"/> > > public class Client { > protected void bind(Service s) { > System.out.println("Client:: bound Service : " + s); > Thread.dumpStack(); > } > } > I have another bundle which provide the "Service" dependency, and sometimes, the "Service" properties are modified like this: > ServiceRegistration reg ... > reg.setProperties(...) > > So, when the setProperties takes place, "Client" is re-bound twice with the service "Service". > Indeed, in DependencyManager, when a ServiceEvent.MODIFIED event. is caught, the following code is invoked (line 170): > case ServiceEvent.MODIFIED: > m_componentManager.log( LogService.LOG_DEBUG, "Dependency Manager: Updating {0}", new Object[] > { serviceString }, null ); > // remove the service first > // only continue with further event handling if the service > // removal did not cause the component to be deactivated > if ( serviceRemoved( ref ) ) > { > // recalculate the number of services matching the filter > // because we don't know whether this service previously matched > // or not > ServiceReference refs[] = getFrameworkServiceReferences(); > m_size = ( refs == null ) ? 0 : refs.length; > // now try to bind the service - if it matches the target filter > // without recalculating the size (already done). > if ( targetFilterMatch( ref ) ) > { > serviceAdded( ref ); > } > } > break; > So, the service is first re-bound to the Client, when the serviceRemoved() method is invoked (it's a bound service replacement, I guess). > But the problem here is that the modified service is also re-bound, when serviceAdded is invoked (line 189). > Don't you think that this is a bug and the service should be re-bound only once, not twice ? > Here is the first stacktrace of the first bind: > java.lang.Exception: Stack trace > at java.lang.Thread.dumpStack(Thread.java:1158) > at client.Client.bind(Client.java:13) > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) > at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) > at java.lang.reflect.Method.invoke(Method.java:592) > at org.apache.felix.scr.impl.helper.BaseMethod.invokeMethod(BaseMethod.java:213) > at org.apache.felix.scr.impl.helper.BaseMethod.access$500(BaseMethod.java:38) > at org.apache.felix.scr.impl.helper.BaseMethod$Resolved.invoke(BaseMethod.java:542) > at org.apache.felix.scr.impl.helper.BaseMethod.invoke(BaseMethod.java:434) > at org.apache.felix.scr.impl.manager.DependencyManager.invokeBindMethod(DependencyManager.java:948) > at org.apache.felix.scr.impl.manager.DependencyManager.bind(DependencyManager.java:884) > at org.apache.felix.scr.impl.manager.DependencyManager.serviceRemoved(DependencyManager.java:367) > at org.apache.felix.scr.impl.manager.DependencyManager.serviceChanged(DependencyManager.java:177) > at org.apache.felix.framework.util.EventDispatcher.invokeServiceListenerCallback(EventDispatcher.java:878) > at org.apache.felix.framework.util.EventDispatcher.fireEventImmediately(EventDispatcher.java:732) > at org.apache.felix.framework.util.EventDispatcher.fireServiceEvent(EventDispatcher.java:662) > at org.apache.felix.framework.Felix.fireServiceEvent(Felix.java:3587) > at org.apache.felix.framework.Felix.access$000(Felix.java:40) > at org.apache.felix.framework.Felix$1.serviceChanged(Felix.java:625) > at org.apache.felix.framework.ServiceRegistry.servicePropertiesModified(ServiceRegistry.java:505) > at org.apache.felix.framework.ServiceRegistrationImpl.setProperties(ServiceRegistrationImpl.java:116) > at service.impl.ServiceFactory.run(ServiceFactory.java:48) > at java.lang.Thread.run(Thread.java:595) > and here is the second stacktrace, when Service is re-bound: > Client: bound Service : service.impl.ServiceImpl@142a80d > java.lang.Exception: Stack trace > at java.lang.Thread.dumpStack(Thread.java:1158) > at client.Client.bind(Client.java:13) > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) > at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) > at java.lang.reflect.Method.invoke(Method.java:592) > at org.apache.felix.scr.impl.helper.BaseMethod.invokeMethod(BaseMethod.java:213) > at org.apache.felix.scr.impl.helper.BaseMethod.access$500(BaseMethod.java:38) > at org.apache.felix.scr.impl.helper.BaseMethod$Resolved.invoke(BaseMethod.java:542) > at org.apache.felix.scr.impl.helper.BaseMethod.invoke(BaseMethod.java:434) > at org.apache.felix.scr.impl.manager.DependencyManager.invokeBindMethod(DependencyManager.java:948) > at org.apache.felix.scr.impl.manager.DependencyManager.serviceAdded(DependencyManager.java:271) > at org.apache.felix.scr.impl.manager.DependencyManager.serviceChanged(DependencyManager.java:189) > at org.apache.felix.framework.util.EventDispatcher.invokeServiceListenerCallback(EventDispatcher.java:878) > at org.apache.felix.framework.util.EventDispatcher.fireEventImmediately(EventDispatcher.java:732) > at org.apache.felix.framework.util.EventDispatcher.fireServiceEvent(EventDispatcher.java:662) > at org.apache.felix.framework.Felix.fireServiceEvent(Felix.java:3587) > at org.apache.felix.framework.Felix.access$000(Felix.java:40) > at org.apache.felix.framework.Felix$1.serviceChanged(Felix.java:625) > at org.apache.felix.framework.ServiceRegistry.servicePropertiesModified(ServiceRegistry.java:505) > at org.apache.felix.framework.ServiceRegistrationImpl.setProperties(ServiceRegistrationImpl.java:116) > at service.impl.ServiceFactory.run(ServiceFactory.java:48) > at java.lang.Thread.run(Thread.java:595) -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online.