[
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)