Hey guys, About the TCCL, I need to dig deeper into how serialisation is being done now. If, at any point, we are resolving a class through the classloader of a particular class, e.g. Ignition.getClass().getClassLoader(), etc. we are using the class space of the bundle containing that class. If we are using a class from Ignite, we obviously wouldn't be able to find a custom DTO provided by a user.
In Camel we have found this problem several times and we've solved it by changing the TCCL, or using the TCCL [1] [2] to resolve classes. As I said, I need to look into this deeper and I'll have some time on Thursday, so I hope you don't mind waiting a little bit. I have already "bundle-fied" most of Ignite modules in the corresponding branch [3], so my next step is to test out the Ignite examples inside an OSGi environment (Karaf 4). [1] https://issues.apache.org/jira/browse/CAMEL-5748 [2] https://issues.apache.org/jira/browse/CAMEL-5722 [3] https://github.com/apache/ignite/tree/ignite-1527 Regards, *Raúl Kripalani* PMC & Committer @ Apache Ignite, Apache Camel | Integration, Big Data and Messaging Engineer http://about.me/raulkripalani | http://www.linkedin.com/in/raulkripalani http://blog.raulkr.net | twitter: @raulvk On Tue, Nov 3, 2015 at 10:38 AM, Romain Gilles <romain.gil...@gmail.com> wrote: > Hi Raul, > - Do you plan to use the TCCL when marshalling in OSGi env? If yes how? > - I like the point 2. Maybe for a graph of object that come from different > packages / bundles you may have to recursively capture the package version > of the individual element of your graph. > - For the point 3 I wonder if it will not over-complexify the solution. As > a developer you will have to think about it. And it is not obvious in the > code where things are serialized or not. You may use lambda in your > application code therefore the current package become what you call a DTO > package. The current state of ignite does not enforce you to specify it for > "classical" classloading application. If you introduce this extra step for > OSGi ready application you will maybe discourage people to use OSGi. > > To comeback to our solution. We start we a strong assumption: our cluster > is homogeneous in term of code so, of course, it simplify our life :). > > BTW if you can introduce an extension point in the class resolution > mechanism it can be interesting for end user in order to allow them to > optimize it based on there specific use cases. > > Romain. > > Le mar. 3 nov. 2015 à 00:21, Raul Kripalani <r...@evosent.com> a écrit : > > > Hi Andrey, > > > > Thanks for the participation in this topic. > > > > I don't like the solution to incorporate the bundle symbolic name in the > > serialised form. Nothing guarantees that the classdef will be located > under > > the same bundle in both source and target machines. We also have to take > > into account that OSGi allows for multiple versions of the same > > bundle/packages to co-exist in the same container. So it becomes more > > complex. > > > > Using the TCCL should work when serialising, but it'll probably be of no > > use when deserialising on the other end. > > > > I need to enhance Ignite to: > > > > 1. Use the TCCL when marshalling on one end. > > 2. Incorporate the package version of the class in the serialised form if > > Ignite is running in an OSGi environment. > > 3. On the receiver end, discover cache entities / DTOs in all bundles > > through a custom OSGi manifest header or the like, as I explained before. > > Package version must be taken into account. > > > > What do you think? > > > > Raúl. > > On 2 Nov 2015 17:25, "Andrey Kornev" <andrewkor...@hotmail.com> wrote: > > > > > Raul, > > > > > > The fundamental hurdle we need to jump over to make Ignite OSGi-enabled > > is > > > the marshalling. More specifically the issue is with deserialization of > > the > > > classes that are provided by the bundles other than the Ignite bundle > > > itself. > > > > > > When the Ignite transport layer receives a message it needs to figure > out > > > how to deserialize the bytes and for that it needs to know the bundle > > that > > > provides the class to be deserailized. At this point TCCL is of no use. > > To > > > make things more complex, the class may contain other classes that come > > > from other bundles, and so on recursively. This means that each object > in > > > the hierarchy must be serialized with its bundle name (or bundle id), > so > > > that the deserializer will then be able to correctly resolve the class > > > while traversing the object hierarchy during deserialization. > > > > > > Unfortunately, Ignite's OptimizedMarshaller is lacking the ability to > > plug > > > in a custom class resolver. Romain's solution was to use Kryo that does > > > provide a way to customize class resolution. It has solved the problem > of > > > capturing the bundle info and he was able to successfully run Ignite > as a > > > bundle in an OSGi container (after some repackaging and inclusion of > the > > > manifest). But Kryo-based marshalling introduced a lot of complexity to > > the > > > code and incorrect use of Kryo's numerous serializers caused some weird > > > hard-to-debug issues in the Ignite core (like duplicate cache entries > due > > > to incorrect marshalling of the GridDhtPArtitonFullMap class -- go > > > figure!). Overall the Kryo-based solution is brittle and hard to > > maintain. > > > > > > I feel the correct solution to OSGi problem would be to > > > 1) enhance the OptimizedMarshaller to allow custom class resolution. > > > 2) provide an OSGi-enabled OptimizedMarshaller (in addition to the > > > original one) to be used in OSGi environment. > > > > > > Regards > > > Andrey > > > > > > > From: ra...@apache.org > > > > Date: Mon, 2 Nov 2015 12:41:47 +0000 > > > > Subject: Re: OSGi migration may require a special marshaller > > > > To: dev@ignite.apache.org > > > > > > > > Hi Romain, > > > > > > > > I'm working on the OSGi compatibility of Ignite. I appreciate your > > input. > > > > > > > > I'm thinking about the situation you describe and I wonder if you're > > > > exporting Ignite as an OSGi service which is then consumed from other > > > > bundles. Under this situation, it would be quite easy to reproduce > the > > > > behaviour you describe if Ignite is not resolving classes via the > TCCL. > > > > Need to dig deeper into that. > > > > > > > > Off the top of my head, there are two alternatives to solve it: > > > > > > > > 1. Use the TCCL for marshalling/unmarshalling (if not already used) – > > we > > > > gotta be wary of possible regressions. > > > > 2. Create a special OSGi header Ignite-Export-Package so that bundles > > > > containing DTOs can expose packages to Ignite's marshallers. > > > > > > > > Regards, > > > > > > > > *Raúl Kripalani* > > > > PMC & Committer @ Apache Ignite, Apache Camel | Integration, Big Data > > and > > > > Messaging Engineer > > > > http://about.me/raulkripalani | > > http://www.linkedin.com/in/raulkripalani > > > > http://blog.raulkr.net | twitter: @raulvk > > > > > > > > On Mon, Nov 2, 2015 at 9:56 AM, Gilles, Romain < > > romain.gil...@misys.com> > > > > wrote: > > > > > > > > > Hi all, > > > > > > > > > > I'm really interested in this issue: > > > > > https://issues.apache.org/jira/browse/IGNITE-1270 . We some stuff > to > > > make > > > > > it work in our osgi environment. The main issue for us now is the > > > > > serialization. I think it you will have to rework the > > > OptimizedMarshaller > > > > > or any other marshaller that works with object that come from > outside > > > your > > > > > class space. > > > > > > > > > > We have try kryo that works. Kryo provide an extension point in > order > > > to > > > > > resolve the classes: > > > > > > > > > > > https://github.com/EsotericSoftware/kryo/blob/master/src/com/esotericsoftware/kryo/ClassResolver.java > > > > > . With this extension we are able to solve the problem of external > > > classes. > > > > > The only issue with kryo is that some classes need a certain care > in > > > the > > > > > serialization process and therefore a specialized serializer. > > > > > > > > > > So I would like to know from the community what do think of > changing > > > the > > > > > way the optimized marshaller works or introducing the support of > yet > > > > > another marshaller based on a kryo like technology? > > > > > > > > > > > > > > > Thanks in advance, > > > > > > > > > > > > > > > Best regards, > > > > > > > > > > > > > > > Romain. > > > > > > > > > > > > > > > PS: I'm ready to help in the both cases. > > > > > "Misys" is the trade name of the Misys group of companies. This > email > > > and > > > > > any attachments have been scanned for known viruses using multiple > > > > > scanners. This email message is intended for the named recipient > > only. > > > It > > > > > may be privileged and/or confidential. If you are not the named > > > recipient > > > > > of this email please notify us immediately and do not copy it or > use > > > it for > > > > > any purpose, nor disclose its contents to any other person. This > > email > > > does > > > > > not constitute the commencement of legal relations between you and > > > Misys. > > > > > Please refer to the executed contract between you and the relevant > > > member > > > > > of the Misys group for the identity of the contracting party with > > > which you > > > > > are dealing. > > > > > > > > > > >