Hi Sven, That's good to hear! Please let me know when you have an implementation and I'll give it another go.
Best regards, Thomas On Sat, Apr 11, 2020 at 11:01 PM Sven Meier <s...@meiers.net> wrote: > Hi Thomas, > > actually not bad news at all (for Wicket 9 at least). > > The old page manager implementation had so many special concepts and > solutions, it's easy to miss one. > > A soft reference feature can easily be added/restored. I'm already > checking where it fits best. > > Thanks for your thorough testing. > > Best regards > Sven > > > On 11.04.20 10:58, Thomas Heigl wrote: > > 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 > >>>> > >>>> > > --------------------------------------------------------------------- > To unsubscribe, e-mail: users-unsubscr...@wicket.apache.org > For additional commands, e-mail: users-h...@wicket.apache.org > >