You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@felix.apache.org by Rajini Sivaram <ra...@googlemail.com> on 2007/06/25 14:22:21 UTC

Multiple versions of bundles using declarative services

Hello,

I have two versions of an OSGi bundle which use declarative services. Both
bundles use identical files for their component.xml file and hence use the
same component name. Equinox runs both components and creates services and
resolves references correctly. Felix throws an exception when trying to
start the version 2 bundle since the component name is already used for
version 1. From the OSGi spec, it is not clear whether it is permissible to
have multiple DS components with the same name. It does say "The name of a
component must be globally unique because it is used as a PID in several
places". Since in this case, the components have identical configurations,
should the runtime prevent the starting of the bundle? I dont think Equinox
does any checks for duplicate component names.


    --- [RetailerComponent1] Exception with component : Cannot register
Component ---

    *org.osgi.service.component.ComponentException*: The component name
'RetailerComponent1' has already been registered.

    at org.apache.felix.scr.ComponentRegistry.checkComponentName(*
ComponentRegistry.java:102*)

    at org.apache.felix.scr.BundleComponentActivator.initialize(*
BundleComponentActivator.java:139*)

    at org.apache.felix.scr.BundleComponentActivator.<init>(*
BundleComponentActivator.java:90*)

    at org.apache.felix.scr.Activator.loadComponents(*Activator.java:208*)

    at org.apache.felix.scr.Activator.bundleChanged(*Activator.java:157*)

    at
org.apache.felix.framework.util.EventDispatcher.invokeBundleListenerCallback
(*EventDispatcher.java:637*)

    at org.apache.felix.framework.util.EventDispatcher.fireEventImmediately(
*EventDispatcher.java:566*)

    at org.apache.felix.framework.util.EventDispatcher.fireBundleEvent(*
EventDispatcher.java:480*)

    at org.apache.felix.framework.Felix.fireBundleEvent(*Felix.java:3366*)

    at org.apache.felix.framework.Felix._startBundle(*Felix.java:1315*)

    at org.apache.felix.framework.Felix.startBundle(*Felix.java:1243*)

    at org.apache.felix.framework.BundleImpl.start(*BundleImpl.java:350*)


-- 
Thank you...

Regards,

Rajini

Re: Multiple versions of bundles using declarative services

Posted by Rajini Sivaram <ra...@googlemail.com>.
Felix,

Thanks for your note. It seems restrictive to require different component
names for two different versions of a component, but since the spec doesn't
allow it, I will modify my test.


Thank you...

Regards,

Rajini

