Hi all,

Bad news. My application was caught in a GC loop after running for 8 hours.
The old generation was exhausted.

I couldn't get a heap dump at that time but restarted the application, took
a heap dump after about an hour, and reverted back to Wicket 8.

The problem is this: The heap was full of objects referencing
InMemoryPageStore, i.e. the in-memory 2nd-level cache for pages. My first
thought was that there is something wrong with the implementation of that
store and pages do not get limited or removed correctly.  So I debugged
it locally but everything is working fine.

Then I noticed that there are a lot of instances of Hibernate entities on
the heap. So there definitely is an issue with models somewhere in my
application. To be sure that this is not a new issue, I took another heap
dump from production - now running Wicket 8 again - and compared it.
There are undetached entity models on the heap as well.

So why does it not OOM with Wicket 8? Well, the PerSessionPageStore
(roughly the equivalent of InMemoryPageStore in Wicket 9) uses
SoftReferences for storing pages. InMemoryPageStore does not and GC cannot
reclaim memory from it.

So while this surfaced some issues in my application that I just fixed, I
believe that InMemoryPageStore should use SoftReferences or another
implementation based on SoftReferences should be added to Wicket 9. A cache
should not consume all the memory if it can easily re-fetch
the value from persistent storage.

I guess the reason for not using SoftReferences in InMemoryPageStore is
that it can theoretically be used as a "persistent" store for pages. If that
behavior is really required, I suggest adding another implementation using
SoftReferences.

Best regards,

Thomas

On Fri, Apr 10, 2020 at 7:19 PM Martin Grigorov <mgrigo...@apache.org>
wrote:

