You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@felix.apache.org by "Anuj (JIRA)" <ji...@apache.org> on 2014/11/23 15:47:12 UTC

[jira] [Created] (FELIX-4709) Incorrect Named Dependencies are binded to the Service Instance

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)