On 6/25/07, Felix Meschberger <Fe...@day.com> wrote:
>
> Hi Rajini,
>
> My understanding of the spec is to really only have a single instance of a
> component with a given name as the phrase sais "must be globally unique".
> I
> understand the follow up "because it is used as a PID" as just an
> explanaiton. Furthermore, the spec also says "A PID must be unique for
> each
> service. A bundle must not register multiple services with the same PID,
> nor
> should other bundles use the same PID. If this happens, it is an error
> condition" (Core Specification, Section 5.2.6).
>
> Consequently, I think the behaviour of Felix SCR is correct.
>
> Or am I wrong ?
>
> Regards
> Felix
>
> On 6/25/07, Rajini Sivaram <ra...@googlemail.com> wrote:
> >
> > Hello,
> >
> > I have two versions of an OSGi bundle which use declarative services.
> Both
> > bundles use identical files for their component.xml file and hence use
> the
> > same component name. Equinox runs both components and creates services
> and
> > resolves references correctly. Felix throws an exception when trying to
> > start the version 2 bundle since the component name is already used for
> > version 1. From the OSGi spec, it is not clear whether it is permissible
> > to
> > have multiple DS components with the same name. It does say "The name of
> a
> > component must be globally unique because it is used as a PID in several
> > places". Since in this case, the components have identical
> configurations,
> > should the runtime prevent the starting of the bundle? I dont think
> > Equinox
> > does any checks for duplicate component names.
> >
> >
> >     --- [RetailerComponent1] Exception with component : Cannot register
> > Component ---
> >
> >     *org.osgi.service.component.ComponentException*: The component name
> > 'RetailerComponent1' has already been registered.
> >
> >     at org.apache.felix.scr.ComponentRegistry.checkComponentName(*
> > ComponentRegistry.java:102*)
> >
> >     at org.apache.felix.scr.BundleComponentActivator.initialize(*
> > BundleComponentActivator.java:139*)
> >
> >     at org.apache.felix.scr.BundleComponentActivator.<init>(*
> > BundleComponentActivator.java:90*)
> >
> >     at org.apache.felix.scr.Activator.loadComponents(*Activator.java
> :208*)
> >
> >     at org.apache.felix.scr.Activator.bundleChanged(*Activator.java
> :157*)
> >
> >     at
> >
> >
> org.apache.felix.framework.util.EventDispatcher.invokeBundleListenerCallback
> > (*EventDispatcher.java:637*)
> >
> >     at
> > org.apache.felix.framework.util.EventDispatcher.fireEventImmediately(
> > *EventDispatcher.java:566*)
> >
> >     at org.apache.felix.framework.util.EventDispatcher.fireBundleEvent(*
> > EventDispatcher.java:480*)
> >
> >     at org.apache.felix.framework.Felix.fireBundleEvent(*Felix.java
> :3366*)
> >
> >     at org.apache.felix.framework.Felix._startBundle(*Felix.java:1315*)
> >
> >     at org.apache.felix.framework.Felix.startBundle(*Felix.java:1243*)
> >
> >     at org.apache.felix.framework.BundleImpl.start(*BundleImpl.java
> :350*)
> >
> >
> > --
> > Thank you...
> >
> > Regards,
> >
> > Rajini
> >
>

Re: Multiple versions of bundles using declarative services

Posted by Felix Meschberger <Fe...@day.com>.
Hi BJ,

I could to agree to make SCR more permissive (and thus violating the spec),
but I am a bit afraid of the consequences: What about the configurations
from the Config Admin Service ? That one selects a configuration by PID and
is only allowed to hand the configuration to  a single bundle to which it is
bound by its bundle location - and the bundle location has to be unique,
too, right ?

While the requirement is against the bundle developer it is definitely in
favor of the bundle user and the system administrator, which is IMHO far
more important. But the requirement can also be seen as favorable to the
bundle developer in the sense, that a duplicate name might just be caused by
an error and not by intent. Silently accepting such a situation might lead
to problems trying to resolve subtle error situations.

How about using a component name, which is slightly different for each
version ?

But of course, if a majority of people would opt to make SCR more
permissive, we could certainly do it.

Regards
Felix

