https://github.com/scottmarlow/hibernate-orm/commits/pooledOptimizer_5.x is looking more correct now, if others want to look at that.
On 12/15/2015 07:58 PM, Scott Marlow wrote: > > > On 12/15/2015 05:58 PM, Scott Marlow wrote: >> >> >> On 12/15/2015 05:40 PM, Scott Marlow wrote: >>> I changed the new test methods a bit. [2] seems to be passed the tests >>> but I am not understanding how PooledThreadLocalLoOptimizer should >>> coordinate with the AccessCallback to allocate the next chunk of >>> sequence numbers. >>> >>> We seem to be able to call AccessCallback.getNextValue() to get the next >>> available sequence number but how do we reserve a block of 5000 sequence >>> ids? Am I supposed to call callback.getNextValue() an extra time to get >>> a range of values? Is there a separate database transaction that is >>> used by the AccessCallback.getNextValue() calls? I'm missing something. >> >> Thinking more about this, I assume that AccessCallback.getNextValue() is >> operating under a database transaction that we are probably ending >> before AccessCallback.getNextValue() returns. It also sounds like the >> database table is tracking the "lo" value, as mentioned in the >> PooledLoOptimizer. This implies that only the application layer knows >> what the range is. This seems like an important dependency to understand. >> >> Make sense? > > http://in.relation.to/2007/04/10/new-323-hibernate-identifier-generators > seems to explain how increment_size is used. Since the user is already > configured that, will look into switching to that for > PooledThreadLocalLoOptimizer. > >> >>> >>> Note that [2] also includes a test change to comment out a few lines in >>> SchemaUpdateDelimiterTest, due to the compiler error that I am seeing in >>> intellij. Will need to remember to remove that change. >>> >>> [2] >>> https://github.com/scottmarlow/hibernate-orm/commits/pooled-optimiser-hack-2 >>> >>> On 12/15/2015 12:36 PM, Steve Ebersole wrote: >>>> Those tests tend to assert the increments. We seem to agree that this >>>> ThreadLocal one can skip gaps of values. I'd look there first. >>>> >>>> >>>> On Tue, Dec 15, 2015 at 11:34 AM Scott Marlow <smar...@redhat.com >>>> <mailto:smar...@redhat.com>> wrote: >>>> >>>> I'm trying to move the optimizer to PooledThreadLocalLoOptimizer >>>> [1]. >>>> We are currently failing some new unit tests, which are cloned from >>>> existing PooledLoOptimizer tests which might be part of the problem. >>>> >>>> Scott >>>> >>>> [1] >>>> >>>> https://github.com/scottmarlow/hibernate-orm/tree/pooled-optimiser-hack >>>> >>>> On 12/14/2015 10:12 PM, Scott Marlow wrote: >>>> > >>>> > >>>> > On 12/11/2015 09:30 AM, Steve Ebersole wrote: >>>> >> It's hard to say without understanding the scenario where you >>>> are seeing >>>> >> this as a problem. I have some guesses as to what may be the >>>> problem, >>>> >> but without understanding more about why you see this as a >>>> problem in >>>> >> the first place it is hard to give you an answer. For example, >>>> I wonder >>>> >> if for environments not using multi-tenancy whether the recent >>>> changes >>>> >> for the generators to support multi-tenancy might be the >>>> culprit. If >>>> >> that is the case, and those changes are in fact the underlying >>>> cause of >>>> >> the perf issues you see then I think there is actually a better >>>> >> solution. But again, its hard to say unless we understand the >>>> reason >>>> >> this "shows up" as a perf problem for you. >>>> > >>>> > As best as I can tell from looking at the current >>>> PooledLoOptimizer, >>>> > versus the proposed change (to have a chunk of ids per thread), >>>> we went >>>> > from accessing a contented lock, to instead using per thread >>>> memory >>>> > (eliminating the contended lock on PooledLoOptimizer.generate()). >>>> > >>>> >> >>>> >> Until we hear more I think at this stage I'd vote for a separate >>>> >> optimizer. And maybe even not one that is upstream. >>>> >> >>>> >> Also I agree with Scott that I am VERY leery of not cleaning up >>>> a >>>> >> ThreadLocal. >>>> > >>>> > My mistake, as Stuart pointed out, the TL is not static, so we >>>> shouldn't >>>> > introduce any leaks. >>>> > >>>> >> >>>> >> On Fri, Dec 11, 2015 at 7:55 AM Scott Marlow <smar...@redhat.com >>>> <mailto:smar...@redhat.com> >>>> >> <mailto:smar...@redhat.com <mailto:smar...@redhat.com>>> wrote: >>>> >> >>>> >> Should this be a specialized pooled optimizer that is only >>>> used in >>>> >> environments that do not suffer from leaving the >>>> ThreadLocal around >>>> >> after the application is undeployed? In other words, the >>>> expectation is >>>> >> that classloader leaks with this pooled optimizer are >>>> expected (e.g. >>>> >> user must restart the jvm to really undeploy the >>>> application >>>> >> completely). >>>> >> >>>> >> I am thinking that there are at least three typical >>>> situations: >>>> >> >>>> >> 1. Applications are deployed in Java standalone edition. >>>> Generally, >>>> >> when the app undeploys the jvm is shutting down. >>>> >> >>>> >> 2. Applications are deployed as part of some container >>>> (e.g. an EE >>>> >> server) and the Hibernate jars are on the global >>>> classloader path (or >>>> >> something like that). On each shared container thread, >>>> there would be >>>> >> one Optimizer for all deployed applications. I wonder if >>>> instead, we >>>> >> would want one Optimizer instance per Hibernate >>>> SessionFactory >>>> >> associated with the many container threads? >>>> >> >>>> >> 3. Applications are deployed as part of some container >>>> (e.g. an EE >>>> >> server) and the Hibernate jars are deployed with the >>>> application. The >>>> >> ThreadLocals are associated with threads that are shared by >>>> different >>>> >> deployed applications. The application classloader >>>> contains the >>>> >> Hibernate classes. Each deployed application has its own >>>> Optimizer >>>> >> threadlocal. On each shared container thread, there would >>>> be one >>>> >> Optimizer per application (since each application has its >>>> Optimizer TL). >>>> >> Like (2), there would be sharing of the same Optimizer >>>> with the many >>>> >> application session factories. Should we instead have an >>>> optimizer per >>>> >> session factory? >>>> >> >>>> >> Scott >>>> >> >>>> >> On 12/10/2015 11:31 PM, Stuart Douglas wrote: >>>> >> > Hello, >>>> >> > >>>> >> > I have been working on a change to the pooled optimizer >>>> that we >>>> >> have been seeing good performance results with. Basically >>>> it hands >>>> >> out blocks of ID's to a thread local, rather than having >>>> every >>>> >> thread contend on the lock every time an ID is required. >>>> >> > >>>> >> > >>>> >> >>>> >>>> https://github.com/hibernate/hibernate-orm/compare/master...stuartwdouglas:pooled-optimiser-hack >>>> >> > >>>> >> > What would I need to do to get a change like this in? In >>>> particular: >>>> >> > >>>> >> > - Does it need to be a new type of optimizer, or is >>>> modifying the >>>> >> existing one like I have done OK? >>>> >> > - How should it be configured? >>>> >> > >>>> >> > I am happy to do up a PR for this, but I am just not >>>> really sure >>>> >> what would be required to get it to a point where it would >>>> be >>>> >> acceptable for inclusion. >>>> >> > >>>> >> > Stuart >>>> >> > _______________________________________________ >>>> >> > hibernate-dev mailing list >>>> >> > hibernate-dev@lists.jboss.org >>>> <mailto:hibernate-dev@lists.jboss.org> >>>> <mailto:hibernate-dev@lists.jboss.org >>>> <mailto:hibernate-dev@lists.jboss.org>> >>>> >> > https://lists.jboss.org/mailman/listinfo/hibernate-dev >>>> >> > >>>> >> _______________________________________________ >>>> >> hibernate-dev mailing list >>>> >> hibernate-dev@lists.jboss.org >>>> <mailto:hibernate-dev@lists.jboss.org> >>>> <mailto:hibernate-dev@lists.jboss.org >>>> <mailto:hibernate-dev@lists.jboss.org>> >>>> >> https://lists.jboss.org/mailman/listinfo/hibernate-dev >>>> >> >>>> > _______________________________________________ >>>> > hibernate-dev mailing list >>>> > hibernate-dev@lists.jboss.org >>>> <mailto:hibernate-dev@lists.jboss.org> >>>> > https://lists.jboss.org/mailman/listinfo/hibernate-dev >>>> > >>>> >>> _______________________________________________ >>> hibernate-dev mailing list >>> hibernate-dev@lists.jboss.org >>> https://lists.jboss.org/mailman/listinfo/hibernate-dev >>> >> _______________________________________________ >> hibernate-dev mailing list >> hibernate-dev@lists.jboss.org >> https://lists.jboss.org/mailman/listinfo/hibernate-dev >> > _______________________________________________ > hibernate-dev mailing list > hibernate-dev@lists.jboss.org > https://lists.jboss.org/mailman/listinfo/hibernate-dev > _______________________________________________ hibernate-dev mailing list hibernate-dev@lists.jboss.org https://lists.jboss.org/mailman/listinfo/hibernate-dev