[ 
https://issues.apache.org/jira/browse/IGNITE-1270?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15027062#comment-15027062
 ] 

Raúl Kripalani commented on IGNITE-1270:
----------------------------------------

Hi Romain,

Thanks for your input! Here's my feedback:

bq. Why you introduce the constrain of having only one ignite instance per jvm?

Unfortunately many Ignite variables/classes are at the static namespace, i.e. 
singletons. While this is OK for most non-OSGi containers out there, because 
the static classes will be loaded as many times as classloaders, this does not 
work in OSGi, because the static classes are only loaded once, and only once, 
per container. For example, have a look at {{IgniteUtils#gridClassLoader}}. In 
a web container with multiple WARs, each WAR will load its own copy of 
IgniteUtils. However, in an OSGi container that's not the case, therefore if we 
load multiple grids, the gridClassLoader (and all such variables) will not 
differentiate between one grid and another.

*IgniteOsgiUtils*

bq. I think this class should be package protected or in an private package. I 
see it more as an internal implementation detail and client should not be 
allowed to depends / use.

I didn't make the class private/protected nor static (even though it's a helper 
class for now) because in the future it may be necessary from ignite-core (e.g. 
serializers) to find out if the current environment is OSGi or not, or get the 
appropriate classloader, etc. Keeping it like this allows us to use the 
{{IgniteComponentType}} lookup mechanism in the future.

bq. gridCount()

I agree too. Grid in my head is something composed of many nodes. But in 
Ignite, the term is used to refer to a single Ignite instance (have a look at 
the unit tests).

bq. classloaders()

Good point. I've made {{classloaders()}} protected. When we support multiple 
instances, we can add a {{public static ClassLoader getClassLoader(Ignite 
ignite)}} method. Until then, exposing an API for this is useless.

bq. Why don't you use the parent child classloader delegation?

Because in OSGi, classloaders are connected in a graph fashion, not in a tree 
pattern. The parent classloader is useless here.

bq. Why are you going first to the bundle and then to the class loader. Maybe 
you should put the given class loader as a parent and then fallback to the 
bundle, no? Because this bundle will import the Ignite package and therefore 
its classloader should be able to see some of the ignite classes.

I've followed the model that has worked pretty well in Apache Camel. In pure 
OSGi, bundles are always resolved from within the classspace of the current 
bundle. This is what the user expects. That's why the bundle receives priority 
#1 in my implementation.

bq. Do you plan to support the dynamic addition and removal of bundles? This 
dynamicity may impact the nonResolvable and resolved Set. As some classes may 
become resolvable and some other not or in a different way [...]

Yes, I agree with you entirely. It is in my roadmap to manage the caches 
appropriately as bundles come and go via a {{BundleTracker}}. However, this is 
only necessary in a changing environment. For now I don't see it as a blocker, 
but it's definitely something to be done in Ignite 1.6 or even 1.5.1.

*IgniteOsgiContextActivator*

bq. Maybe the Abstract key word should be used in the name to make it crystal 
clear 

Agree, thanks for the note.

bq. You should make the start(BundleContext context) and stop(BundleContext 
context) final in order to avoid the hack I mention above.

Hmmm, ok. But in exchange I have introduced callback methods {{preStart}}, 
{{postStart}}, {{preStop}}, {{postStop}} to give users some flexibility to 
introduce custom logic.

*Maven*

bq. In you effort to extract the version maybe we can add a new jira ticket to 
also use the dependencyManagement section to avoid to use the version 
properties everywhere?

I think it's overkill to add all those dependencies in dependencyManagement, 
when most of them are only used in one module. I _could_ see shared 
dependencies being moved to dependencyManagement, but I don't like having mixed 
criteria and further development overhead. No one is going to remember in the 
future to promote an ad-hoc dependency to dependencyManagement if they 
introduce a dependency that happens to be used elsewhere... So I rather keep it 
as it is. It's already a huge step forward to have dependency versions in 
properties, as it facilitates tracking and upgrade management big time.

---

I have pushed my changes to the branch. Have a look again and let me know what 
you think.

Thanks for your constructive comments!

Regards,
Raúl.

> Basic OSGi support for Ignite
> -----------------------------
>
>                 Key: IGNITE-1270
>                 URL: https://issues.apache.org/jira/browse/IGNITE-1270
>             Project: Ignite
>          Issue Type: New Feature
>          Components: general, osgi
>            Reporter: Raúl Kripalani
>            Assignee: Raúl Kripalani
>             Fix For: 1.5
>
>
> Basics for a first iteration:
> * Manifest creation for all Java-based modules.
> * Apache Karaf features file to facilitate deployment (along with 
> dependencies).
> * Make Ignite classloading OSGi-friendly and support different strategies.
> Future:
> * Support peer class-loading.
> * Potentially support remote 3rd dependency class-loading for Apache Karaf 
> (via Pax Mvn URL and Aether, one can fetch a bundle from Maven repositories).



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to