Anuj created FELIX-4709:
---------------------------

             Summary: 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


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