[ 
https://issues.apache.org/jira/browse/FELIX-4709?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Pierre De Rop updated FELIX-4709:
---------------------------------
    Attachment: FELIX-4709.patch

I attached to this issue the FELIX-3709.patch file, which you can apply on the 
dependencymanager/runtime/ 3.2.0 codebase.

Please let me know if this is fixing your problem.


> Incorrect Named Dependencies are binded to the Service Instance
> ---------------------------------------------------------------
>
>                 Key: FELIX-4709
>                 URL: https://issues.apache.org/jira/browse/FELIX-4709
>             Project: Felix
>          Issue Type: Bug
>          Components: Dependency Manager
>    Affects Versions: dependencymanager.runtime-3.2.0
>         Environment: Windows 7 Enterprise, Eclipse 3.8
>            Reporter: Anuj
>            Assignee: Pierre De Rop
>         Attachments: FELIX-4709.patch
>
>
> There is an issue when we use @FactoryConfigurationAdapterService with 
> dynamic filtering using init() method. 
> Use Case: We want to have multiple instances of a service. For each service 
> instance,  we want to dynamically specify service dependency filter based on 
> the configuration received for the service instance.
> Issue: Whenever  init() method of new created service instance is invoked, 
> ALL Named dependencies(with filters) defined in init method of previously 
> created service instances are also added as named dependencies for this 
> service instance. This is not logical as init must ONLY  add filters defined 
> in the init of this particular service instance.  When we run DM command, 
> this is visible. We created two service instances with value of property: 
> com.ericsson.rm.config.tag  as main and v30. In the output of Dm command, we 
> can see that second instance of the factory i.e. 137 also has named 
> dependencies with filters of the first service instance i.e. 136 . Second 
> instance must not have named dependencies with filter  
> com.ericsson.rm.config.tag=main which was specified in configuration of first 
> instance (136) . 137 must only have named dependencies with filter 
> com.ericsson.rm.config.tag=v30.
> Output of DM command:
> [110] com.ericsson.bss.voucher.traffic.persistence.cassandra
>  [34] Adapter for factory pid 
> com.ericsson.rm.voucher.traffic.persistence.cassandra registered
>     com.ericsson.bss.ctrl.service.jmx.MBeanServerAdmin service required 
> available
>     javax.transaction.TransactionManager service required available
>  [136] 
> com.ericsson.rm.service.voucher.traffic.persistence.VoucherPersistenceService(service.pid=com.ericsson.rm.voucher.traffic.persistence.cassandra-1416741861126-0,com.ericsson.rm.config.tag=main,service.factoryPid=com.ericsson.rm.voucher.traffic.persistence.cassandra)
>  registered
> javax.transaction.TransactionManager service required available       
> com.ericsson.rm.service.domain.types.cryption.DomainTypesCryption 
> (com.ericsson.rm.config.tag=main-db) service required available 
> com.ericsson.rm.service.encryption.hash.EncryptionTokenService 
> (com.ericsson.rm.config.tag=main) service required available
>  [137] 
> com.ericsson.rm.service.voucher.traffic.persistence.VoucherPersistenceService(service.pid=com.ericsson.rm.voucher.traffic.persistence.cassandra-1416742092818-74,com.ericsson.rm.config.tag=v30,
>  ,service.factoryPid=com.ericsson.rm.voucher.traffic.persistence.cassandra) 
> registered
>  javax.transaction.TransactionManager service required available 
> com.ericsson.rm.service.domain.types.cryption.DomainTypesCryption 
> (com.ericsson.rm.config.tag=main-db) service required availablc
> com.ericsson.rm.service.encryption.hash.EncryptionTokenService 
> (com.ericsson.rm.config.tag=main) service required available
>  com.ericsson.rm.service.domain.types.cryption.DomainTypesCryption 
> (com.ericsson.rm.config.tag=v30-db) service required available
>     com.ericsson.rm.service.encryption.hash.EncryptionTokenService 
> (com.ericsson.rm.config.tag=v30) service required available
> We are intermittently facing issues where named dependencies (with filters 
> specified in other service instances) are getting bound to a service instance 
> and we suspect that the above mentioned issue is the reason. Please confirm 
> our assumption. If you see any other problem in the code , please let us 
> know. Please also suggest workaround to make sure binding is correct.
> Felix Code Analysis:
> Looking into the code of ServiceLifeCycleHandler,we observed: Instead of 
> creating new list of named dependencies with their filter for EACH service 
> instance created, ServiceLifecycleHandler maintains a common list  of all 
> named dependencies with their filters for all service instances.  Thus when 
> init method of a service instance is called, named dependencies with filters 
> are added to existing list of dependencies from previous service instances 
> We used dependency manager as follows:
> @FactoryConfigurationAdapterService(provides = 
> VoucherPersistenceService.class, factoryPid = 
> "com.ericsson.rm.voucher.traffic.persistence.cassandra",
>         propagate = true, updated = "configure")
> public class CassandraPersistence implements VoucherPersistenceService
> {
> ……
> //Named Dependencies.
> @ServiceDependency(name = "Cryption", added = "bindDomainTypesCryption", 
> removed = "unbindDomainTypesCryption", required = true)
>     public void bindDomainTypesCryption(final DomainTypesCryption 
> parDomainTypesCryption)
>     { //some code }
> @ServiceDependency(name = "EncryptionTokenService", added = 
> "bindEncryptionTokenService", removed = "unbindEncryptionTokenService", 
> required = true)
>     public void bindEncryptionTokenService(final EncryptionTokenService 
> parEncryptionTokenService)
>     { //some code  }
>     
> //Unnamed Dependencies
>     @ServiceDependency(added = "bindTransactionManager", removed = 
> "unbindTransactionManager", required = true)
>     public void bindTransactionManager(final TransactionManager 
> parTransactionManager)
>     {//some code}
>     protected void configure(Dictionary<String, ?> parParameters)
>     {
>         myMvnoId = (String) parParameters.get(Constants.MVNO_CONFIG_TAG);
>         
>     }
> @Init
>     Map init()
>     {
>         Map m = new HashMap();
>         String filter = "(com.ericsson.rm.config.tag=" + myMvnoId + ")";
>  m.put("Cryption.filter", Constants.MVNO_FILTER_PREFIX + myMvnoId + 
> Constants.MVNO_SEPARATOR + "db)");
>         m.put("EncryptionTokenService.filter", filter);
>         return m;
>     } 
> Thanks



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to