On 6/26/07, BJ Hargrave <ha...@us.ibm.com> wrote:
>
> I think the SCR impl should be more forgiving here. While the spec says
> the component name must be unique. This requirement is against the bundle
> developer. SCR can be more permissive and allow multiple bundles to use
> the same component name. Given that OSGi allows multiple versions of a
> bundle to be running, it seems likely that these bundles will use the same
> component names. I don't think we want to require a bundle developer to
> change component names for each release of her bundle just so SCR will
> allow multiple versions of the bundle to run.
> --
>
> BJ Hargrave
> Senior Technical Staff Member, IBM
> OSGi Fellow and CTO of the OSGi Alliance
> hargrave@us.ibm.com
>
> office: +1 386 848 1781
> mobile: +1 386 848 3788
>
>
>
>
> "Felix Meschberger" <Fe...@day.com>
> Sent by: fmeschbe@gmail.com
> 2007-06-25 08:36
> Please respond to
> dev@felix.apache.org
>
>
> To
> dev@felix.apache.org
> cc
>
> Subject
> Re: Multiple versions of bundles using declarative services
>
>
>
>
>
>
> Hi Rajini,
>
> My understanding of the spec is to really only have a single instance of a
> component with a given name as the phrase sais "must be globally unique".
> I
> understand the follow up "because it is used as a PID" as just an
> explanaiton. Furthermore, the spec also says "A PID must be unique for
> each
> service. A bundle must not register multiple services with the same PID,
> nor
> should other bundles use the same PID. If this happens, it is an error
> condition" (Core Specification, Section 5.2.6).
>
> Consequently, I think the behaviour of Felix SCR is correct.
>
> Or am I wrong ?
>
> Regards
> Felix
>
> On 6/25/07, Rajini Sivaram <ra...@googlemail.com> wrote:
> >
> > Hello,
> >
> > I have two versions of an OSGi bundle which use declarative services.
> Both
> > bundles use identical files for their component.xml file and hence use
> the
> > same component name. Equinox runs both components and creates services
> and
> > resolves references correctly. Felix throws an exception when trying to
> > start the version 2 bundle since the component name is already used for
> > version 1. From the OSGi spec, it is not clear whether it is permissible
> > to
> > have multiple DS components with the same name. It does say "The name of
> a
> > component must be globally unique because it is used as a PID in several
> > places". Since in this case, the components have identical
> configurations,
> > should the runtime prevent the starting of the bundle? I dont think
> > Equinox
> > does any checks for duplicate component names.
> >
> >
> >     --- [RetailerComponent1] Exception with component : Cannot register
> > Component ---
> >
> >     *org.osgi.service.component.ComponentException*: The component name
> > 'RetailerComponent1' has already been registered.
> >
> >     at org.apache.felix.scr.ComponentRegistry.checkComponentName(*
> > ComponentRegistry.java:102*)
> >
> >     at org.apache.felix.scr.BundleComponentActivator.initialize(*
> > BundleComponentActivator.java:139*)
> >
> >     at org.apache.felix.scr.BundleComponentActivator.<init>(*
> > BundleComponentActivator.java:90*)
> >
> >     at
> org.apache.felix.scr.Activator.loadComponents(*Activator.java:208*)
> >
> >     at
> org.apache.felix.scr.Activator.bundleChanged(*Activator.java:157*)
> >
> >     at
> >
> >
>
> org.apache.felix.framework.util.EventDispatcher.invokeBundleListenerCallback
> > (*EventDispatcher.java:637*)
> >
> >     at
> > org.apache.felix.framework.util.EventDispatcher.fireEventImmediately(
> > *EventDispatcher.java:566*)
> >
> >     at org.apache.felix.framework.util.EventDispatcher.fireBundleEvent(*
> > EventDispatcher.java:480*)
> >
> >     at
> org.apache.felix.framework.Felix.fireBundleEvent(*Felix.java:3366*)
> >
> >     at org.apache.felix.framework.Felix._startBundle(*Felix.java:1315*)
> >
> >     at org.apache.felix.framework.Felix.startBundle(*Felix.java:1243*)
> >
> >     at
> org.apache.felix.framework.BundleImpl.start(*BundleImpl.java:350*)
> >
> >
> > --
> > Thank you...
> >
> > Regards,
> >
> > Rajini
> >
>
>
>

Re: Multiple versions of bundles using declarative services

Posted by BJ Hargrave <ha...@us.ibm.com>.
Sure. Why don't you file a bug :-)
-- 

BJ Hargrave
Senior Technical Staff Member, IBM
OSGi Fellow and CTO of the OSGi Alliance
hargrave@us.ibm.com

office: +1 386 848 1781
mobile: +1 386 848 3788




"Richard S. Hall" <he...@ungoverned.org> 
2007-06-26 04:26
Please respond to
dev@felix.apache.org


To
dev@felix.apache.org
cc

Subject
Re: Multiple versions of bundles using declarative services






Then I think the spec should clarify this point, otherwise it is 
confusing.

-> richard