> On Fri, Apr 10, 2020 at 4:01 PM Thomas Heigl <tho...@umschalt.com> wrote:
>
> > FYI: I deployed Wicket 9.0.0-M5 to production an hour ago. 100k requests
> > served and no issues so far.
> >
>
> Awesome!
> Thank you for testing it!
>
>
> >
> > Great work!
> >
> > Thomas
> >
> > On Wed, Apr 8, 2020 at 3:13 PM Sven Meier <s...@meiers.net> wrote:
> >
> > > Many thanks Maxim!
> > >
> > > Sven
> > >
> > > On 08.04.20 14:29, Maxim Solodovnik wrote:
> > > > Released :)
> > > >
> > > > On Wed, 8 Apr 2020 at 15:41, Maxim Solodovnik <solomax...@gmail.com>
> > > wrote:
> > > >> OK
> > > >>
> > > >> Will start new release process in couple of hours
> > > >> Please stop me if you will find any blocker :)
> > > >>
> > > >> On Wed, 8 Apr 2020 at 14:36, Thomas Heigl <tho...@umschalt.com>
> > wrote:
> > > >>> Hi Maxim,
> > > >>>
> > > >>> It works for me now!
> > > >>>
> > > >>> Thomas
> > > >>>
> > > >>> On Wed, Apr 8, 2020 at 9:17 AM Maxim Solodovnik <
> > solomax...@gmail.com>
> > > >>> wrote:
> > > >>>
> > > >>>> Thanks a million!
> > > >>>>
> > > >>>> On Wed, 8 Apr 2020 at 14:10, Thomas Heigl <tho...@umschalt.com>
> > > wrote:
> > > >>>>> Hi Maxim,
> > > >>>>>
> > > >>>>> I'm testing against the snapshot now. Will get back to you
> shortly.
> > > >>>>>
> > > >>>>> Thomas
> > > >>>>>
> > > >>>>> On Wed, Apr 8, 2020 at 2:53 AM Maxim Solodovnik <
> > > solomax...@gmail.com>
> > > >>>>> wrote:
> > > >>>>>
> > > >>>>>> Hello All,
> > > >>>>>>
> > > >>>>>> M5 seems to be broken (deploy has failed more than 10 times
> during
> > > my
> > > >>>>>> build attempts)
> > > >>>>>> I have to start another release
> > > >>>>>> Could you please tell when can I start?
> > > >>>>>>
> > > >>>>>> On Wed, 8 Apr 2020 at 07:01, Maxim Solodovnik <
> > solomax...@gmail.com
> > > >
> > > >>>>>> wrote:
> > > >>>>>>> Hello Thomas,
> > > >>>>>>>
> > > >>>>>>> Please test M6-SNAPSHOT (so I don't have to release M5.2 :))))
> > > >>>>>>>
> > > >>>>>>> On Wed, 8 Apr 2020 at 02:39, Thomas Heigl <tho...@umschalt.com
> >
> > > >>>> wrote:
> > > >>>>>>>> Hi Maxim,
> > > >>>>>>>>
> > > >>>>>>>> That would be great. I want to do some more extensive testing
> > and
> > > >>>> then
> > > >>>>>>>> deploy M5 into production. ;)
> > > >>>>>>>>
> > > >>>>>>>> Thomas
> > > >>>>>>>>
> > > >>>>>>>> On Tue, Apr 7, 2020 at 7:50 PM Maxim Solodovnik <
> > > >>>> solomax...@gmail.com>
> > > >>>>>>>> wrote:
> > > >>>>>>>>
> > > >>>>>>>>> I can pack another release
> > > >>>>>>>>> later this week ...
> > > >>>>>>>>>
> > > >>>>>>>>> On Wed, 8 Apr 2020 at 00:48, Thomas Heigl <
> tho...@umschalt.com
> > >
> > > >>>>>> wrote:
> > > >>>>>>>>>> Thanks Sven!
> > > >>>>>>>>>>
> > > >>>>>>>>>> Did your changes make it into the release? Or did they just
> > > >>>> miss
> > > >>>>>> it?
> > > >>>>>>>>>> Thomas
> > > >>>>>>>>>>
> > > >>>>>>>>>> On Tue, Apr 7, 2020 at 7:43 PM Sven Meier <s...@meiers.net>
> > > >>>> wrote:
> > > >>>>>>>>>>> Hi Thomas,
> > > >>>>>>>>>>>
> > > >>>>>>>>>>> yes, you're right:
> > > >>>>>>>>>>>
> > > >>>>>>>>>>> wicketstuff data stores missed some adjustments to the
> latest
> > > >>>>>> updates
> > > >>>>>>>>> in
> > > >>>>>>>>>>> wicket-core.
> > > >>>>>>>>>>>
> > > >>>>>>>>>>> And SessionQuotaManagingDataStore$DelegatedPage must be
> > > >>>>>> serializable of
> > > >>>>>>>>>>> course.
> > > >>>>>>>>>>>
> > > >>>>>>>>>>> I've pushed changes to wicketstuff master.
> > > >>>>>>>>>>>
> > > >>>>>>>>>>> Thanks
> > > >>>>>>>>>>> Sven
> > > >>>>>>>>>>>
> > > >>>>>>>>>>>
> > > >>>>>>>>>>> On 07.04.20 14:14, Thomas Heigl wrote:
> > > >>>>>>>>>>>> And one more thing. There is now a warning logged just
> > > >>>> before
> > > >>>>>>>>>>> serialization:
> > > >>>>>>>>>>>> WARN o.a.w.pageStore.AsynchronousPageStore    : Delegated
> > > >>>> page
> > > >>>>>> store
> > > >>>>>>>>>>>>> 'org.apache.wicket.pageStore.SerializingPageStore' can
> > > >>>> not be
> > > >>>>>>>>>>> asynchronous
> > > >>>>>>>>>>>>
> > > >>>>>>>>>>>> On Tue, Apr 7, 2020 at 2:09 PM Thomas Heigl <
> > > >>>>>> tho...@umschalt.com>
> > > >>>>>>>>> wrote:
> > > >>>>>>>>>>>>> The cause is the following MetaData entry in the session:
> > > >>>>>>>>>>>>>
> > > >>>>>>>>>>>>> class
> > > >>>>
> > >
> >
> org.wicketstuff.datastores.common.SessionQuotaManagingDataStore$1=org.wicketstuff.datastores.common.SessionQuotaManagingDataStore$SizeLimitedData@4090594a
> > > >>>>>>>>>>>>> On Tue, Apr 7, 2020 at 1:59 PM Thomas Heigl <
> > > >>>>>> tho...@umschalt.com>
> > > >>>>>>>>>>> wrote:
> > > >>>>>>>>>>>>>> Hi Sven,
> > > >>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>> I just found time to give this a try with Wicket
> > > >>>> 9.0.0-M5.
> > > >>>>>> There
> > > >>>>>>>>> seem
> > > >>>>>>>>>>> to
> > > >>>>>>>>>>>>>> be issues with serialization now.
> > > >>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>> My new config:
> > > >>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>> protected IPageStore newCachingStore(IPageStore
> > > >>>> pageStore) {
> > > >>>>>>>>>>>>>>> return new CachingPageStore(pageStore, new
> > > >>>>>>>>>>> InMemoryPageStore(getName(),
> > > >>>>>>>>>>>>>>> MAX_PAGES_CACHED_PER_SESSION));
> > > >>>>>>>>>>>>>>> }
> > > >>>>>>>>>>>>>>> protected IPageStore newPersistentStore() {
> > > >>>>>>>>>>>>>>> final RedissonRedisCache redisCache = new
> > > >>>>>>>>>>>>>>> RedissonRedisCache(redissonClient);
> > > >>>>>>>>>>>>>>> final RedisDataStore redisDataStore = new
> > > >>>>>>>>> RedisDataStore(getName(),
> > > >>>>>>>>>>>>>>> redisCache, new RedisSettings());
> > > >>>>>>>>>>>>>>> return new
> SessionQuotaManagingDataStore(redisDataStore,
> > > >>>>>>>>>>>>>>> DATA_STORE_MAX_BYTES_PER_SESSION);
> > > >>>>>>>>>>>>>>> }
> > > >>>>>>>>>>>>>> This exception is logged after requests:
> > > >>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>>
> > > >>>>>>
> org.springframework.data.redis.serializer.SerializationException:
> > > >>>>>>>>>>> Cannot
> > > >>>>>>>>>>>>>>> serialize; nested exception is
> > > >>>>>>>>>>>>>>>
> > > >>>>
> > >
> org.springframework.core.serializer.support.SerializationFailedException:
> > > >>>>>>>>>>>>>>> Failed to serialize object using DefaultSerializer;
> > > >>>> nested
> > > >>>>>>>>> exception
> > > >>>>>>>>>>> is
> > > >>>>>>>>>>>>>>> java.io.NotSerializableException:
> > > >>>>>>>>>>>>>>>
> > > >>>>
> > >
> >
> org.wicketstuff.datastores.common.SessionQuotaManagingDataStore$DelegatedPage
> > > >>>>>>>>>>>>>>> at
> > > >>>>>>>>>>>>>>>
> > > >>>>
> > >
> >
> org.springframework.data.redis.serializer.JdkSerializationRedisSerializer.serialize(JdkSerializationRedisSerializer.java:96)
> > > >>>>>>>>>>>>>>> at
> > > >>>>>>>>>>>>>>>
> > > >>>>
> > >
> >
> org.springframework.data.redis.core.AbstractOperations.rawHashValue(AbstractOperations.java:185)
> > > >>>>>>>>>>>>>>> at
> > > >>>>>>>>>>>>>>>
> > > >>>>
> > >
> >
> org.springframework.data.redis.core.DefaultHashOperations.putAll(DefaultHashOperations.java:147)
> > > >>>>>>>>>>>>>>> at
> > > >>>>>>>>>>>>>>>
> > > >>>>
> > >
> >
> org.springframework.data.redis.core.DefaultBoundHashOperations.putAll(DefaultBoundHashOperations.java:147)
> > > >>>>>>>>>>>>>>> at
> > > >>>>>>>>>>>>>>>
> > > >>>>
> > >
> >
> org.springframework.session.data.redis.RedisIndexedSessionRepository$RedisSession.saveDelta(RedisIndexedSessionRepository.java:795)
> > > >>>>>>>>>>>>>>> at
> > > >>>>>>>>>>>>>>>
> > > >>>>
> > >
> >
> org.springframework.session.data.redis.RedisIndexedSessionRepository$RedisSession.save(RedisIndexedSessionRepository.java:783)
> > > >>>>>>>>>>>>>>> at
> > > >>>>>>>>>>>>>>>
> > > >>>>
> > >
> >
> org.springframework.session.data.redis.RedisIndexedSessionRepository$RedisSession.access$000(RedisIndexedSessionRepository.java:670)
> > > >>>>>>>>>>>>>>> at
> > > >>>>>>>>>>>>>>>
> > > >>>>
> > >
> >
> org.springframework.session.data.redis.RedisIndexedSessionRepository.save(RedisIndexedSessionRepository.java:398)
> > > >>>>>>>>>>>>>>> at
> > > >>>>>>>>>>>>>>>
> > > >>>>
> > >
> >
> org.springframework.session.data.redis.RedisIndexedSessionRepository.save(RedisIndexedSessionRepository.java:249)
> > > >>>>>>>>>>>>>>> at
> > > >>>>>>>>>>>>>>>
> > > >>>>
> > >
> >
> com.myproject.session.InstrumentedFindByIndexNameSessionRepository.save(InstrumentedFindByIndexNameSessionRepository.java:29)
> > > >>>>>>>>>>>>>>> at
> > > >>>>>>>>>>>>>>>
> > > >>>>>>
> > > java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native
> > > >>>>>>>>>>>>>>> Method)
> > > >>>>>>>>>>>>>>> at
> > > >>>>>>>>>>>>>>>
> > > >>>>
> > >
> >
> java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
> > > >>>>>>>>>>>>>>> at
> > > >>>>>>>>>>>>>>>
> > > >>>>
> > >
> >
> java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
> > > >>>>>>>>>>>>>>> at
> > > >>>>>> java.base/java.lang.reflect.Method.invoke(Method.java:566)
> > > >>>>>>>>>>>>>>> at
> > > >>>>>>>>>>>>>>>
> > > >>>>
> > >
> >
> org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344)
> > > >>>>>>>>>>>>>>> at
> > > >>>>>>>>>>>>>>>
> > > >>>>
> > >
> >
> org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:198)
> > > >>>>>>>>>>>>>>> at
> > > >>>>>>>>>>>>>>>
> > > >>>>
> > >
> >
> org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
> > > >>>>>>>>>>>>>>> at
> > > >>>>>>>>>>>>>>>
> > > >>>>
> > >
> >
> org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:88)
> > > >>>>>>>>>>>>>>> at
> > > >>>>>>>>>>>>>>>
> > > >>>>
> > >
> io.micrometer.core.aop.TimedAspect.processWithTimer(TimedAspect.java:105)
> > > >>>>>>>>>>>>>>> at
> > > >>>>
> io.micrometer.core.aop.TimedAspect.timedMethod(TimedAspect.java:94)
> > > >>>>>>>>>>>>>>> at
> > > >>>>>> jdk.internal.reflect.GeneratedMethodAccessor146.invoke(Unknown
> > > >>>>>>>>>>> Source)
> > > >>>>>>>>>>>>>>> at
> > > >>>>>>>>>>>>>>>
> > > >>>>
> > >
> >
> java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
> > > >>>>>>>>>>>>>>> at
> > > >>>>>> java.base/java.lang.reflect.Method.invoke(Method.java:566)
> > > >>>>>>>>>>>>>>> at
> > > >>>>>>>>>>>>>>>
> > > >>>>
> > >
> >
> org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:644)
> > > >>>>>>>>>>>>>>> at
> > > >>>>>>>>>>>>>>>
> > > >>>>
> > >
> >
> org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:633)
> > > >>>>>>>>>>>>>>> at
> > > >>>>>>>>>>>>>>>
> > > >>>>
> > >
> >
> org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70)
> > > >>>>>>>>>>>>>>> at
> > > >>>>>>>>>>>>>>>
> > > >>>>
> > >
> >
> org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
> > > >>>>>>>>>>>>>>> at
> > > >>>>>>>>>>>>>>>
> > > >>>>
> > >
> >
> org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:95)
> > > >>>>>>>>>>>>>>> at
> > > >>>>>>>>>>>>>>>
> > > >>>>
> > >
> >
> org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
> > > >>>>>>>>>>>>>>> at
> > > >>>>>>>>>>>>>>>
> > > >>>>
> > >
> >
> org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212)
> > > >>>>>>>>>>>>>>> at com.sun.proxy.$Proxy296.save(Unknown Source)
> > > >>>>>>>>>>>>>>> at
> > > >>>>>>>>>>>>>>>
> > > >>>>
> > >
> >
> org.springframework.session.web.http.SessionRepositoryFilter$SessionRepositoryRequestWrapper.commitSession(SessionRepositoryFilter.java:225)
> > > >>>>>>>>>>>>>>> at
> > > >>>>>>>>>>>>>>>
> > > >>>>
> > >
> >
> org.springframework.session.web.http.SessionRepositoryFilter$SessionRepositoryRequestWrapper.access$100(SessionRepositoryFilter.java:192)
> > > >>>>>>>>>>>>>>> at
> > > >>>>>>>>>>>>>>>
> > > >>>>
> > >
> >
> org.springframework.session.web.http.SessionRepositoryFilter.doFilterInternal(SessionRepositoryFilter.java:144)
> > > >>>>>>>>>>>>>>> at
> > > >>>>>>>>>>>>>>>
> > > >>>>
> > >
> >
> org.springframework.session.web.http.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:82)
> > > >>>>>>>>>>>>>>> at
> > > >>>>>>>>>>>>>>>
> > > >>>>
> > >
> >
> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
> > > >>>>>>>>>>>>>>> at
> > > >>>>>>>>>>>>>>>
> > > >>>>
> > >
> >
> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
> > > >>>>>>>>>>>>>>> at
> > > >>>>>>>>>>>>>>>
> > > >>>>
> > >
> >
> org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202)
> > > >>>>>>>>>>>>>>> at
> > > >>>>>>>>>>>>>>>
> > > >>>>
> > >
> >
> org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
> > > >>>>>>>>>>>>>>> at
> > > >>>>>>>>>>>>>>>
> > > >>>>
> > >
> >
> org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:666)
> > > >>>>>>>>>>>>>>> at
> > > >>>>>>>>>>>>>>>
> > > >>>>
> > >
> >
> org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139)
> > > >>>>>>>>>>>>>>> at
> > > >>>>>>>>>>>>>>>
> > > >>>>
> > >
> >
> org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
> > > >>>>>>>>>>>>>>> at
> > > >>>>>>>>>>>>>>>
> > > >>>>
> > >
> >
> org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
> > > >>>>>>>>>>>>>>> at
> > > >>>>>>>>>>>>>>>
> > > >>>>
> > >
> >
> org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
> > > >>>>>>>>>>>>>>> at
> > > >>>>>>>>>>>>>>>
> > > >>>>
> > >
> >
> org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373)
> > > >>>>>>>>>>>>>>> at
> > > >>>>>>>>>>>>>>>
> > > >>>>
> > >
> >
> org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
> > > >>>>>>>>>>>>>>> at
> > > >>>>>>>>>>>>>>>
> > > >>>>
> > >
> >
> org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)
> > > >>>>>>>>>>>>>>> at
> > > >>>>>>>>>>>>>>> org.apache.tomcat.util.net
> > > >>>>>>>>>>> .NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1594)
> > > >>>>>>>>>>>>>>> at
> > > >>>>>>>>>>>>>>> org.apache.tomcat.util.net
> > > >>>>>>>>>>> .SocketProcessorBase.run(SocketProcessorBase.java:49)
> > > >>>>>>>>>>>>>>> at
> > > >>>>>>>>>>>>>>>
> > > >>>>
> > >
> >
> java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
> > > >>>>>>>>>>>>>>> at
> > > >>>>>>>>>>>>>>>
> > > >>>>
> > >
> >
> java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
> > > >>>>>>>>>>>>>>> at
> > > >>>>>>>>>>>>>>>
> > > >>>>
> > >
> >
> org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
> > > >>>>>>>>>>>>>>> at java.base/java.lang.Thread.run(Thread.java:834)
> > > >>>>>>>>>>>>>>> Caused by:
> > > >>>>>>>>>>>>>>>
> > > >>>>
> > >
> org.springframework.core.serializer.support.SerializationFailedException:
> > > >>>>>>>>>>>>>>> Failed to serialize object using DefaultSerializer;
> > > >>>> nested
> > > >>>>>>>>> exception
> > > >>>>>>>>>>> is
> > > >>>>>>>>>>>>>>> java.io.NotSerializableException:
> > > >>>>>>>>>>>>>>>
> > > >>>>
> > >
> >
> org.wicketstuff.datastores.common.SessionQuotaManagingDataStore$DelegatedPage
> > > >>>>>>>>>>>>>>> at
> > > >>>>>>>>>>>>>>>
> > > >>>>
> > >
> >
> org.springframework.core.serializer.support.SerializingConverter.convert(SerializingConverter.java:68)
> > > >>>>>>>>>>>>>>> at
> > > >>>>>>>>>>>>>>>
> > > >>>>
> > >
> >
> org.springframework.core.serializer.support.SerializingConverter.convert(SerializingConverter.java:35)
> > > >>>>>>>>>>>>>>> at
> > > >>>>>>>>>>>>>>>
> > > >>>>
> > >
> >
> org.springframework.data.redis.serializer.JdkSerializationRedisSerializer.serialize(JdkSerializationRedisSerializer.java:94)
> > > >>>>>>>>>>>>>>> ... 52 common frames omitted
> > > >>>>>>>>>>>>>>> Caused by: java.io.NotSerializableException:
> > > >>>>>>>>>>>>>>>
> > > >>>>
> > >
> >
> org.wicketstuff.datastores.common.SessionQuotaManagingDataStore$DelegatedPage
> > > >>>>>>>>>>>>>> Why does Wicket 9 try to serialize the
> > > >>>>>>>>> SessionQuotaManagingDataStore in
> > > >>>>>>>>>>>>>> the session? Is this intended and does DelegatePage
> > > >>>> simply
> > > >>>>>> need to
> > > >>>>>>>>>>>>>> implement Serializable or shouldn't this be serialized
> at
> > > >>>>>> all? In
> > > >>>>>>>>>>> Wicket 8,
> > > >>>>>>>>>>>>>> the corresponding PageData wasn't serializable either so
> > > >>>> my
> > > >>>>>> guess
> > > >>>>>>>>>>> would be
> > > >>>>>>>>>>>>>> that this behavior is not intended.
> > > >>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>> I'm using the following config for Wicket 8 and there
> > > >>>> are no
> > > >>>>>> such
> > > >>>>>>>>>>> issues:
> > > >>>>>>>>>>>>>> protected IPageStore newPageStore(IDataStore dataStore)
> {
> > > >>>>>>>>>>>>>>> final ISerializer pageSerializer =
> > > >>>>>>>>>>>>>>> getFrameworkSettings().getSerializer();
> > > >>>>>>>>>>>>>>> return new PerSessionPageStore(pageSerializer,
> > > >>>> dataStore,
> > > >>>>>>>>>>>>>>> MAX_PAGES_CACHED_PER_SESSION);
> > > >>>>>>>>>>>>>>> }
> > > >>>>>>>>>>>>>>> protected IDataStore newDataStore() {
> > > >>>>>>>>>>>>>>> final RedissonRedisCache redisCache = new
> > > >>>>>>>>>>>>>>> RedissonRedisCache(redissonClient.get());
> > > >>>>>>>>>>>>>>> final RedisDataStore redisDataStore = new
> > > >>>>>>>>> RedisDataStore(redisCache,
> > > >>>>>>>>>>> new
> > > >>>>>>>>>>>>>>> RedisSettings());
> > > >>>>>>>>>>>>>>> return new
> SessionQuotaManagingDataStore(redisDataStore,
> > > >>>>>>>>>>>>>>> DATA_STORE_MAX_BYTES_PER_SESSION);
> > > >>>>>>>>>>>>>>> }
> > > >>>>>>>>>>>>>> Best regards,
> > > >>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>> Thomas
> > > >>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>> On Sat, Mar 28, 2020 at 10:23 AM Thomas Heigl <
> > > >>>>>> tho...@umschalt.com
> > > >>>>>>>>>>>>>> wrote:
> > > >>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>>> Thanks Sven!
> > > >>>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>>> That looks much better. I'll give it a try as soon as I
> > > >>>> can.
> > > >>>>>>>>>>>>>>> Best regards,
> > > >>>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>>> Thomas
> > > >>>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>>> On Fri, Mar 27, 2020 at 2:23 PM Sven Meier <
> > > >>>> s...@meiers.net
> > > >>>>>>>>> wrote:
> > > >>>>>>>>>>>>>>>> Hi Thomas,
> > > >>>>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>>>> your question comes at the right time.
> > > >>>>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>>>> I was able to improve the implementation with a new
> > > >>>>>>>>> CachingPageStore:
> > > >>>>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>>>>
> > > >>>>
> > >
> >
> https://github.com/apache/wicket/blob/8df3528dc44a08b7d375c20e764a3664cd6a5f30/wicket-core/src/main/java/org/apache/wicket/DefaultPageManagerProvider.java#L145
> > > >>>>>>>>>>>>>>>> You can now use InMemoryPageStore as a cache too.
> > > >>>>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>>>> Have fun
> > > >>>>>>>>>>>>>>>> Sven
> > > >>>>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>>>> On 27.03.20 09:34, Sven Meier wrote:
> > > >>>>>>>>>>>>>>>>> Hi Thomas,
> > > >>>>>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>>>>> I thought I covered that usecase, but I will have to
> > > >>>> take
> > > >>>>>> a
> > > >>>>>>>>> look.
> > > >>>>>>>>>>>>>>>>> Thanks for testing Wicket 9
> > > >>>>>>>>>>>>>>>>> Sven
> > > >>>>>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>>>>> On 25.03.20 20:10, Thomas Heigl wrote:
> > > >>>>>>>>>>>>>>>>>> Maybe the same approach could be used as for
> > > >>>>>> InSessionPageStore
> > > >>>>>>>>>>> that
> > > >>>>>>>>>>>>>>>>>> can be
> > > >>>>>>>>>>>>>>>>>> used as cache and a store:
> > > >>>>>>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>>>>>>
> > > >>>>
> > >
> >
> https://github.com/apache/wicket/commit/894799e01227781be76886b2d1cdb2a424c812e0
> > > >>>>>>>>>>>>>>>>>> On Wed, Mar 25, 2020 at 6:35 PM Thomas Heigl <
> > > >>>>>>>>> tho...@umschalt.com>
> > > >>>>>>>>>>>>>>>>>> wrote:
> > > >>>>>>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>>>>>>> Hi all,
> > > >>>>>>>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>>>>>>> I just merged our master in our Wicket 9 branch and
> > > >>>> I
> > > >>>>>> ran
> > > >>>>>>>>> into an
> > > >>>>>>>>>>>>>>>>>>> issue:
> > > >>>>>>>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>>>>>>> Our current configuration with Wicket 8 looks like
> > > >>>> this:
> > > >>>>>>>>>>>>>>>>>>> PageStore = PerSessionPageStore
> > > >>>>>>>>>>>>>>>>>>> DataStore = RedisDataStore
> > > >>>>>>>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>>>>>>> So the page store keeps the last couple of pages of
> > > >>>> a
> > > >>>>>> session
> > > >>>>>>>>> in
> > > >>>>>>>>>>>>>>>> memory
> > > >>>>>>>>>>>>>>>>>>> and Redis is used as a persistent store.
> > > >>>>>>>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>>>>>>> I tried to recreate this behavior with Wicket 9:
> > > >>>>>>>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>>>>>>> SessionStore = InMemoryPageStore
> > > >>>>>>>>>>>>>>>>>>> PersistentStore = RedisDataStore
> > > >>>>>>>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>>>>>>> This looks correct, but it *does not work* because
> > > >>>>>>>>> InMemoryPage
> > > >>>>>>>>>>>>>>>> store
> > > >>>>>>>>>>>>>>>>>>> implements AbstractPersistentPageStore and does
> > > >>>> *not*
> > > >>>>>>>>> delegate to
> > > >>>>>>>>>>>>>>>> the
> > > >>>>>>>>>>>>>>>>>>> next store in the chain.
> > > >>>>>>>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>>>>>>> So we basically lost the option to use a memory
> page
> > > >>>>>> store in
> > > >>>>>>>>>>> front
> > > >>>>>>>>>>>>>>>>>>> of a
> > > >>>>>>>>>>>>>>>>>>> persistent store.
> > > >>>>>>>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>>>>>>> We need this functionality because we are using
> > > >>>> Spring
> > > >>>>>>>>> Session and
> > > >>>>>>>>>>>>>>>>>>> cannot
> > > >>>>>>>>>>>>>>>>>>> use the session as a page store.
> > > >>>>>>>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>>>>>>> Would it be possible to add an InMemory store that
> > > >>>>>> delegates
> > > >>>>>>>>> to
> > > >>>>>>>>>>> the
> > > >>>>>>>>>>>>>>>>>>> next
> > > >>>>>>>>>>>>>>>>>>> store in the chain? Or do I have to implement it
> > > >>>> myself?
> > > >>>>>>>>>>>>>>>>>>> Best regards,
> > > >>>>>>>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>>>>>>> Thomas
> > > >>>>>>>>>>>>>>>>>>>
> > > >>>>>>
> > > ---------------------------------------------------------------------
> > > >>>>>>>>>>>>>>>>> To unsubscribe, e-mail:
> > > >>>>>> users-unsubscr...@wicket.apache.org
> > > >>>>>>>>>>>>>>>>> For additional commands, e-mail:
> > > >>>>>> users-h...@wicket.apache.org
> > > >>>>
> > ---------------------------------------------------------------------
> > > >>>>>>>>>>>>>>>> To unsubscribe, e-mail:
> > > >>>>>> users-unsubscr...@wicket.apache.org
> > > >>>>>>>>>>>>>>>> For additional commands, e-mail:
> > > >>>>>> users-h...@wicket.apache.org
> > > >>>>>>>>>>>>>>>>
> > > >>>>>>>>>>>
> > > >>>>>>
> > > ---------------------------------------------------------------------
> > > >>>>>>>>>>> To unsubscribe, e-mail:
> users-unsubscr...@wicket.apache.org
> > > >>>>>>>>>>> For additional commands, e-mail:
> > > >>>> users-h...@wicket.apache.org
> > > >>>>>>>>>>>
> > > >>>>>>>>>
> > > >>>>>>>>>
> > > >>>>>>>>> --
> > > >>>>>>>>> Best regards,
> > > >>>>>>>>> Maxim
> > > >>>>>>>>>
> > > >>>>>>>>>
> > > >>>>
> > ---------------------------------------------------------------------
> > > >>>>>>>>> To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org
> > > >>>>>>>>> For additional commands, e-mail:
> users-h...@wicket.apache.org
> > > >>>>>>>>>
> > > >>>>>>>>>
> > > >>>>>>>
> > > >>>>>>>
> > > >>>>>>> --
> > > >>>>>>> Best regards,
> > > >>>>>>> Maxim
> > > >>>>>>
> > > >>>>>>
> > > >>>>>> --
> > > >>>>>> Best regards,
> > > >>>>>> Maxim
> > > >>>>>>
> > > >>>>>>
> > > ---------------------------------------------------------------------
> > > >>>>>> To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org
> > > >>>>>> For additional commands, e-mail: users-h...@wicket.apache.org
> > > >>>>>>
> > > >>>>>>
> > > >>>>
> > > >>>>
> > > >>>> --
> > > >>>> Best regards,
> > > >>>> Maxim
> > > >>>>
> > > >>>>
> > ---------------------------------------------------------------------
> > > >>>> To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org
> > > >>>> For additional commands, e-mail: users-h...@wicket.apache.org
> > > >>>>
> > > >>>>
> > > >>
> > > >>
> > > >> --
> > > >> Best regards,
> > > >> Maxim
> > > >
> > > >
> > >
> > > ---------------------------------------------------------------------
> > > To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org
> > > For additional commands, e-mail: users-h...@wicket.apache.org
> > >
> > >
> >
>

Reply via email to