Re: [hibernate-dev] [jboss-as7-dev] AS7-4007 missing Infinispan dependency for clustered JPA second level cache
by David M. Lloyd
On 03/06/2012 01:02 PM, Galder Zamarreño wrote:
> On Mar 6, 2012, at 6:31 PM, Paul Ferraro wrote:
>> ----- Original Message -----
>>> From: "Jason T. Greene"<jason.greene(a)redhat.com>
>>> To: "David M. Lloyd"<david.lloyd(a)redhat.com>
>>> Cc: "Galder Zamarreño"<galder(a)redhat.com>, "Paul Ferraro"<pferraro(a)redhat.com>, "Bela Ban"<bban(a)redhat.com>,
>>> "infinispan -Dev List"<infinispan-dev(a)lists.jboss.org>, hibernate-dev(a)lists.jboss.org,
>>> "jboss-as7-dev(a)lists.jboss.org Development"<jboss-as7-dev(a)lists.jboss.org>
>>> Sent: Tuesday, March 6, 2012 10:30:11 AM
>>> Subject: Re: [jboss-as7-dev] AS7-4007 missing Infinispan dependency for clustered JPA second level cache
>>>
>>> On 3/6/12 9:28 AM, David M. Lloyd wrote:
>>>> On 03/06/2012 09:21 AM, Galder Zamarreño wrote:
>>>>> This reminds me that we had a discussion about this a few months
>>>>> back: http://goo.gl/DJLhB
>>>>>
>>>>> At the time, it wasn't clear whether you can use
>>>>> ModularClassResolver in a non-module env. Seems like it's not
>>>>> possible.
>>>>>
>>>>> So, one option is to have a class resolver lookup class, or
>>>>> similar so that AS7 can pass us the right ClassResolver.
>>>>>
>>>>> There might a quicker option here though:
>>>>> - Extend VersionAwareMarshaller (http://goo.gl/bu8CF) and provide
>>>>> a variant of JBossMarshaller (http://goo.gl/o9Ro3) in Infinispan
>>>>> (this requires JBossMarshaller to be made non-final)
>>>>> - Override JBossMarshaller.inject(), call super.inject() and then
>>>>> call baseCfg.setClassResolver(…)
>>>>> - This would require that the VersionAwareMarshaller extension be
>>>>> passed the ModuleLoader that ModularClassResolver requires.
>>>>> - Configure Infinispan with this new marshaller, via
>>>>> SerializationConfiguration. Thankfully you can now pass an
>>>>> instance of the marshaller to it, so no need to do any magic
>>>>> ModuleLoader lookup from the VersionAwareMarshaller extension.
>>>>>
>>>>> Scott, other than the change in JBossMarshaller to be made
>>>>> non-final, the rest can built on AS7. Wanna have a go? Ping me on
>>>>> IRC if you need help.
>>>>>
>>>>> Cheers,
>>>>>
>>>>> p.s. Silly question, how come this issue is not present in HTTP
>>>>> session replication use case or EJB3 SFSB?
>>>>
>>>> It actually is present anywhere we're using Infinispan (I think).
>>>> It
>>>> just hasn't blown up yet anywhere public (in this case it's a 90%
>>>> effective solution versus a 100% effective solution).
>>>
>>> Session replication does setup a custom marshaller, so it does in
>>> fact
>>> work. I think the issue is just that the hibernate-infinispan, which
>>> is
>>> part of the hibernate project set, and not AS code does not do this,
>>> and
>>> it doesn't expose a way to do it.
>>
>> Sort of...
>>
>> To summarize:
>> The fundamental issue is that Infinispan uses the same marshaller instance for all caches within a cache manager - which doesn't map cleanly to our use case, which uses a cache instance per application - thus requires cache-grained marshalling configuration.
>
> Well, this is not exactly correct since 5.0. Internally, we differentiate between a global marshaller and a per-cache marshaller. What's the difference? The classloader with which they're configured.
>
> Since 5.0, you can configure the classloader to use per cache. You can even configure the classloader per invocation with cache.with(cl)….
>
> If that's not helping you, we were wasting our time when we did this...
Well.... :) (see below)
>
>> To work around this, we typically store MarshalledValues in the cache - which are marshalled/unmarshalled using a marshalling configuration specific to the application (e.g. via a ModularClassResolver using the ModuleLoader of the deployment unit).
>> https://github.com/jbossas/jboss-as/blob/master/clustering/api/src/main/j...
>> https://github.com/jbossas/jboss-as/blob/master/clustering/api/src/main/j...
>> https://github.com/jbossas/jboss-as/blob/master/clustering/api/src/main/j...
>
> Isn't a class resolver and a class loader, functionality wise, doing the same thing? I wonder if a custom classloader could not be built that delegates to a ModularClassResolver...
No, not really. A class loader loads a class, given a name. But a
class resolver loads a class given a name *and* stream information. The
modular class resolver reads the stream information to know which class
loader houses the class in question. This is critically important
because it's possible (common even) for more than one class to exist in
an AS instance with the same name. And there is no single class loader
which has visibility to all classes which could potentially be stored in
a cache.
Yes, accepting a class loader to use is a powerful feature. However it
*should* just be a convenience abstraction over a more fundamental
feature which allows a class resolver to be set.
>> So, essentially Infinispan itself only ever has to marshal/unmarshal a byte[] wrapper - so the AS has full control over the marshalling process.
>>
>> I would recommend that the 2LC do something similar, and include a mechanism for providing a MarshallingConfiguration per persistence unit.
>
> Possibly…
>
> --
> Galder Zamarreño
> Sr. Software Engineer
> Infinispan, JBoss Cache
>
--
- DML
12 years, 6 months
Re: [hibernate-dev] [jboss-as7-dev] AS7-4007 missing Infinispan dependency for clustered JPA second level cache
by Paul Ferraro
----- Original Message -----
> From: "Jason T. Greene" <jason.greene(a)redhat.com>
> To: "David M. Lloyd" <david.lloyd(a)redhat.com>
> Cc: "Galder Zamarreño" <galder(a)redhat.com>, "Paul Ferraro" <pferraro(a)redhat.com>, "Bela Ban" <bban(a)redhat.com>,
> "infinispan -Dev List" <infinispan-dev(a)lists.jboss.org>, hibernate-dev(a)lists.jboss.org,
> "jboss-as7-dev(a)lists.jboss.org Development" <jboss-as7-dev(a)lists.jboss.org>
> Sent: Tuesday, March 6, 2012 10:30:11 AM
> Subject: Re: [jboss-as7-dev] AS7-4007 missing Infinispan dependency for clustered JPA second level cache
>
> On 3/6/12 9:28 AM, David M. Lloyd wrote:
> > On 03/06/2012 09:21 AM, Galder Zamarreño wrote:
> >> This reminds me that we had a discussion about this a few months
> >> back: http://goo.gl/DJLhB
> >>
> >> At the time, it wasn't clear whether you can use
> >> ModularClassResolver in a non-module env. Seems like it's not
> >> possible.
> >>
> >> So, one option is to have a class resolver lookup class, or
> >> similar so that AS7 can pass us the right ClassResolver.
> >>
> >> There might a quicker option here though:
> >> - Extend VersionAwareMarshaller (http://goo.gl/bu8CF) and provide
> >> a variant of JBossMarshaller (http://goo.gl/o9Ro3) in Infinispan
> >> (this requires JBossMarshaller to be made non-final)
> >> - Override JBossMarshaller.inject(), call super.inject() and then
> >> call baseCfg.setClassResolver(…)
> >> - This would require that the VersionAwareMarshaller extension be
> >> passed the ModuleLoader that ModularClassResolver requires.
> >> - Configure Infinispan with this new marshaller, via
> >> SerializationConfiguration. Thankfully you can now pass an
> >> instance of the marshaller to it, so no need to do any magic
> >> ModuleLoader lookup from the VersionAwareMarshaller extension.
> >>
> >> Scott, other than the change in JBossMarshaller to be made
> >> non-final, the rest can built on AS7. Wanna have a go? Ping me on
> >> IRC if you need help.
> >>
> >> Cheers,
> >>
> >> p.s. Silly question, how come this issue is not present in HTTP
> >> session replication use case or EJB3 SFSB?
> >
> > It actually is present anywhere we're using Infinispan (I think).
> > It
> > just hasn't blown up yet anywhere public (in this case it's a 90%
> > effective solution versus a 100% effective solution).
>
> Session replication does setup a custom marshaller, so it does in
> fact
> work. I think the issue is just that the hibernate-infinispan, which
> is
> part of the hibernate project set, and not AS code does not do this,
> and
> it doesn't expose a way to do it.
Sort of...
To summarize:
The fundamental issue is that Infinispan uses the same marshaller instance for all caches within a cache manager - which doesn't map cleanly to our use case, which uses a cache instance per application - thus requires cache-grained marshalling configuration.
To work around this, we typically store MarshalledValues in the cache - which are marshalled/unmarshalled using a marshalling configuration specific to the application (e.g. via a ModularClassResolver using the ModuleLoader of the deployment unit).
https://github.com/jbossas/jboss-as/blob/master/clustering/api/src/main/j...
https://github.com/jbossas/jboss-as/blob/master/clustering/api/src/main/j...
https://github.com/jbossas/jboss-as/blob/master/clustering/api/src/main/j...
So, essentially Infinispan itself only ever has to marshal/unmarshal a byte[] wrapper - so the AS has full control over the marshalling process.
I would recommend that the 2LC do something similar, and include a mechanism for providing a MarshallingConfiguration per persistence unit.
12 years, 6 months
Re: [hibernate-dev] AS7-4007 missing Infinispan dependency for clustered JPA second level cache
by David M. Lloyd
On 03/06/2012 09:21 AM, Galder Zamarreño wrote:
> This reminds me that we had a discussion about this a few months back: http://goo.gl/DJLhB
>
> At the time, it wasn't clear whether you can use ModularClassResolver in a non-module env. Seems like it's not possible.
>
> So, one option is to have a class resolver lookup class, or similar so that AS7 can pass us the right ClassResolver.
>
> There might a quicker option here though:
> - Extend VersionAwareMarshaller (http://goo.gl/bu8CF) and provide a variant of JBossMarshaller (http://goo.gl/o9Ro3) in Infinispan (this requires JBossMarshaller to be made non-final)
> - Override JBossMarshaller.inject(), call super.inject() and then call baseCfg.setClassResolver(…)
> - This would require that the VersionAwareMarshaller extension be passed the ModuleLoader that ModularClassResolver requires.
> - Configure Infinispan with this new marshaller, via SerializationConfiguration. Thankfully you can now pass an instance of the marshaller to it, so no need to do any magic ModuleLoader lookup from the VersionAwareMarshaller extension.
>
> Scott, other than the change in JBossMarshaller to be made non-final, the rest can built on AS7. Wanna have a go? Ping me on IRC if you need help.
>
> Cheers,
>
> p.s. Silly question, how come this issue is not present in HTTP session replication use case or EJB3 SFSB?
It actually is present anywhere we're using Infinispan (I think). It
just hasn't blown up yet anywhere public (in this case it's a 90%
effective solution versus a 100% effective solution).
>
> On Mar 5, 2012, at 11:07 PM, Scott Marlow wrote:
>
>> Galder,
>>
>> I'm trying to identify the right fix for addressing AS7-4007. I started a clustered second level cache test that currently fails since Infinispan isn't on the test application classpath.
>>
>> The exception call stack that I'm getting is shown here http://pastie.org/3503803.
>>
>> I would like to discuss how we can address AS7-4007 (either on email or IRC).
>>
>> Initially, I worked around this by ensuring that the infinispan module is available in the test application classpath (https://github.com/jbossas/jboss-as/commit/31f3547960775dac88275447253fda...). The hack was to export the Infinispan module when the Hibernate module is brought into an application. This covered both JPA and Hibernate native applications, however it exports into every other module that references the Hibernate module (increasing the time that it takes to link the Hibernate module into other modules). There are other problems with requiring Infinipan to be in the application classpath (see https://community.jboss.org/wiki/ModularSerialization).
>>
>> I would like to better understand the alternatives (both short term and long term) to address AS7-4007 and issues like it. Perhaps by using MarshallingConfiguration.setClassResolver() to pass a ModuleClassResolver to be used with Infinispan marshalling/unmarshalling. Is that currently configurable with Infinispan?
>>
>> Paul Ferraro, David Lloyd and myself chatted on irc briefly about this a few days ago (see http://pastie.org/3528553).
>>
>> https://github.com/dmlloyd/jboss-marshalling/blob/master/api/src/main/jav... contains the source for the ModularClassResolver class that David referred to (as well as the ModularSerialization article linked above).
>>
>> Scott
>
> --
> Galder Zamarreño
> Sr. Software Engineer
> Infinispan, JBoss Cache
>
--
- DML
12 years, 6 months
natural-id to primary key cache
by Steve Ebersole
Historically natural-id look ups were accomplished by leveraging
Criteria queries. Caching was handled through the second level query
cache.
One of the new things in 4.1 is the dedicated natural-id loading API.
So the caching will be quite different here. I am a little leery about
making a breaking changes in 4.1 after all the changes in 4.0 if we can
avoid it. If we can't we can't. One thought for this was to use a
SessionFactory scoped "cache" for this in 4.1 and then add a new second
level cache Region construct for this in 5.0. The *only* benefit is to
keep the second level cache SPI the same between 4.0 and 4.1. Is that
worth it? Any thoughts?
--
steve(a)hibernate.org
http://hibernate.org
12 years, 6 months
Services started twice?
by Emmanuel Bernard
Quoting Sanne, we discovered that services are started twice by Hibernate ORM. Is that expected that the service guards against that, or is there some issue somewhere either in ORM or in the way OGM declares services?
> While looking at this I also noticed the service was actually started twice;
> Looking into Hibernate Core that seems to be the behaviour for all services.
>
> line 162 and 163 at: org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(ServiceBinding<R>)
12 years, 6 months
AS7-4007 missing Infinispan dependency for clustered JPA second level cache
by Scott Marlow
Galder,
I'm trying to identify the right fix for addressing AS7-4007. I started
a clustered second level cache test that currently fails since
Infinispan isn't on the test application classpath.
The exception call stack that I'm getting is shown here
http://pastie.org/3503803.
I would like to discuss how we can address AS7-4007 (either on email or
IRC).
Initially, I worked around this by ensuring that the infinispan module
is available in the test application classpath
(https://github.com/jbossas/jboss-as/commit/31f3547960775dac88275447253fda...).
The hack was to export the Infinispan module when the Hibernate module
is brought into an application. This covered both JPA and Hibernate
native applications, however it exports into every other module that
references the Hibernate module (increasing the time that it takes to
link the Hibernate module into other modules). There are other problems
with requiring Infinipan to be in the application classpath (see
https://community.jboss.org/wiki/ModularSerialization).
I would like to better understand the alternatives (both short term and
long term) to address AS7-4007 and issues like it. Perhaps by using
MarshallingConfiguration.setClassResolver() to pass a
ModuleClassResolver to be used with Infinispan
marshalling/unmarshalling. Is that currently configurable with Infinispan?
Paul Ferraro, David Lloyd and myself chatted on irc briefly about this a
few days ago (see http://pastie.org/3528553).
https://github.com/dmlloyd/jboss-marshalling/blob/master/api/src/main/jav...
contains the source for the ModularClassResolver class that David
referred to (as well as the ModularSerialization article linked above).
Scott
12 years, 6 months
brain fart
by Steve Ebersole
Sorry all, I had a brain fart yesterday and worked a series of pull
requests as merges :(
--
steve(a)hibernate.org
http://hibernate.org
12 years, 6 months