BJ Hargrave wrote:
> I think the SCR impl should be more forgiving here. While the spec says 
> the component name must be unique. This requirement is against the 
bundle 
> developer. SCR can be more permissive and allow multiple bundles to use 
> the same component name. Given that OSGi allows multiple versions of a 
> bundle to be running, it seems likely that these bundles will use the 
same 
> component names. I don't think we want to require a bundle developer to 
> change component names for each release of her bundle just so SCR will 
> allow multiple versions of the bundle to run.
> 



Re: Multiple versions of bundles using declarative services

Posted by "Richard S. Hall" <he...@ungoverned.org>.
Then I think the spec should clarify this point, otherwise it is confusing.

-> richard


BJ Hargrave wrote:
> I think the SCR impl should be more forgiving here. While the spec says 
> the component name must be unique. This requirement is against the bundle 
> developer. SCR can be more permissive and allow multiple bundles to use 
> the same component name. Given that OSGi allows multiple versions of a 
> bundle to be running, it seems likely that these bundles will use the same 
> component names. I don't think we want to require a bundle developer to 
> change component names for each release of her bundle just so SCR will 
> allow multiple versions of the bundle to run.
>   

Re: Multiple versions of bundles using declarative services

Posted by BJ Hargrave <ha...@us.ibm.com>.
I think the SCR impl should be more forgiving here. While the spec says 
the component name must be unique. This requirement is against the bundle 
developer. SCR can be more permissive and allow multiple bundles to use 
the same component name. Given that OSGi allows multiple versions of a 
bundle to be running, it seems likely that these bundles will use the same 
component names. I don't think we want to require a bundle developer to 
change component names for each release of her bundle just so SCR will 
allow multiple versions of the bundle to run.
-- 

BJ Hargrave
Senior Technical Staff Member, IBM
OSGi Fellow and CTO of the OSGi Alliance
hargrave@us.ibm.com

office: +1 386 848 1781
mobile: +1 386 848 3788




"Felix Meschberger" <Fe...@day.com> 
Sent by: fmeschbe@gmail.com
2007-06-25 08:36
Please respond to
dev@felix.apache.org


To
dev@felix.apache.org
cc

Subject
Re: Multiple versions of bundles using declarative services






Hi Rajini,

My understanding of the spec is to really only have a single instance of a
component with a given name as the phrase sais "must be globally unique". 
I
understand the follow up "because it is used as a PID" as just an
explanaiton. Furthermore, the spec also says "A PID must be unique for 
each
service. A bundle must not register multiple services with the same PID, 
nor
should other bundles use the same PID. If this happens, it is an error
condition" (Core Specification, Section 5.2.6).

Consequently, I think the behaviour of Felix SCR is correct.

Or am I wrong ?

Regards
Felix

On 6/25/07, Rajini Sivaram <ra...@googlemail.com> wrote:
>
> Hello,
>
> I have two versions of an OSGi bundle which use declarative services. 
Both
> bundles use identical files for their component.xml file and hence use 
the
> same component name. Equinox runs both components and creates services 
and
> resolves references correctly. Felix throws an exception when trying to
> start the version 2 bundle since the component name is already used for
> version 1. From the OSGi spec, it is not clear whether it is permissible
> to
> have multiple DS components with the same name. It does say "The name of 
a
> component must be globally unique because it is used as a PID in several
> places". Since in this case, the components have identical 
configurations,
> should the runtime prevent the starting of the bundle? I dont think
> Equinox
> does any checks for duplicate component names.
>
>
>     --- [RetailerComponent1] Exception with component : Cannot register
> Component ---
>
>     *org.osgi.service.component.ComponentException*: The component name
> 'RetailerComponent1' has already been registered.
>
>     at org.apache.felix.scr.ComponentRegistry.checkComponentName(*
> ComponentRegistry.java:102*)
>
>     at org.apache.felix.scr.BundleComponentActivator.initialize(*
> BundleComponentActivator.java:139*)
>
>     at org.apache.felix.scr.BundleComponentActivator.<init>(*
> BundleComponentActivator.java:90*)
>
>     at 
org.apache.felix.scr.Activator.loadComponents(*Activator.java:208*)
>
>     at 
org.apache.felix.scr.Activator.bundleChanged(*Activator.java:157*)
>
>     at
>
> 
org.apache.felix.framework.util.EventDispatcher.invokeBundleListenerCallback
> (*EventDispatcher.java:637*)
>
>     at
> org.apache.felix.framework.util.EventDispatcher.fireEventImmediately(
> *EventDispatcher.java:566*)
>
>     at org.apache.felix.framework.util.EventDispatcher.fireBundleEvent(*
> EventDispatcher.java:480*)
>
>     at 
org.apache.felix.framework.Felix.fireBundleEvent(*Felix.java:3366*)
>
>     at org.apache.felix.framework.Felix._startBundle(*Felix.java:1315*)
>
>     at org.apache.felix.framework.Felix.startBundle(*Felix.java:1243*)
>
>     at 
org.apache.felix.framework.BundleImpl.start(*BundleImpl.java:350*)
>
>
> --
> Thank you...
>
> Regards,
>
> Rajini
>



