There has been a lot of discussion in the osgi world about isolating sets of 
bundles from one another by various means and we might start considering what 
we're going to do about this subject.  I don't really expect any core isolation 
functionality will be implemented in geronimo -- felix, aries, and karaf are 
more likely spots -- but we should think about how we want to use it.

All the current ideas seem to be based on the Framework Hooks spec to be part 
of osgi 4.3 core.  IIUC this is currently implemented in equinox 3.7 but 
implementation has not yet started in felix.  The basic idea behind this is 
that you can register things into the core framework bundle resolution process 
that can restrict the visibility of bundles, packages, and services during 
resolution.  So if you want to have two copies of the same bundle running at 
once, you register something that hides all evidence of the first bundle when 
the second one is being resolved.

This looks like it provides a flexible framework for implementing isolation 
schemes, but it certainly isn't usable directly.  The next step is to think 
about named sets of bundles, which might be called subsystems.  The general 
idea is that within a subsystem bundles can see everything about one another 
but crossing the boundary of the set to other bundles visibility is restricted.

You can think of different criteria and situations:

1. what can stuff in the subsystem import from outside? 
  a. you can specify imports explicitly.
  b. you can automatically try to import anything not provided inside the 
subsystem
  c. I suppose you could prohibit imports.  This is the top level framework, 
but I don't see other use for it.

2. What does "outside" mean?
  a. current models are that subsystems are a hierarchical tree, so imports are 
all from one particular containing subsystem (regarding the "framework" as top 
level)
  b. It doesn't look hard to implement a directed acyclic graph (DAG) of 
subsystems so you can specify the subsystems a subsystem can import from.

3. what does the subsystem make visible outside the subsystem?
  a. you can specify exports explicitly
  b. you can export nothing (aries eba isolation model)
  c. you can export everything (karaf features non-isolation model).

4. Are the contents of the subsystem mutable (can you add and remove bundles, 
and nest more subsystems inside)?
  a. no -- eba model
  b. yes -- but adding bundles doesn't change imports and exports
  c. yes -- and adding/removing bundles can change imports and exports.  (since 
karaf features don't have isolation, they might work this way, but they aren't 
currently mutable).


Since I tend to like flexibility and don't like constraining users I lean 
toward trying to make the "default" idea of isolation in geronimo be:
- explicitly specified imports and exports
- mutable subsystem contents
- multiple parent subsystems.


With mutable contents comes the problem of specifying which subsystem a bundle 
gets installed into.  For a programmatic install action you can just include 
this info in the install action parameters, perhaps either explicitly or by 
consulting an environment variable (e.g. cs (change-subsystem) foo followed by 
install mybundle)  For hot deploy scenarios I'd think you'd need something like 
a manifest header.  This is another reason I don't like hot deploy :-)

Finally there's the question of what other changes are needed in geronimo to 
make this plausible and useful.

1. class visibility.  Right now we might be able to isolate applications from 
one another but it would be more difficult to isolate applications from any 
geronimo classes due to how we use gbeans.  Gbeans kind of set themselves up 
and the ones that do stuff for javaee apps need access to both their own 
classes and the application classes in the same classloader.  IIUC Jarek has 
done some things to construct a suitable composite classloader that we use for 
WABs.  We might be able to leverage this  for all javaee artifacts.  However I 
think a more appropriate avenue would be to go to a bundle extender 
architecture where no such composite classloader is needed: the extender can 
directly construct the runtime container objects itself and only use the 
application classloader to load application classes.

2. Service visibility.  (this part is completely speculative).   Right now 
geronimo is assembled 99% using gbeans and tracking gbean references in the 
geronimo kernel.  One important part of this is that single-valued references 
follow the DAG of geronimo configurations.  This has been very convenient.  As 
we move away from gbeans and managing the service references ourselves we might 
consider if a similar approach in osgi would be useful (2.b. above).  In any 
case our current kernel gbean tracking is really not compatible with osgi 
isolation since we have no good way to reflect the osgi isolation in the kernel 
and make gbean visibility agree with service visibility.

 We can get started on bundle extenders any time.... I've been working towards 
a prototype for this for connectors in my sandbox.... but I doubt it will be 
too productive to try to install isolation until the aries prototype gets a 
little further along and I suspect it will need to be integrated in some way 
into karaf first.

Comments?

thanks
david jencks

Reply via email to