Re: Multiple versions of bundles using declarative services

Posted by Felix Meschberger <Fe...@day.com>.
Hi Rajini,

My understanding of the spec is to really only have a single instance of a
component with a given name as the phrase sais "must be globally unique". I
understand the follow up "because it is used as a PID" as just an
explanaiton. Furthermore, the spec also says "A PID must be unique for each
service. A bundle must not register multiple services with the same PID, nor
should other bundles use the same PID. If this happens, it is an error
condition" (Core Specification, Section 5.2.6).

Consequently, I think the behaviour of Felix SCR is correct.

Or am I wrong ?

Regards
Felix

On 6/25/07, Rajini Sivaram <ra...@googlemail.com> wrote:
>
> Hello,
>
> I have two versions of an OSGi bundle which use declarative services. Both
> bundles use identical files for their component.xml file and hence use the
> same component name. Equinox runs both components and creates services and
> resolves references correctly. Felix throws an exception when trying to
> start the version 2 bundle since the component name is already used for
> version 1. From the OSGi spec, it is not clear whether it is permissible
> to
> have multiple DS components with the same name. It does say "The name of a
> component must be globally unique because it is used as a PID in several
> places". Since in this case, the components have identical configurations,
> should the runtime prevent the starting of the bundle? I dont think
> Equinox
> does any checks for duplicate component names.
>
>
>     --- [RetailerComponent1] Exception with component : Cannot register
> Component ---
>
>     *org.osgi.service.component.ComponentException*: The component name
> 'RetailerComponent1' has already been registered.
>
>     at org.apache.felix.scr.ComponentRegistry.checkComponentName(*
> ComponentRegistry.java:102*)
>
>     at org.apache.felix.scr.BundleComponentActivator.initialize(*
> BundleComponentActivator.java:139*)
>
>     at org.apache.felix.scr.BundleComponentActivator.<init>(*
> BundleComponentActivator.java:90*)
>
>     at org.apache.felix.scr.Activator.loadComponents(*Activator.java:208*)
>
>     at org.apache.felix.scr.Activator.bundleChanged(*Activator.java:157*)
>
>     at
>
> org.apache.felix.framework.util.EventDispatcher.invokeBundleListenerCallback
> (*EventDispatcher.java:637*)
>
>     at
> org.apache.felix.framework.util.EventDispatcher.fireEventImmediately(
> *EventDispatcher.java:566*)
>
>     at org.apache.felix.framework.util.EventDispatcher.fireBundleEvent(*
> EventDispatcher.java:480*)
>
>     at org.apache.felix.framework.Felix.fireBundleEvent(*Felix.java:3366*)
>
>     at org.apache.felix.framework.Felix._startBundle(*Felix.java:1315*)
>
>     at org.apache.felix.framework.Felix.startBundle(*Felix.java:1243*)
>
>     at org.apache.felix.framework.BundleImpl.start(*BundleImpl.java:350*)
>
>
> --
> Thank you...
>
> Regards,
>
> Rajini
>