You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@wicket.apache.org by Thomas Heigl <th...@umschalt.com> on 2020/04/07 11:59:41 UTC

Re: Equivalent for PerSessionPageStore in Wicket 9

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 <th...@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 <sv...@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 <th...@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-unsubscribe@wicket.apache.org
>> > For additional commands, e-mail: users-help@wicket.apache.org
>> >
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
>> For additional commands, e-mail: users-help@wicket.apache.org
>>
>>

Re: Equivalent for PerSessionPageStore in Wicket 9

Posted by Thomas Heigl <th...@umschalt.com>.
Hi Martin,

If the next release is not too far away, I'd rather wait.

I'm already pushing a milestone to production and don't want to copy large
chunks of code to my project as well ;)

Best regards,

Thomas

On Thu, Apr 16, 2020 at 1:33 PM Martin Grigorov <mg...@apache.org>
wrote:

> Hi Thomas,
>
> On Thu, Apr 16, 2020 at 1:41 PM Thomas Heigl <th...@umschalt.com> wrote:
>
> > Thanks Sven!
> >
> > I think the solution is good enough for now.
> >
> > Would it be possible to do a 9.0.0-M5.1 release for this? If so, I would
> > give it another try on production.
> >
>
> It would be easier to copy the class temporarily in your project and fix
> the import in YourApplication.java.
> You can revert this change with the next release.
>
>
> >
> > Best regards,
> >
> > Thomas
> >
> > On Wed, Apr 15, 2020 at 11:57 PM Sven Meier <sv...@meiers.net> wrote:
> >
> > > Hi Thomas,
> > >
> > > I've pushed a change for
> > > https://issues.apache.org/jira/browse/WICKET-6769 to master.
> > >
> > > I'm not sure about the API right now, but it allows you to easily use
> > > any other map implementation.
> > >
> > > Caffeine's Cache#asMap() should work fine with here, although I didn't
> > > test it myself.
> > >
> > > Have fun
> > > Sven
> > >
> > >
> > > On 12.04.20 20:41, Thomas Heigl wrote:
> > > > Hi Sven,
> > > >
> > > > I was thinking about this as well.
> > > >
> > > > SoftReferences worked well in my application. G1GC seems to start to
> > > evict
> > > > them when -XX:InitiatingHeapOccupancyPercent is reached. In my case,
> > when
> > > > the heap is around 60% full.
> > > > But as you said, there is no real control over which references are
> > > evicted
> > > > and it is much harder to monitor the current state of the memory map.
> > > >
> > > > We are already using Caffeine extensively and your suggested solution
> > > would
> > > > allow me much more control over the cache.
> > > > We could still use SoftReferences with Caffeine if we wanted to in
> > > addition
> > > > to setting a global limit on cache size and an eviction policy.
> > > >
> > > > To avoid calling an overridable method from the constructor you could
> > > add a
> > > > Supplier<Map<String, MemoryData>> argument. I usually choose a
> > > > supplier-based approach in such cases.
> > > >
> > > > Let's go for this solution!
> > > >
> > > > Best regards,
> > > >
> > > > Thomas
> > > >
> > > >
> > > >
> > > > On Sun, Apr 12, 2020 at 6:57 PM Sven Meier <sv...@meiers.net> wrote:
> > > >
> > > >> Hi Thomas,
> > > >>
> > > >> I've did a little research on using SoftReferences for caches:
> > > >>
> > > >>
> > >
> >
> https://stackoverflow.com/questions/264582/is-there-a-softhashmap-in-java
> > > >>
> > > >>
> > >
> >
> http://jeremymanson.blogspot.com/2009/07/how-hotspot-decides-to-clear_07.html
> > > >>
> > > >> The experts seem to agree that depending on the GC to clean up your
> > > >> cache is a bad idea:
> > > >>
> > > >> - you can't control which elements in the cache are evicted first
> > > >> - eviction happens only when the system is low on memory
> > > >>
> > > >> Best option would be using Guava's CacheBuilder:
> > > >>
> > > >>     https://github.com/google/guava/wiki/CachesExplained
> > > >>
> > > >> IMHO these are very special solutions and we don't actually need to
> > > >> integrate one of them into Wicket.
> > > >> Instead we can leave that decision to your application, by adding an
> > > >> overridable method to InMemoryPageStore:
> > > >>
> > > >>       /**
> > > >>        * Create a map to hold memory data for all sessions.
> > > >>        *
> > > >>        * @return a {@link ConcurrentHashMap} by default
> > > >>        */
> > > >>       protected Map<String, MemoryData> newMemoryMap()
> > > >>       {
> > > >>           return new ConcurrentHashMap<>();
> > > >>       }
> > > >>
> > > >> (Yes, it would be called from the constructor which is a bad
> practice
> > by
> > > >> itself, but this is the simplest solution.)
> > > >>
> > > >> What do you think?
> > > >>
> > > >> Sven
> > > >>
> > > >>
> > > >> On 12.04.20 10:34, Thomas Heigl wrote:
> > > >>> 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 <sv...@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 <
> > > mgrigorov@apache.org>
> > > >>>>> wrote:
> > > >>>>>
> > > >>>>>> On Fri, Apr 10, 2020 at 4:01 PM Thomas Heigl <
> thomas@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 <sv...@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 <
> > > >> solomax666@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 <
> > thomas@umschalt.com>
> > > >>>>>>> wrote:
> > > >>>>>>>>>>> Hi Maxim,
> > > >>>>>>>>>>>
> > > >>>>>>>>>>> It works for me now!
> > > >>>>>>>>>>>
> > > >>>>>>>>>>> Thomas
> > > >>>>>>>>>>>
> > > >>>>>>>>>>> On Wed, Apr 8, 2020 at 9:17 AM Maxim Solodovnik <
> > > >>>>>>> solomax666@gmail.com>
> > > >>>>>>>>>>> wrote:
> > > >>>>>>>>>>>
> > > >>>>>>>>>>>> Thanks a million!
> > > >>>>>>>>>>>>
> > > >>>>>>>>>>>> On Wed, 8 Apr 2020 at 14:10, Thomas Heigl <
> > > thomas@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 <
> > > >>>>>>>> solomax666@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 <
> > > >>>>>>> solomax666@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 <
> > > >> thomas@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 <
> > > >>>>>>>>>>>> solomax666@gmail.com>
> > > >>>>>>>>>>>>>>>> wrote:
> > > >>>>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>>>>> I can pack another release
> > > >>>>>>>>>>>>>>>>> later this week ...
> > > >>>>>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>>>>> On Wed, 8 Apr 2020 at 00:48, Thomas Heigl <
> > > >>>>>> thomas@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 <
> > > >> sven@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 <
> > > >>>>>>>>>>>>>> thomas@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 <
> > > >>>>>>>>>>>>>> thomas@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 <
> > > >>>>>>>>>>>>>> thomas@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 <
> > > >>>>>>>>>>>> sven@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 <
> > > >>>>>>>>>>>>>>>>> thomas@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-unsubscribe@wicket.apache.org
> > > >>>>>>>>>>>>>>>>>>>>>>>>> For additional commands, e-mail:
> > > >>>>>>>>>>>>>> users-help@wicket.apache.org
> > > >>>>>>>
> > > ---------------------------------------------------------------------
> > > >>>>>>>>>>>>>>>>>>>>>>>> To unsubscribe, e-mail:
> > > >>>>>>>>>>>>>> users-unsubscribe@wicket.apache.org
> > > >>>>>>>>>>>>>>>>>>>>>>>> For additional commands, e-mail:
> > > >>>>>>>>>>>>>> users-help@wicket.apache.org
> > > >>
> ---------------------------------------------------------------------
> > > >>>>>>>>>>>>>>>>>>> To unsubscribe, e-mail:
> > > >>>>>> users-unsubscribe@wicket.apache.org
> > > >>>>>>>>>>>>>>>>>>> For additional commands, e-mail:
> > > >>>>>>>>>>>> users-help@wicket.apache.org
> > > >>>>>>>>>>>>>>>>> --
> > > >>>>>>>>>>>>>>>>> Best regards,
> > > >>>>>>>>>>>>>>>>> Maxim
> > > >>>>>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>>>>>
> > > >>>>>>>
> > > ---------------------------------------------------------------------
> > > >>>>>>>>>>>>>>>>> To unsubscribe, e-mail:
> > > >> users-unsubscribe@wicket.apache.org
> > > >>>>>>>>>>>>>>>>> For additional commands, e-mail:
> > > >>>>>> users-help@wicket.apache.org
> > > >>>>>>>>>>>>>>> --
> > > >>>>>>>>>>>>>>> Best regards,
> > > >>>>>>>>>>>>>>> Maxim
> > > >>>>>>>>>>>>>> --
> > > >>>>>>>>>>>>>> Best regards,
> > > >>>>>>>>>>>>>> Maxim
> > > >>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>>
> > > >>
> ---------------------------------------------------------------------
> > > >>>>>>>>>>>>>> To unsubscribe, e-mail:
> > users-unsubscribe@wicket.apache.org
> > > >>>>>>>>>>>>>> For additional commands, e-mail:
> > > users-help@wicket.apache.org
> > > >>>>>>>>>>>>>>
> > > >>>>>>>>>>>>>>
> > > >>>>>>>>>>>> --
> > > >>>>>>>>>>>> Best regards,
> > > >>>>>>>>>>>> Maxim
> > > >>>>>>>>>>>>
> > > >>>>>>>>>>>>
> > > >>>>>>>
> > > ---------------------------------------------------------------------
> > > >>>>>>>>>>>> To unsubscribe, e-mail:
> users-unsubscribe@wicket.apache.org
> > > >>>>>>>>>>>> For additional commands, e-mail:
> > users-help@wicket.apache.org
> > > >>>>>>>>>>>>
> > > >>>>>>>>>>>>
> > > >>>>>>>>>> --
> > > >>>>>>>>>> Best regards,
> > > >>>>>>>>>> Maxim
> > > >>
> ---------------------------------------------------------------------
> > > >>>>>>>> To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
> > > >>>>>>>> For additional commands, e-mail: users-help@wicket.apache.org
> > > >>>>>>>>
> > > >>>>>>>>
> > > >>>>
> > ---------------------------------------------------------------------
> > > >>>> To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
> > > >>>> For additional commands, e-mail: users-help@wicket.apache.org
> > > >>>>
> > > >>>>
> > > >>
> ---------------------------------------------------------------------
> > > >> To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
> > > >> For additional commands, e-mail: users-help@wicket.apache.org
> > > >>
> > > >>
> > >
> > > ---------------------------------------------------------------------
> > > To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
> > > For additional commands, e-mail: users-help@wicket.apache.org
> > >
> > >
> >
>

Re: Equivalent for PerSessionPageStore in Wicket 9

Posted by Martin Grigorov <mg...@apache.org>.
Hi Thomas,

On Thu, Apr 16, 2020 at 1:41 PM Thomas Heigl <th...@umschalt.com> wrote:

> Thanks Sven!
>
> I think the solution is good enough for now.
>
> Would it be possible to do a 9.0.0-M5.1 release for this? If so, I would
> give it another try on production.
>

It would be easier to copy the class temporarily in your project and fix
the import in YourApplication.java.
You can revert this change with the next release.


>
> Best regards,
>
> Thomas
>
> On Wed, Apr 15, 2020 at 11:57 PM Sven Meier <sv...@meiers.net> wrote:
>
> > Hi Thomas,
> >
> > I've pushed a change for
> > https://issues.apache.org/jira/browse/WICKET-6769 to master.
> >
> > I'm not sure about the API right now, but it allows you to easily use
> > any other map implementation.
> >
> > Caffeine's Cache#asMap() should work fine with here, although I didn't
> > test it myself.
> >
> > Have fun
> > Sven
> >
> >
> > On 12.04.20 20:41, Thomas Heigl wrote:
> > > Hi Sven,
> > >
> > > I was thinking about this as well.
> > >
> > > SoftReferences worked well in my application. G1GC seems to start to
> > evict
> > > them when -XX:InitiatingHeapOccupancyPercent is reached. In my case,
> when
> > > the heap is around 60% full.
> > > But as you said, there is no real control over which references are
> > evicted
> > > and it is much harder to monitor the current state of the memory map.
> > >
> > > We are already using Caffeine extensively and your suggested solution
> > would
> > > allow me much more control over the cache.
> > > We could still use SoftReferences with Caffeine if we wanted to in
> > addition
> > > to setting a global limit on cache size and an eviction policy.
> > >
> > > To avoid calling an overridable method from the constructor you could
> > add a
> > > Supplier<Map<String, MemoryData>> argument. I usually choose a
> > > supplier-based approach in such cases.
> > >
> > > Let's go for this solution!
> > >
> > > Best regards,
> > >
> > > Thomas
> > >
> > >
> > >
> > > On Sun, Apr 12, 2020 at 6:57 PM Sven Meier <sv...@meiers.net> wrote:
> > >
> > >> Hi Thomas,
> > >>
> > >> I've did a little research on using SoftReferences for caches:
> > >>
> > >>
> >
> https://stackoverflow.com/questions/264582/is-there-a-softhashmap-in-java
> > >>
> > >>
> >
> http://jeremymanson.blogspot.com/2009/07/how-hotspot-decides-to-clear_07.html
> > >>
> > >> The experts seem to agree that depending on the GC to clean up your
> > >> cache is a bad idea:
> > >>
> > >> - you can't control which elements in the cache are evicted first
> > >> - eviction happens only when the system is low on memory
> > >>
> > >> Best option would be using Guava's CacheBuilder:
> > >>
> > >>     https://github.com/google/guava/wiki/CachesExplained
> > >>
> > >> IMHO these are very special solutions and we don't actually need to
> > >> integrate one of them into Wicket.
> > >> Instead we can leave that decision to your application, by adding an
> > >> overridable method to InMemoryPageStore:
> > >>
> > >>       /**
> > >>        * Create a map to hold memory data for all sessions.
> > >>        *
> > >>        * @return a {@link ConcurrentHashMap} by default
> > >>        */
> > >>       protected Map<String, MemoryData> newMemoryMap()
> > >>       {
> > >>           return new ConcurrentHashMap<>();
> > >>       }
> > >>
> > >> (Yes, it would be called from the constructor which is a bad practice
> by
> > >> itself, but this is the simplest solution.)
> > >>
> > >> What do you think?
> > >>
> > >> Sven
> > >>
> > >>
> > >> On 12.04.20 10:34, Thomas Heigl wrote:
> > >>> 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 <sv...@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 <
> > mgrigorov@apache.org>
> > >>>>> wrote:
> > >>>>>
> > >>>>>> On Fri, Apr 10, 2020 at 4:01 PM Thomas Heigl <thomas@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 <sv...@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 <
> > >> solomax666@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 <
> thomas@umschalt.com>
> > >>>>>>> wrote:
> > >>>>>>>>>>> Hi Maxim,
> > >>>>>>>>>>>
> > >>>>>>>>>>> It works for me now!
> > >>>>>>>>>>>
> > >>>>>>>>>>> Thomas
> > >>>>>>>>>>>
> > >>>>>>>>>>> On Wed, Apr 8, 2020 at 9:17 AM Maxim Solodovnik <
> > >>>>>>> solomax666@gmail.com>
> > >>>>>>>>>>> wrote:
> > >>>>>>>>>>>
> > >>>>>>>>>>>> Thanks a million!
> > >>>>>>>>>>>>
> > >>>>>>>>>>>> On Wed, 8 Apr 2020 at 14:10, Thomas Heigl <
> > thomas@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 <
> > >>>>>>>> solomax666@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 <
> > >>>>>>> solomax666@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 <
> > >> thomas@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 <
> > >>>>>>>>>>>> solomax666@gmail.com>
> > >>>>>>>>>>>>>>>> wrote:
> > >>>>>>>>>>>>>>>>
> > >>>>>>>>>>>>>>>>> I can pack another release
> > >>>>>>>>>>>>>>>>> later this week ...
> > >>>>>>>>>>>>>>>>>
> > >>>>>>>>>>>>>>>>> On Wed, 8 Apr 2020 at 00:48, Thomas Heigl <
> > >>>>>> thomas@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 <
> > >> sven@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 <
> > >>>>>>>>>>>>>> thomas@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 <
> > >>>>>>>>>>>>>> thomas@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 <
> > >>>>>>>>>>>>>> thomas@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 <
> > >>>>>>>>>>>> sven@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 <
> > >>>>>>>>>>>>>>>>> thomas@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-unsubscribe@wicket.apache.org
> > >>>>>>>>>>>>>>>>>>>>>>>>> For additional commands, e-mail:
> > >>>>>>>>>>>>>> users-help@wicket.apache.org
> > >>>>>>>
> > ---------------------------------------------------------------------
> > >>>>>>>>>>>>>>>>>>>>>>>> To unsubscribe, e-mail:
> > >>>>>>>>>>>>>> users-unsubscribe@wicket.apache.org
> > >>>>>>>>>>>>>>>>>>>>>>>> For additional commands, e-mail:
> > >>>>>>>>>>>>>> users-help@wicket.apache.org
> > >> ---------------------------------------------------------------------
> > >>>>>>>>>>>>>>>>>>> To unsubscribe, e-mail:
> > >>>>>> users-unsubscribe@wicket.apache.org
> > >>>>>>>>>>>>>>>>>>> For additional commands, e-mail:
> > >>>>>>>>>>>> users-help@wicket.apache.org
> > >>>>>>>>>>>>>>>>> --
> > >>>>>>>>>>>>>>>>> Best regards,
> > >>>>>>>>>>>>>>>>> Maxim
> > >>>>>>>>>>>>>>>>>
> > >>>>>>>>>>>>>>>>>
> > >>>>>>>
> > ---------------------------------------------------------------------
> > >>>>>>>>>>>>>>>>> To unsubscribe, e-mail:
> > >> users-unsubscribe@wicket.apache.org
> > >>>>>>>>>>>>>>>>> For additional commands, e-mail:
> > >>>>>> users-help@wicket.apache.org
> > >>>>>>>>>>>>>>> --
> > >>>>>>>>>>>>>>> Best regards,
> > >>>>>>>>>>>>>>> Maxim
> > >>>>>>>>>>>>>> --
> > >>>>>>>>>>>>>> Best regards,
> > >>>>>>>>>>>>>> Maxim
> > >>>>>>>>>>>>>>
> > >>>>>>>>>>>>>>
> > >> ---------------------------------------------------------------------
> > >>>>>>>>>>>>>> To unsubscribe, e-mail:
> users-unsubscribe@wicket.apache.org
> > >>>>>>>>>>>>>> For additional commands, e-mail:
> > users-help@wicket.apache.org
> > >>>>>>>>>>>>>>
> > >>>>>>>>>>>>>>
> > >>>>>>>>>>>> --
> > >>>>>>>>>>>> Best regards,
> > >>>>>>>>>>>> Maxim
> > >>>>>>>>>>>>
> > >>>>>>>>>>>>
> > >>>>>>>
> > ---------------------------------------------------------------------
> > >>>>>>>>>>>> To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
> > >>>>>>>>>>>> For additional commands, e-mail:
> users-help@wicket.apache.org
> > >>>>>>>>>>>>
> > >>>>>>>>>>>>
> > >>>>>>>>>> --
> > >>>>>>>>>> Best regards,
> > >>>>>>>>>> Maxim
> > >> ---------------------------------------------------------------------
> > >>>>>>>> To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
> > >>>>>>>> For additional commands, e-mail: users-help@wicket.apache.org
> > >>>>>>>>
> > >>>>>>>>
> > >>>>
> ---------------------------------------------------------------------
> > >>>> To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
> > >>>> For additional commands, e-mail: users-help@wicket.apache.org
> > >>>>
> > >>>>
> > >> ---------------------------------------------------------------------
> > >> To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
> > >> For additional commands, e-mail: users-help@wicket.apache.org
> > >>
> > >>
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
> > For additional commands, e-mail: users-help@wicket.apache.org
> >
> >
>

Re: Equivalent for PerSessionPageStore in Wicket 9

Posted by Thomas Heigl <th...@umschalt.com>.
Thanks Sven!

I think the solution is good enough for now.

Would it be possible to do a 9.0.0-M5.1 release for this? If so, I would
give it another try on production.

Best regards,

Thomas

On Wed, Apr 15, 2020 at 11:57 PM Sven Meier <sv...@meiers.net> wrote:

> Hi Thomas,
>
> I've pushed a change for
> https://issues.apache.org/jira/browse/WICKET-6769 to master.
>
> I'm not sure about the API right now, but it allows you to easily use
> any other map implementation.
>
> Caffeine's Cache#asMap() should work fine with here, although I didn't
> test it myself.
>
> Have fun
> Sven
>
>
> On 12.04.20 20:41, Thomas Heigl wrote:
> > Hi Sven,
> >
> > I was thinking about this as well.
> >
> > SoftReferences worked well in my application. G1GC seems to start to
> evict
> > them when -XX:InitiatingHeapOccupancyPercent is reached. In my case, when
> > the heap is around 60% full.
> > But as you said, there is no real control over which references are
> evicted
> > and it is much harder to monitor the current state of the memory map.
> >
> > We are already using Caffeine extensively and your suggested solution
> would
> > allow me much more control over the cache.
> > We could still use SoftReferences with Caffeine if we wanted to in
> addition
> > to setting a global limit on cache size and an eviction policy.
> >
> > To avoid calling an overridable method from the constructor you could
> add a
> > Supplier<Map<String, MemoryData>> argument. I usually choose a
> > supplier-based approach in such cases.
> >
> > Let's go for this solution!
> >
> > Best regards,
> >
> > Thomas
> >
> >
> >
> > On Sun, Apr 12, 2020 at 6:57 PM Sven Meier <sv...@meiers.net> wrote:
> >
> >> Hi Thomas,
> >>
> >> I've did a little research on using SoftReferences for caches:
> >>
> >>
> https://stackoverflow.com/questions/264582/is-there-a-softhashmap-in-java
> >>
> >>
> http://jeremymanson.blogspot.com/2009/07/how-hotspot-decides-to-clear_07.html
> >>
> >> The experts seem to agree that depending on the GC to clean up your
> >> cache is a bad idea:
> >>
> >> - you can't control which elements in the cache are evicted first
> >> - eviction happens only when the system is low on memory
> >>
> >> Best option would be using Guava's CacheBuilder:
> >>
> >>     https://github.com/google/guava/wiki/CachesExplained
> >>
> >> IMHO these are very special solutions and we don't actually need to
> >> integrate one of them into Wicket.
> >> Instead we can leave that decision to your application, by adding an
> >> overridable method to InMemoryPageStore:
> >>
> >>       /**
> >>        * Create a map to hold memory data for all sessions.
> >>        *
> >>        * @return a {@link ConcurrentHashMap} by default
> >>        */
> >>       protected Map<String, MemoryData> newMemoryMap()
> >>       {
> >>           return new ConcurrentHashMap<>();
> >>       }
> >>
> >> (Yes, it would be called from the constructor which is a bad practice by
> >> itself, but this is the simplest solution.)
> >>
> >> What do you think?
> >>
> >> Sven
> >>
> >>
> >> On 12.04.20 10:34, Thomas Heigl wrote:
> >>> 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 <sv...@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 <
> mgrigorov@apache.org>
> >>>>> wrote:
> >>>>>
> >>>>>> On Fri, Apr 10, 2020 at 4:01 PM Thomas Heigl <th...@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 <sv...@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 <
> >> solomax666@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 <th...@umschalt.com>
> >>>>>>> wrote:
> >>>>>>>>>>> Hi Maxim,
> >>>>>>>>>>>
> >>>>>>>>>>> It works for me now!
> >>>>>>>>>>>
> >>>>>>>>>>> Thomas
> >>>>>>>>>>>
> >>>>>>>>>>> On Wed, Apr 8, 2020 at 9:17 AM Maxim Solodovnik <
> >>>>>>> solomax666@gmail.com>
> >>>>>>>>>>> wrote:
> >>>>>>>>>>>
> >>>>>>>>>>>> Thanks a million!
> >>>>>>>>>>>>
> >>>>>>>>>>>> On Wed, 8 Apr 2020 at 14:10, Thomas Heigl <
> thomas@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 <
> >>>>>>>> solomax666@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 <
> >>>>>>> solomax666@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 <
> >> thomas@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 <
> >>>>>>>>>>>> solomax666@gmail.com>
> >>>>>>>>>>>>>>>> wrote:
> >>>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>>>> I can pack another release
> >>>>>>>>>>>>>>>>> later this week ...
> >>>>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>>>> On Wed, 8 Apr 2020 at 00:48, Thomas Heigl <
> >>>>>> thomas@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 <
> >> sven@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 <
> >>>>>>>>>>>>>> thomas@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 <
> >>>>>>>>>>>>>> thomas@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 <
> >>>>>>>>>>>>>> thomas@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 <
> >>>>>>>>>>>> sven@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 <
> >>>>>>>>>>>>>>>>> thomas@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-unsubscribe@wicket.apache.org
> >>>>>>>>>>>>>>>>>>>>>>>>> For additional commands, e-mail:
> >>>>>>>>>>>>>> users-help@wicket.apache.org
> >>>>>>>
> ---------------------------------------------------------------------
> >>>>>>>>>>>>>>>>>>>>>>>> To unsubscribe, e-mail:
> >>>>>>>>>>>>>> users-unsubscribe@wicket.apache.org
> >>>>>>>>>>>>>>>>>>>>>>>> For additional commands, e-mail:
> >>>>>>>>>>>>>> users-help@wicket.apache.org
> >> ---------------------------------------------------------------------
> >>>>>>>>>>>>>>>>>>> To unsubscribe, e-mail:
> >>>>>> users-unsubscribe@wicket.apache.org
> >>>>>>>>>>>>>>>>>>> For additional commands, e-mail:
> >>>>>>>>>>>> users-help@wicket.apache.org
> >>>>>>>>>>>>>>>>> --
> >>>>>>>>>>>>>>>>> Best regards,
> >>>>>>>>>>>>>>>>> Maxim
> >>>>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>>>>
> >>>>>>>
> ---------------------------------------------------------------------
> >>>>>>>>>>>>>>>>> To unsubscribe, e-mail:
> >> users-unsubscribe@wicket.apache.org
> >>>>>>>>>>>>>>>>> For additional commands, e-mail:
> >>>>>> users-help@wicket.apache.org
> >>>>>>>>>>>>>>> --
> >>>>>>>>>>>>>>> Best regards,
> >>>>>>>>>>>>>>> Maxim
> >>>>>>>>>>>>>> --
> >>>>>>>>>>>>>> Best regards,
> >>>>>>>>>>>>>> Maxim
> >>>>>>>>>>>>>>
> >>>>>>>>>>>>>>
> >> ---------------------------------------------------------------------
> >>>>>>>>>>>>>> To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
> >>>>>>>>>>>>>> For additional commands, e-mail:
> users-help@wicket.apache.org
> >>>>>>>>>>>>>>
> >>>>>>>>>>>>>>
> >>>>>>>>>>>> --
> >>>>>>>>>>>> Best regards,
> >>>>>>>>>>>> Maxim
> >>>>>>>>>>>>
> >>>>>>>>>>>>
> >>>>>>>
> ---------------------------------------------------------------------
> >>>>>>>>>>>> To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
> >>>>>>>>>>>> For additional commands, e-mail: users-help@wicket.apache.org
> >>>>>>>>>>>>
> >>>>>>>>>>>>
> >>>>>>>>>> --
> >>>>>>>>>> Best regards,
> >>>>>>>>>> Maxim
> >> ---------------------------------------------------------------------
> >>>>>>>> To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
> >>>>>>>> For additional commands, e-mail: users-help@wicket.apache.org
> >>>>>>>>
> >>>>>>>>
> >>>> ---------------------------------------------------------------------
> >>>> To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
> >>>> For additional commands, e-mail: users-help@wicket.apache.org
> >>>>
> >>>>
> >> ---------------------------------------------------------------------
> >> To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
> >> For additional commands, e-mail: users-help@wicket.apache.org
> >>
> >>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
> For additional commands, e-mail: users-help@wicket.apache.org
>
>

Re: Equivalent for PerSessionPageStore in Wicket 9

Posted by Sven Meier <sv...@meiers.net>.
Hi Thomas,

I've pushed a change for 
https://issues.apache.org/jira/browse/WICKET-6769 to master.

I'm not sure about the API right now, but it allows you to easily use 
any other map implementation.

Caffeine's Cache#asMap() should work fine with here, although I didn't 
test it myself.

Have fun
Sven


On 12.04.20 20:41, Thomas Heigl wrote:
> Hi Sven,
>
> I was thinking about this as well.
>
> SoftReferences worked well in my application. G1GC seems to start to evict
> them when -XX:InitiatingHeapOccupancyPercent is reached. In my case, when
> the heap is around 60% full.
> But as you said, there is no real control over which references are evicted
> and it is much harder to monitor the current state of the memory map.
>
> We are already using Caffeine extensively and your suggested solution would
> allow me much more control over the cache.
> We could still use SoftReferences with Caffeine if we wanted to in addition
> to setting a global limit on cache size and an eviction policy.
>
> To avoid calling an overridable method from the constructor you could add a
> Supplier<Map<String, MemoryData>> argument. I usually choose a
> supplier-based approach in such cases.
>
> Let's go for this solution!
>
> Best regards,
>
> Thomas
>
>
>
> On Sun, Apr 12, 2020 at 6:57 PM Sven Meier <sv...@meiers.net> wrote:
>
>> Hi Thomas,
>>
>> I've did a little research on using SoftReferences for caches:
>>
>> https://stackoverflow.com/questions/264582/is-there-a-softhashmap-in-java
>>
>> http://jeremymanson.blogspot.com/2009/07/how-hotspot-decides-to-clear_07.html
>>
>> The experts seem to agree that depending on the GC to clean up your
>> cache is a bad idea:
>>
>> - you can't control which elements in the cache are evicted first
>> - eviction happens only when the system is low on memory
>>
>> Best option would be using Guava's CacheBuilder:
>>
>>     https://github.com/google/guava/wiki/CachesExplained
>>
>> IMHO these are very special solutions and we don't actually need to
>> integrate one of them into Wicket.
>> Instead we can leave that decision to your application, by adding an
>> overridable method to InMemoryPageStore:
>>
>>       /**
>>        * Create a map to hold memory data for all sessions.
>>        *
>>        * @return a {@link ConcurrentHashMap} by default
>>        */
>>       protected Map<String, MemoryData> newMemoryMap()
>>       {
>>           return new ConcurrentHashMap<>();
>>       }
>>
>> (Yes, it would be called from the constructor which is a bad practice by
>> itself, but this is the simplest solution.)
>>
>> What do you think?
>>
>> Sven
>>
>>
>> On 12.04.20 10:34, Thomas Heigl wrote:
>>> 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 <sv...@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 <mg...@apache.org>
>>>>> wrote:
>>>>>
>>>>>> On Fri, Apr 10, 2020 at 4:01 PM Thomas Heigl <th...@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 <sv...@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 <
>> solomax666@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 <th...@umschalt.com>
>>>>>>> wrote:
>>>>>>>>>>> Hi Maxim,
>>>>>>>>>>>
>>>>>>>>>>> It works for me now!
>>>>>>>>>>>
>>>>>>>>>>> Thomas
>>>>>>>>>>>
>>>>>>>>>>> On Wed, Apr 8, 2020 at 9:17 AM Maxim Solodovnik <
>>>>>>> solomax666@gmail.com>
>>>>>>>>>>> wrote:
>>>>>>>>>>>
>>>>>>>>>>>> Thanks a million!
>>>>>>>>>>>>
>>>>>>>>>>>> On Wed, 8 Apr 2020 at 14:10, Thomas Heigl <th...@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 <
>>>>>>>> solomax666@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 <
>>>>>>> solomax666@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 <
>> thomas@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 <
>>>>>>>>>>>> solomax666@gmail.com>
>>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> I can pack another release
>>>>>>>>>>>>>>>>> later this week ...
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> On Wed, 8 Apr 2020 at 00:48, Thomas Heigl <
>>>>>> thomas@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 <
>> sven@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 <
>>>>>>>>>>>>>> thomas@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 <
>>>>>>>>>>>>>> thomas@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 <
>>>>>>>>>>>>>> thomas@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 <
>>>>>>>>>>>> sven@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 <
>>>>>>>>>>>>>>>>> thomas@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-unsubscribe@wicket.apache.org
>>>>>>>>>>>>>>>>>>>>>>>>> For additional commands, e-mail:
>>>>>>>>>>>>>> users-help@wicket.apache.org
>>>>>>> ---------------------------------------------------------------------
>>>>>>>>>>>>>>>>>>>>>>>> To unsubscribe, e-mail:
>>>>>>>>>>>>>> users-unsubscribe@wicket.apache.org
>>>>>>>>>>>>>>>>>>>>>>>> For additional commands, e-mail:
>>>>>>>>>>>>>> users-help@wicket.apache.org
>> ---------------------------------------------------------------------
>>>>>>>>>>>>>>>>>>> To unsubscribe, e-mail:
>>>>>> users-unsubscribe@wicket.apache.org
>>>>>>>>>>>>>>>>>>> For additional commands, e-mail:
>>>>>>>>>>>> users-help@wicket.apache.org
>>>>>>>>>>>>>>>>> --
>>>>>>>>>>>>>>>>> Best regards,
>>>>>>>>>>>>>>>>> Maxim
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>
>>>>>>> ---------------------------------------------------------------------
>>>>>>>>>>>>>>>>> To unsubscribe, e-mail:
>> users-unsubscribe@wicket.apache.org
>>>>>>>>>>>>>>>>> For additional commands, e-mail:
>>>>>> users-help@wicket.apache.org
>>>>>>>>>>>>>>> --
>>>>>>>>>>>>>>> Best regards,
>>>>>>>>>>>>>>> Maxim
>>>>>>>>>>>>>> --
>>>>>>>>>>>>>> Best regards,
>>>>>>>>>>>>>> Maxim
>>>>>>>>>>>>>>
>>>>>>>>>>>>>>
>> ---------------------------------------------------------------------
>>>>>>>>>>>>>> To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
>>>>>>>>>>>>>> For additional commands, e-mail: users-help@wicket.apache.org
>>>>>>>>>>>>>>
>>>>>>>>>>>>>>
>>>>>>>>>>>> --
>>>>>>>>>>>> Best regards,
>>>>>>>>>>>> Maxim
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>> ---------------------------------------------------------------------
>>>>>>>>>>>> To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
>>>>>>>>>>>> For additional commands, e-mail: users-help@wicket.apache.org
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>> --
>>>>>>>>>> Best regards,
>>>>>>>>>> Maxim
>> ---------------------------------------------------------------------
>>>>>>>> To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
>>>>>>>> For additional commands, e-mail: users-help@wicket.apache.org
>>>>>>>>
>>>>>>>>
>>>> ---------------------------------------------------------------------
>>>> To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
>>>> For additional commands, e-mail: users-help@wicket.apache.org
>>>>
>>>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
>> For additional commands, e-mail: users-help@wicket.apache.org
>>
>>

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
For additional commands, e-mail: users-help@wicket.apache.org


Re: Equivalent for PerSessionPageStore in Wicket 9

Posted by Thomas Heigl <th...@umschalt.com>.
Hi Sven,

I was thinking about this as well.

SoftReferences worked well in my application. G1GC seems to start to evict
them when -XX:InitiatingHeapOccupancyPercent is reached. In my case, when
the heap is around 60% full.
But as you said, there is no real control over which references are evicted
and it is much harder to monitor the current state of the memory map.

We are already using Caffeine extensively and your suggested solution would
allow me much more control over the cache.
We could still use SoftReferences with Caffeine if we wanted to in addition
to setting a global limit on cache size and an eviction policy.

To avoid calling an overridable method from the constructor you could add a
Supplier<Map<String, MemoryData>> argument. I usually choose a
supplier-based approach in such cases.

Let's go for this solution!

Best regards,

Thomas



On Sun, Apr 12, 2020 at 6:57 PM Sven Meier <sv...@meiers.net> wrote:

> Hi Thomas,
>
> I've did a little research on using SoftReferences for caches:
>
> https://stackoverflow.com/questions/264582/is-there-a-softhashmap-in-java
>
> http://jeremymanson.blogspot.com/2009/07/how-hotspot-decides-to-clear_07.html
>
> The experts seem to agree that depending on the GC to clean up your
> cache is a bad idea:
>
> - you can't control which elements in the cache are evicted first
> - eviction happens only when the system is low on memory
>
> Best option would be using Guava's CacheBuilder:
>
>    https://github.com/google/guava/wiki/CachesExplained
>
> IMHO these are very special solutions and we don't actually need to
> integrate one of them into Wicket.
> Instead we can leave that decision to your application, by adding an
> overridable method to InMemoryPageStore:
>
>      /**
>       * Create a map to hold memory data for all sessions.
>       *
>       * @return a {@link ConcurrentHashMap} by default
>       */
>      protected Map<String, MemoryData> newMemoryMap()
>      {
>          return new ConcurrentHashMap<>();
>      }
>
> (Yes, it would be called from the constructor which is a bad practice by
> itself, but this is the simplest solution.)
>
> What do you think?
>
> Sven
>
>
> On 12.04.20 10:34, Thomas Heigl wrote:
> > 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 <sv...@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 <mg...@apache.org>
> >>> wrote:
> >>>
> >>>> On Fri, Apr 10, 2020 at 4:01 PM Thomas Heigl <th...@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 <sv...@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 <
> solomax666@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 <th...@umschalt.com>
> >>>>> wrote:
> >>>>>>>>> Hi Maxim,
> >>>>>>>>>
> >>>>>>>>> It works for me now!
> >>>>>>>>>
> >>>>>>>>> Thomas
> >>>>>>>>>
> >>>>>>>>> On Wed, Apr 8, 2020 at 9:17 AM Maxim Solodovnik <
> >>>>> solomax666@gmail.com>
> >>>>>>>>> wrote:
> >>>>>>>>>
> >>>>>>>>>> Thanks a million!
> >>>>>>>>>>
> >>>>>>>>>> On Wed, 8 Apr 2020 at 14:10, Thomas Heigl <th...@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 <
> >>>>>> solomax666@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 <
> >>>>> solomax666@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 <
> thomas@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 <
> >>>>>>>>>> solomax666@gmail.com>
> >>>>>>>>>>>>>> wrote:
> >>>>>>>>>>>>>>
> >>>>>>>>>>>>>>> I can pack another release
> >>>>>>>>>>>>>>> later this week ...
> >>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>> On Wed, 8 Apr 2020 at 00:48, Thomas Heigl <
> >>>> thomas@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 <
> sven@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 <
> >>>>>>>>>>>> thomas@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 <
> >>>>>>>>>>>> thomas@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 <
> >>>>>>>>>>>> thomas@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 <
> >>>>>>>>>> sven@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 <
> >>>>>>>>>>>>>>> thomas@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-unsubscribe@wicket.apache.org
> >>>>>>>>>>>>>>>>>>>>>>> For additional commands, e-mail:
> >>>>>>>>>>>> users-help@wicket.apache.org
> >>>>> ---------------------------------------------------------------------
> >>>>>>>>>>>>>>>>>>>>>> To unsubscribe, e-mail:
> >>>>>>>>>>>> users-unsubscribe@wicket.apache.org
> >>>>>>>>>>>>>>>>>>>>>> For additional commands, e-mail:
> >>>>>>>>>>>> users-help@wicket.apache.org
> >>>>>>
> ---------------------------------------------------------------------
> >>>>>>>>>>>>>>>>> To unsubscribe, e-mail:
> >>>> users-unsubscribe@wicket.apache.org
> >>>>>>>>>>>>>>>>> For additional commands, e-mail:
> >>>>>>>>>> users-help@wicket.apache.org
> >>>>>>>>>>>>>>> --
> >>>>>>>>>>>>>>> Best regards,
> >>>>>>>>>>>>>>> Maxim
> >>>>>>>>>>>>>>>
> >>>>>>>>>>>>>>>
> >>>>> ---------------------------------------------------------------------
> >>>>>>>>>>>>>>> To unsubscribe, e-mail:
> users-unsubscribe@wicket.apache.org
> >>>>>>>>>>>>>>> For additional commands, e-mail:
> >>>> users-help@wicket.apache.org
> >>>>>>>>>>>>> --
> >>>>>>>>>>>>> Best regards,
> >>>>>>>>>>>>> Maxim
> >>>>>>>>>>>> --
> >>>>>>>>>>>> Best regards,
> >>>>>>>>>>>> Maxim
> >>>>>>>>>>>>
> >>>>>>>>>>>>
> >>>>>>
> ---------------------------------------------------------------------
> >>>>>>>>>>>> To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
> >>>>>>>>>>>> For additional commands, e-mail: users-help@wicket.apache.org
> >>>>>>>>>>>>
> >>>>>>>>>>>>
> >>>>>>>>>> --
> >>>>>>>>>> Best regards,
> >>>>>>>>>> Maxim
> >>>>>>>>>>
> >>>>>>>>>>
> >>>>> ---------------------------------------------------------------------
> >>>>>>>>>> To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
> >>>>>>>>>> For additional commands, e-mail: users-help@wicket.apache.org
> >>>>>>>>>>
> >>>>>>>>>>
> >>>>>>>> --
> >>>>>>>> Best regards,
> >>>>>>>> Maxim
> >>>>>>
> ---------------------------------------------------------------------
> >>>>>> To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
> >>>>>> For additional commands, e-mail: users-help@wicket.apache.org
> >>>>>>
> >>>>>>
> >> ---------------------------------------------------------------------
> >> To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
> >> For additional commands, e-mail: users-help@wicket.apache.org
> >>
> >>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
> For additional commands, e-mail: users-help@wicket.apache.org
>
>

Re: Equivalent for PerSessionPageStore in Wicket 9

Posted by Sven Meier <sv...@meiers.net>.
Hi Thomas,

I've did a little research on using SoftReferences for caches:

https://stackoverflow.com/questions/264582/is-there-a-softhashmap-in-java
http://jeremymanson.blogspot.com/2009/07/how-hotspot-decides-to-clear_07.html

The experts seem to agree that depending on the GC to clean up your 
cache is a bad idea:

- you can't control which elements in the cache are evicted first
- eviction happens only when the system is low on memory

Best option would be using Guava's CacheBuilder:

   https://github.com/google/guava/wiki/CachesExplained

IMHO these are very special solutions and we don't actually need to 
integrate one of them into Wicket.
Instead we can leave that decision to your application, by adding an 
overridable method to InMemoryPageStore:

     /**
      * Create a map to hold memory data for all sessions.
      *
      * @return a {@link ConcurrentHashMap} by default
      */
     protected Map<String, MemoryData> newMemoryMap()
     {
         return new ConcurrentHashMap<>();
     }

(Yes, it would be called from the constructor which is a bad practice by 
itself, but this is the simplest solution.)

What do you think?

Sven


On 12.04.20 10:34, Thomas Heigl wrote:
> 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 <sv...@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 <mg...@apache.org>
>>> wrote:
>>>
>>>> On Fri, Apr 10, 2020 at 4:01 PM Thomas Heigl <th...@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 <sv...@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 <so...@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 <th...@umschalt.com>
>>>>> wrote:
>>>>>>>>> Hi Maxim,
>>>>>>>>>
>>>>>>>>> It works for me now!
>>>>>>>>>
>>>>>>>>> Thomas
>>>>>>>>>
>>>>>>>>> On Wed, Apr 8, 2020 at 9:17 AM Maxim Solodovnik <
>>>>> solomax666@gmail.com>
>>>>>>>>> wrote:
>>>>>>>>>
>>>>>>>>>> Thanks a million!
>>>>>>>>>>
>>>>>>>>>> On Wed, 8 Apr 2020 at 14:10, Thomas Heigl <th...@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 <
>>>>>> solomax666@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 <
>>>>> solomax666@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 <thomas@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 <
>>>>>>>>>> solomax666@gmail.com>
>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> I can pack another release
>>>>>>>>>>>>>>> later this week ...
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> On Wed, 8 Apr 2020 at 00:48, Thomas Heigl <
>>>> thomas@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 <sv...@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 <
>>>>>>>>>>>> thomas@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 <
>>>>>>>>>>>> thomas@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 <
>>>>>>>>>>>> thomas@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 <
>>>>>>>>>> sven@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 <
>>>>>>>>>>>>>>> thomas@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-unsubscribe@wicket.apache.org
>>>>>>>>>>>>>>>>>>>>>>> For additional commands, e-mail:
>>>>>>>>>>>> users-help@wicket.apache.org
>>>>> ---------------------------------------------------------------------
>>>>>>>>>>>>>>>>>>>>>> To unsubscribe, e-mail:
>>>>>>>>>>>> users-unsubscribe@wicket.apache.org
>>>>>>>>>>>>>>>>>>>>>> For additional commands, e-mail:
>>>>>>>>>>>> users-help@wicket.apache.org
>>>>>> ---------------------------------------------------------------------
>>>>>>>>>>>>>>>>> To unsubscribe, e-mail:
>>>> users-unsubscribe@wicket.apache.org
>>>>>>>>>>>>>>>>> For additional commands, e-mail:
>>>>>>>>>> users-help@wicket.apache.org
>>>>>>>>>>>>>>> --
>>>>>>>>>>>>>>> Best regards,
>>>>>>>>>>>>>>> Maxim
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>
>>>>> ---------------------------------------------------------------------
>>>>>>>>>>>>>>> To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
>>>>>>>>>>>>>>> For additional commands, e-mail:
>>>> users-help@wicket.apache.org
>>>>>>>>>>>>> --
>>>>>>>>>>>>> Best regards,
>>>>>>>>>>>>> Maxim
>>>>>>>>>>>> --
>>>>>>>>>>>> Best regards,
>>>>>>>>>>>> Maxim
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>> ---------------------------------------------------------------------
>>>>>>>>>>>> To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
>>>>>>>>>>>> For additional commands, e-mail: users-help@wicket.apache.org
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>> --
>>>>>>>>>> Best regards,
>>>>>>>>>> Maxim
>>>>>>>>>>
>>>>>>>>>>
>>>>> ---------------------------------------------------------------------
>>>>>>>>>> To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
>>>>>>>>>> For additional commands, e-mail: users-help@wicket.apache.org
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>> --
>>>>>>>> Best regards,
>>>>>>>> Maxim
>>>>>> ---------------------------------------------------------------------
>>>>>> To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
>>>>>> For additional commands, e-mail: users-help@wicket.apache.org
>>>>>>
>>>>>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
>> For additional commands, e-mail: users-help@wicket.apache.org
>>
>>

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
For additional commands, e-mail: users-help@wicket.apache.org


Re: Equivalent for PerSessionPageStore in Wicket 9

Posted by Thomas Heigl <th...@umschalt.com>.
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 <sv...@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 <mg...@apache.org>
> > wrote:
> >
> >> On Fri, Apr 10, 2020 at 4:01 PM Thomas Heigl <th...@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 <sv...@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 <so...@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 <th...@umschalt.com>
> >>> wrote:
> >>>>>>> Hi Maxim,
> >>>>>>>
> >>>>>>> It works for me now!
> >>>>>>>
> >>>>>>> Thomas
> >>>>>>>
> >>>>>>> On Wed, Apr 8, 2020 at 9:17 AM Maxim Solodovnik <
> >>> solomax666@gmail.com>
> >>>>>>> wrote:
> >>>>>>>
> >>>>>>>> Thanks a million!
> >>>>>>>>
> >>>>>>>> On Wed, 8 Apr 2020 at 14:10, Thomas Heigl <th...@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 <
> >>>> solomax666@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 <
> >>> solomax666@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 <thomas@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 <
> >>>>>>>> solomax666@gmail.com>
> >>>>>>>>>>>> wrote:
> >>>>>>>>>>>>
> >>>>>>>>>>>>> I can pack another release
> >>>>>>>>>>>>> later this week ...
> >>>>>>>>>>>>>
> >>>>>>>>>>>>> On Wed, 8 Apr 2020 at 00:48, Thomas Heigl <
> >> thomas@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 <sv...@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 <
> >>>>>>>>>> thomas@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 <
> >>>>>>>>>> thomas@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 <
> >>>>>>>>>> thomas@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 <
> >>>>>>>> sven@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 <
> >>>>>>>>>>>>> thomas@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-unsubscribe@wicket.apache.org
> >>>>>>>>>>>>>>>>>>>>> For additional commands, e-mail:
> >>>>>>>>>> users-help@wicket.apache.org
> >>> ---------------------------------------------------------------------
> >>>>>>>>>>>>>>>>>>>> To unsubscribe, e-mail:
> >>>>>>>>>> users-unsubscribe@wicket.apache.org
> >>>>>>>>>>>>>>>>>>>> For additional commands, e-mail:
> >>>>>>>>>> users-help@wicket.apache.org
> >>>> ---------------------------------------------------------------------
> >>>>>>>>>>>>>>> To unsubscribe, e-mail:
> >> users-unsubscribe@wicket.apache.org
> >>>>>>>>>>>>>>> For additional commands, e-mail:
> >>>>>>>> users-help@wicket.apache.org
> >>>>>>>>>>>>>
> >>>>>>>>>>>>> --
> >>>>>>>>>>>>> Best regards,
> >>>>>>>>>>>>> Maxim
> >>>>>>>>>>>>>
> >>>>>>>>>>>>>
> >>> ---------------------------------------------------------------------
> >>>>>>>>>>>>> To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
> >>>>>>>>>>>>> For additional commands, e-mail:
> >> users-help@wicket.apache.org
> >>>>>>>>>>>>>
> >>>>>>>>>>>
> >>>>>>>>>>> --
> >>>>>>>>>>> Best regards,
> >>>>>>>>>>> Maxim
> >>>>>>>>>>
> >>>>>>>>>> --
> >>>>>>>>>> Best regards,
> >>>>>>>>>> Maxim
> >>>>>>>>>>
> >>>>>>>>>>
> >>>> ---------------------------------------------------------------------
> >>>>>>>>>> To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
> >>>>>>>>>> For additional commands, e-mail: users-help@wicket.apache.org
> >>>>>>>>>>
> >>>>>>>>>>
> >>>>>>>>
> >>>>>>>> --
> >>>>>>>> Best regards,
> >>>>>>>> Maxim
> >>>>>>>>
> >>>>>>>>
> >>> ---------------------------------------------------------------------
> >>>>>>>> To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
> >>>>>>>> For additional commands, e-mail: users-help@wicket.apache.org
> >>>>>>>>
> >>>>>>>>
> >>>>>>
> >>>>>> --
> >>>>>> Best regards,
> >>>>>> Maxim
> >>>>>
> >>>> ---------------------------------------------------------------------
> >>>> To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
> >>>> For additional commands, e-mail: users-help@wicket.apache.org
> >>>>
> >>>>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
> For additional commands, e-mail: users-help@wicket.apache.org
>
>

Re: Equivalent for PerSessionPageStore in Wicket 9

Posted by Sven Meier <sv...@meiers.net>.
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 <mg...@apache.org>
> wrote:
>
>> On Fri, Apr 10, 2020 at 4:01 PM Thomas Heigl <th...@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 <sv...@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 <so...@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 <th...@umschalt.com>
>>> wrote:
>>>>>>> Hi Maxim,
>>>>>>>
>>>>>>> It works for me now!
>>>>>>>
>>>>>>> Thomas
>>>>>>>
>>>>>>> On Wed, Apr 8, 2020 at 9:17 AM Maxim Solodovnik <
>>> solomax666@gmail.com>
>>>>>>> wrote:
>>>>>>>
>>>>>>>> Thanks a million!
>>>>>>>>
>>>>>>>> On Wed, 8 Apr 2020 at 14:10, Thomas Heigl <th...@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 <
>>>> solomax666@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 <
>>> solomax666@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 <thomas@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 <
>>>>>>>> solomax666@gmail.com>
>>>>>>>>>>>> wrote:
>>>>>>>>>>>>
>>>>>>>>>>>>> I can pack another release
>>>>>>>>>>>>> later this week ...
>>>>>>>>>>>>>
>>>>>>>>>>>>> On Wed, 8 Apr 2020 at 00:48, Thomas Heigl <
>> thomas@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 <sv...@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 <
>>>>>>>>>> thomas@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 <
>>>>>>>>>> thomas@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 <
>>>>>>>>>> thomas@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 <
>>>>>>>> sven@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 <
>>>>>>>>>>>>> thomas@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-unsubscribe@wicket.apache.org
>>>>>>>>>>>>>>>>>>>>> For additional commands, e-mail:
>>>>>>>>>> users-help@wicket.apache.org
>>> ---------------------------------------------------------------------
>>>>>>>>>>>>>>>>>>>> To unsubscribe, e-mail:
>>>>>>>>>> users-unsubscribe@wicket.apache.org
>>>>>>>>>>>>>>>>>>>> For additional commands, e-mail:
>>>>>>>>>> users-help@wicket.apache.org
>>>> ---------------------------------------------------------------------
>>>>>>>>>>>>>>> To unsubscribe, e-mail:
>> users-unsubscribe@wicket.apache.org
>>>>>>>>>>>>>>> For additional commands, e-mail:
>>>>>>>> users-help@wicket.apache.org
>>>>>>>>>>>>>
>>>>>>>>>>>>> --
>>>>>>>>>>>>> Best regards,
>>>>>>>>>>>>> Maxim
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>> ---------------------------------------------------------------------
>>>>>>>>>>>>> To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
>>>>>>>>>>>>> For additional commands, e-mail:
>> users-help@wicket.apache.org
>>>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> --
>>>>>>>>>>> Best regards,
>>>>>>>>>>> Maxim
>>>>>>>>>>
>>>>>>>>>> --
>>>>>>>>>> Best regards,
>>>>>>>>>> Maxim
>>>>>>>>>>
>>>>>>>>>>
>>>> ---------------------------------------------------------------------
>>>>>>>>>> To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
>>>>>>>>>> For additional commands, e-mail: users-help@wicket.apache.org
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>
>>>>>>>> --
>>>>>>>> Best regards,
>>>>>>>> Maxim
>>>>>>>>
>>>>>>>>
>>> ---------------------------------------------------------------------
>>>>>>>> To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
>>>>>>>> For additional commands, e-mail: users-help@wicket.apache.org
>>>>>>>>
>>>>>>>>
>>>>>>
>>>>>> --
>>>>>> Best regards,
>>>>>> Maxim
>>>>>
>>>> ---------------------------------------------------------------------
>>>> To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
>>>> For additional commands, e-mail: users-help@wicket.apache.org
>>>>
>>>>

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
For additional commands, e-mail: users-help@wicket.apache.org


Re: Equivalent for PerSessionPageStore in Wicket 9

Posted by Thomas Heigl <th...@umschalt.com>.
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 <mg...@apache.org>
wrote:

> On Fri, Apr 10, 2020 at 4:01 PM Thomas Heigl <th...@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 <sv...@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 <so...@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 <th...@umschalt.com>
> > wrote:
> > > >>> Hi Maxim,
> > > >>>
> > > >>> It works for me now!
> > > >>>
> > > >>> Thomas
> > > >>>
> > > >>> On Wed, Apr 8, 2020 at 9:17 AM Maxim Solodovnik <
> > solomax666@gmail.com>
> > > >>> wrote:
> > > >>>
> > > >>>> Thanks a million!
> > > >>>>
> > > >>>> On Wed, 8 Apr 2020 at 14:10, Thomas Heigl <th...@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 <
> > > solomax666@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 <
> > solomax666@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 <thomas@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 <
> > > >>>> solomax666@gmail.com>
> > > >>>>>>>> wrote:
> > > >>>>>>>>
> > > >>>>>>>>> I can pack another release
> > > >>>>>>>>> later this week ...
> > > >>>>>>>>>
> > > >>>>>>>>> On Wed, 8 Apr 2020 at 00:48, Thomas Heigl <
> thomas@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 <sv...@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 <
> > > >>>>>> thomas@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 <
> > > >>>>>> thomas@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 <
> > > >>>>>> thomas@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 <
> > > >>>> sven@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 <
> > > >>>>>>>>> thomas@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-unsubscribe@wicket.apache.org
> > > >>>>>>>>>>>>>>>>> For additional commands, e-mail:
> > > >>>>>> users-help@wicket.apache.org
> > > >>>>
> > ---------------------------------------------------------------------
> > > >>>>>>>>>>>>>>>> To unsubscribe, e-mail:
> > > >>>>>> users-unsubscribe@wicket.apache.org
> > > >>>>>>>>>>>>>>>> For additional commands, e-mail:
> > > >>>>>> users-help@wicket.apache.org
> > > >>>>>>>>>>>>>>>>
> > > >>>>>>>>>>>
> > > >>>>>>
> > > ---------------------------------------------------------------------
> > > >>>>>>>>>>> To unsubscribe, e-mail:
> users-unsubscribe@wicket.apache.org
> > > >>>>>>>>>>> For additional commands, e-mail:
> > > >>>> users-help@wicket.apache.org
> > > >>>>>>>>>>>
> > > >>>>>>>>>
> > > >>>>>>>>>
> > > >>>>>>>>> --
> > > >>>>>>>>> Best regards,
> > > >>>>>>>>> Maxim
> > > >>>>>>>>>
> > > >>>>>>>>>
> > > >>>>
> > ---------------------------------------------------------------------
> > > >>>>>>>>> To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
> > > >>>>>>>>> For additional commands, e-mail:
> users-help@wicket.apache.org
> > > >>>>>>>>>
> > > >>>>>>>>>
> > > >>>>>>>
> > > >>>>>>>
> > > >>>>>>> --
> > > >>>>>>> Best regards,
> > > >>>>>>> Maxim
> > > >>>>>>
> > > >>>>>>
> > > >>>>>> --
> > > >>>>>> Best regards,
> > > >>>>>> Maxim
> > > >>>>>>
> > > >>>>>>
> > > ---------------------------------------------------------------------
> > > >>>>>> To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
> > > >>>>>> For additional commands, e-mail: users-help@wicket.apache.org
> > > >>>>>>
> > > >>>>>>
> > > >>>>
> > > >>>>
> > > >>>> --
> > > >>>> Best regards,
> > > >>>> Maxim
> > > >>>>
> > > >>>>
> > ---------------------------------------------------------------------
> > > >>>> To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
> > > >>>> For additional commands, e-mail: users-help@wicket.apache.org
> > > >>>>
> > > >>>>
> > > >>
> > > >>
> > > >> --
> > > >> Best regards,
> > > >> Maxim
> > > >
> > > >
> > >
> > > ---------------------------------------------------------------------
> > > To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
> > > For additional commands, e-mail: users-help@wicket.apache.org
> > >
> > >
> >
>

Re: Equivalent for PerSessionPageStore in Wicket 9

Posted by Martin Grigorov <mg...@apache.org>.
On Fri, Apr 10, 2020 at 4:01 PM Thomas Heigl <th...@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 <sv...@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 <so...@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 <th...@umschalt.com>
> wrote:
> > >>> Hi Maxim,
> > >>>
> > >>> It works for me now!
> > >>>
> > >>> Thomas
> > >>>
> > >>> On Wed, Apr 8, 2020 at 9:17 AM Maxim Solodovnik <
> solomax666@gmail.com>
> > >>> wrote:
> > >>>
> > >>>> Thanks a million!
> > >>>>
> > >>>> On Wed, 8 Apr 2020 at 14:10, Thomas Heigl <th...@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 <
> > solomax666@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 <
> solomax666@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 <th...@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 <
> > >>>> solomax666@gmail.com>
> > >>>>>>>> wrote:
> > >>>>>>>>
> > >>>>>>>>> I can pack another release
> > >>>>>>>>> later this week ...
> > >>>>>>>>>
> > >>>>>>>>> On Wed, 8 Apr 2020 at 00:48, Thomas Heigl <thomas@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 <sv...@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 <
> > >>>>>> thomas@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 <
> > >>>>>> thomas@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 <
> > >>>>>> thomas@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 <
> > >>>> sven@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 <
> > >>>>>>>>> thomas@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-unsubscribe@wicket.apache.org
> > >>>>>>>>>>>>>>>>> For additional commands, e-mail:
> > >>>>>> users-help@wicket.apache.org
> > >>>>
> ---------------------------------------------------------------------
> > >>>>>>>>>>>>>>>> To unsubscribe, e-mail:
> > >>>>>> users-unsubscribe@wicket.apache.org
> > >>>>>>>>>>>>>>>> For additional commands, e-mail:
> > >>>>>> users-help@wicket.apache.org
> > >>>>>>>>>>>>>>>>
> > >>>>>>>>>>>
> > >>>>>>
> > ---------------------------------------------------------------------
> > >>>>>>>>>>> To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
> > >>>>>>>>>>> For additional commands, e-mail:
> > >>>> users-help@wicket.apache.org
> > >>>>>>>>>>>
> > >>>>>>>>>
> > >>>>>>>>>
> > >>>>>>>>> --
> > >>>>>>>>> Best regards,
> > >>>>>>>>> Maxim
> > >>>>>>>>>
> > >>>>>>>>>
> > >>>>
> ---------------------------------------------------------------------
> > >>>>>>>>> To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
> > >>>>>>>>> For additional commands, e-mail: users-help@wicket.apache.org
> > >>>>>>>>>
> > >>>>>>>>>
> > >>>>>>>
> > >>>>>>>
> > >>>>>>> --
> > >>>>>>> Best regards,
> > >>>>>>> Maxim
> > >>>>>>
> > >>>>>>
> > >>>>>> --
> > >>>>>> Best regards,
> > >>>>>> Maxim
> > >>>>>>
> > >>>>>>
> > ---------------------------------------------------------------------
> > >>>>>> To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
> > >>>>>> For additional commands, e-mail: users-help@wicket.apache.org
> > >>>>>>
> > >>>>>>
> > >>>>
> > >>>>
> > >>>> --
> > >>>> Best regards,
> > >>>> Maxim
> > >>>>
> > >>>>
> ---------------------------------------------------------------------
> > >>>> To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
> > >>>> For additional commands, e-mail: users-help@wicket.apache.org
> > >>>>
> > >>>>
> > >>
> > >>
> > >> --
> > >> Best regards,
> > >> Maxim
> > >
> > >
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
> > For additional commands, e-mail: users-help@wicket.apache.org
> >
> >
>

Re: Equivalent for PerSessionPageStore in Wicket 9

Posted by Thomas Heigl <th...@umschalt.com>.
FYI: I deployed Wicket 9.0.0-M5 to production an hour ago. 100k requests
served and no issues so far.

Great work!

Thomas

On Wed, Apr 8, 2020 at 3:13 PM Sven Meier <sv...@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 <so...@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 <th...@umschalt.com> wrote:
> >>> Hi Maxim,
> >>>
> >>> It works for me now!
> >>>
> >>> Thomas
> >>>
> >>> On Wed, Apr 8, 2020 at 9:17 AM Maxim Solodovnik <so...@gmail.com>
> >>> wrote:
> >>>
> >>>> Thanks a million!
> >>>>
> >>>> On Wed, 8 Apr 2020 at 14:10, Thomas Heigl <th...@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 <
> solomax666@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 <solomax666@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 <th...@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 <
> >>>> solomax666@gmail.com>
> >>>>>>>> wrote:
> >>>>>>>>
> >>>>>>>>> I can pack another release
> >>>>>>>>> later this week ...
> >>>>>>>>>
> >>>>>>>>> On Wed, 8 Apr 2020 at 00:48, Thomas Heigl <th...@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 <sv...@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 <
> >>>>>> thomas@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 <
> >>>>>> thomas@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 <
> >>>>>> thomas@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 <
> >>>> sven@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 <
> >>>>>>>>> thomas@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-unsubscribe@wicket.apache.org
> >>>>>>>>>>>>>>>>> For additional commands, e-mail:
> >>>>>> users-help@wicket.apache.org
> >>>> ---------------------------------------------------------------------
> >>>>>>>>>>>>>>>> To unsubscribe, e-mail:
> >>>>>> users-unsubscribe@wicket.apache.org
> >>>>>>>>>>>>>>>> For additional commands, e-mail:
> >>>>>> users-help@wicket.apache.org
> >>>>>>>>>>>>>>>>
> >>>>>>>>>>>
> >>>>>>
> ---------------------------------------------------------------------
> >>>>>>>>>>> To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
> >>>>>>>>>>> For additional commands, e-mail:
> >>>> users-help@wicket.apache.org
> >>>>>>>>>>>
> >>>>>>>>>
> >>>>>>>>>
> >>>>>>>>> --
> >>>>>>>>> Best regards,
> >>>>>>>>> Maxim
> >>>>>>>>>
> >>>>>>>>>
> >>>> ---------------------------------------------------------------------
> >>>>>>>>> To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
> >>>>>>>>> For additional commands, e-mail: users-help@wicket.apache.org
> >>>>>>>>>
> >>>>>>>>>
> >>>>>>>
> >>>>>>>
> >>>>>>> --
> >>>>>>> Best regards,
> >>>>>>> Maxim
> >>>>>>
> >>>>>>
> >>>>>> --
> >>>>>> Best regards,
> >>>>>> Maxim
> >>>>>>
> >>>>>>
> ---------------------------------------------------------------------
> >>>>>> To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
> >>>>>> For additional commands, e-mail: users-help@wicket.apache.org
> >>>>>>
> >>>>>>
> >>>>
> >>>>
> >>>> --
> >>>> Best regards,
> >>>> Maxim
> >>>>
> >>>> ---------------------------------------------------------------------
> >>>> To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
> >>>> For additional commands, e-mail: users-help@wicket.apache.org
> >>>>
> >>>>
> >>
> >>
> >> --
> >> Best regards,
> >> Maxim
> >
> >
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
> For additional commands, e-mail: users-help@wicket.apache.org
>
>

Re: Equivalent for PerSessionPageStore in Wicket 9

Posted by Sven Meier <sv...@meiers.net>.
Many thanks Maxim!

Sven

On 08.04.20 14:29, Maxim Solodovnik wrote:
> Released :)
>
> On Wed, 8 Apr 2020 at 15:41, Maxim Solodovnik <so...@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 <th...@umschalt.com> wrote:
>>> Hi Maxim,
>>>
>>> It works for me now!
>>>
>>> Thomas
>>>
>>> On Wed, Apr 8, 2020 at 9:17 AM Maxim Solodovnik <so...@gmail.com>
>>> wrote:
>>>
>>>> Thanks a million!
>>>>
>>>> On Wed, 8 Apr 2020 at 14:10, Thomas Heigl <th...@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 <so...@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 <so...@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 <th...@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 <
>>>> solomax666@gmail.com>
>>>>>>>> wrote:
>>>>>>>>
>>>>>>>>> I can pack another release
>>>>>>>>> later this week ...
>>>>>>>>>
>>>>>>>>> On Wed, 8 Apr 2020 at 00:48, Thomas Heigl <th...@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 <sv...@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 <
>>>>>> thomas@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 <
>>>>>> thomas@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 <
>>>>>> thomas@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 <
>>>> sven@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 <
>>>>>>>>> thomas@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-unsubscribe@wicket.apache.org
>>>>>>>>>>>>>>>>> For additional commands, e-mail:
>>>>>> users-help@wicket.apache.org
>>>> ---------------------------------------------------------------------
>>>>>>>>>>>>>>>> To unsubscribe, e-mail:
>>>>>> users-unsubscribe@wicket.apache.org
>>>>>>>>>>>>>>>> For additional commands, e-mail:
>>>>>> users-help@wicket.apache.org
>>>>>>>>>>>>>>>>
>>>>>>>>>>>
>>>>>> ---------------------------------------------------------------------
>>>>>>>>>>> To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
>>>>>>>>>>> For additional commands, e-mail:
>>>> users-help@wicket.apache.org
>>>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> --
>>>>>>>>> Best regards,
>>>>>>>>> Maxim
>>>>>>>>>
>>>>>>>>>
>>>> ---------------------------------------------------------------------
>>>>>>>>> To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
>>>>>>>>> For additional commands, e-mail: users-help@wicket.apache.org
>>>>>>>>>
>>>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> --
>>>>>>> Best regards,
>>>>>>> Maxim
>>>>>>
>>>>>>
>>>>>> --
>>>>>> Best regards,
>>>>>> Maxim
>>>>>>
>>>>>> ---------------------------------------------------------------------
>>>>>> To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
>>>>>> For additional commands, e-mail: users-help@wicket.apache.org
>>>>>>
>>>>>>
>>>>
>>>>
>>>> --
>>>> Best regards,
>>>> Maxim
>>>>
>>>> ---------------------------------------------------------------------
>>>> To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
>>>> For additional commands, e-mail: users-help@wicket.apache.org
>>>>
>>>>
>>
>>
>> --
>> Best regards,
>> Maxim
>
>

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
For additional commands, e-mail: users-help@wicket.apache.org


Re: Equivalent for PerSessionPageStore in Wicket 9

Posted by Maxim Solodovnik <so...@gmail.com>.
Released :)

On Wed, 8 Apr 2020 at 15:41, Maxim Solodovnik <so...@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 <th...@umschalt.com> wrote:
>>
>> Hi Maxim,
>>
>> It works for me now!
>>
>> Thomas
>>
>> On Wed, Apr 8, 2020 at 9:17 AM Maxim Solodovnik <so...@gmail.com>
>> wrote:
>>
>> > Thanks a million!
>> >
>> > On Wed, 8 Apr 2020 at 14:10, Thomas Heigl <th...@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 <so...@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 <so...@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 <th...@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 <
>> > solomax666@gmail.com>
>> > > > > > wrote:
>> > > > > >
>> > > > > > > I can pack another release
>> > > > > > > later this week ...
>> > > > > > >
>> > > > > > > On Wed, 8 Apr 2020 at 00:48, Thomas Heigl <th...@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 <sv...@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 <
>> > > > thomas@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 <
>> > > > thomas@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 <
>> > > > thomas@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 <
>> > sven@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 <
>> > > > > > > thomas@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-unsubscribe@wicket.apache.org
>> > > > > > > > > >>>>>> For additional commands, e-mail:
>> > > > users-help@wicket.apache.org
>> > > > > > > > > >>>>>>
>> > > > > > > > > >>>>>
>> > > > > > >
>> > ---------------------------------------------------------------------
>> > > > > > > > > >>>>> To unsubscribe, e-mail:
>> > > > users-unsubscribe@wicket.apache.org
>> > > > > > > > > >>>>> For additional commands, e-mail:
>> > > > users-help@wicket.apache.org
>> > > > > > > > > >>>>>
>> > > > > > > > > >>>>>
>> > > > > > > > >
>> > > > > > > > >
>> > > > ---------------------------------------------------------------------
>> > > > > > > > > To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
>> > > > > > > > > For additional commands, e-mail:
>> > users-help@wicket.apache.org
>> > > > > > > > >
>> > > > > > > > >
>> > > > > > >
>> > > > > > >
>> > > > > > >
>> > > > > > > --
>> > > > > > > Best regards,
>> > > > > > > Maxim
>> > > > > > >
>> > > > > > >
>> > ---------------------------------------------------------------------
>> > > > > > > To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
>> > > > > > > For additional commands, e-mail: users-help@wicket.apache.org
>> > > > > > >
>> > > > > > >
>> > > > >
>> > > > >
>> > > > >
>> > > > > --
>> > > > > Best regards,
>> > > > > Maxim
>> > > >
>> > > >
>> > > >
>> > > > --
>> > > > Best regards,
>> > > > Maxim
>> > > >
>> > > > ---------------------------------------------------------------------
>> > > > To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
>> > > > For additional commands, e-mail: users-help@wicket.apache.org
>> > > >
>> > > >
>> >
>> >
>> >
>> > --
>> > Best regards,
>> > Maxim
>> >
>> > ---------------------------------------------------------------------
>> > To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
>> > For additional commands, e-mail: users-help@wicket.apache.org
>> >
>> >
>
>
>
> --
> Best regards,
> Maxim



-- 
Best regards,
Maxim

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
For additional commands, e-mail: users-help@wicket.apache.org


Re: Equivalent for PerSessionPageStore in Wicket 9

Posted by Maxim Solodovnik <so...@gmail.com>.
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 <th...@umschalt.com> wrote:

> Hi Maxim,
>
> It works for me now!
>
> Thomas
>
> On Wed, Apr 8, 2020 at 9:17 AM Maxim Solodovnik <so...@gmail.com>
> wrote:
>
> > Thanks a million!
> >
> > On Wed, 8 Apr 2020 at 14:10, Thomas Heigl <th...@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 <so...@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 <so...@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 <th...@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 <
> > solomax666@gmail.com>
> > > > > > wrote:
> > > > > >
> > > > > > > I can pack another release
> > > > > > > later this week ...
> > > > > > >
> > > > > > > On Wed, 8 Apr 2020 at 00:48, Thomas Heigl <thomas@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 <sv...@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 <
> > > > thomas@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 <
> > > > thomas@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 <
> > > > thomas@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 <
> > sven@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 <
> > > > > > > thomas@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-unsubscribe@wicket.apache.org
> > > > > > > > > >>>>>> For additional commands, e-mail:
> > > > users-help@wicket.apache.org
> > > > > > > > > >>>>>>
> > > > > > > > > >>>>>
> > > > > > >
> > ---------------------------------------------------------------------
> > > > > > > > > >>>>> To unsubscribe, e-mail:
> > > > users-unsubscribe@wicket.apache.org
> > > > > > > > > >>>>> For additional commands, e-mail:
> > > > users-help@wicket.apache.org
> > > > > > > > > >>>>>
> > > > > > > > > >>>>>
> > > > > > > > >
> > > > > > > > >
> > > > ---------------------------------------------------------------------
> > > > > > > > > To unsubscribe, e-mail:
> users-unsubscribe@wicket.apache.org
> > > > > > > > > For additional commands, e-mail:
> > users-help@wicket.apache.org
> > > > > > > > >
> > > > > > > > >
> > > > > > >
> > > > > > >
> > > > > > >
> > > > > > > --
> > > > > > > Best regards,
> > > > > > > Maxim
> > > > > > >
> > > > > > >
> > ---------------------------------------------------------------------
> > > > > > > To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
> > > > > > > For additional commands, e-mail: users-help@wicket.apache.org
> > > > > > >
> > > > > > >
> > > > >
> > > > >
> > > > >
> > > > > --
> > > > > Best regards,
> > > > > Maxim
> > > >
> > > >
> > > >
> > > > --
> > > > Best regards,
> > > > Maxim
> > > >
> > > > ---------------------------------------------------------------------
> > > > To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
> > > > For additional commands, e-mail: users-help@wicket.apache.org
> > > >
> > > >
> >
> >
> >
> > --
> > Best regards,
> > Maxim
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
> > For additional commands, e-mail: users-help@wicket.apache.org
> >
> >
>


-- 
Best regards,
Maxim

Re: Equivalent for PerSessionPageStore in Wicket 9

Posted by Thomas Heigl <th...@umschalt.com>.
Hi Maxim,

It works for me now!

Thomas

On Wed, Apr 8, 2020 at 9:17 AM Maxim Solodovnik <so...@gmail.com>
wrote:

> Thanks a million!
>
> On Wed, 8 Apr 2020 at 14:10, Thomas Heigl <th...@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 <so...@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 <so...@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 <th...@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 <
> solomax666@gmail.com>
> > > > > wrote:
> > > > >
> > > > > > I can pack another release
> > > > > > later this week ...
> > > > > >
> > > > > > On Wed, 8 Apr 2020 at 00:48, Thomas Heigl <th...@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 <sv...@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 <
> > > thomas@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 <
> > > thomas@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 <
> > > thomas@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 <
> sven@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 <
> > > > > > thomas@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-unsubscribe@wicket.apache.org
> > > > > > > > >>>>>> For additional commands, e-mail:
> > > users-help@wicket.apache.org
> > > > > > > > >>>>>>
> > > > > > > > >>>>>
> > > > > >
> ---------------------------------------------------------------------
> > > > > > > > >>>>> To unsubscribe, e-mail:
> > > users-unsubscribe@wicket.apache.org
> > > > > > > > >>>>> For additional commands, e-mail:
> > > users-help@wicket.apache.org
> > > > > > > > >>>>>
> > > > > > > > >>>>>
> > > > > > > >
> > > > > > > >
> > > ---------------------------------------------------------------------
> > > > > > > > To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
> > > > > > > > For additional commands, e-mail:
> users-help@wicket.apache.org
> > > > > > > >
> > > > > > > >
> > > > > >
> > > > > >
> > > > > >
> > > > > > --
> > > > > > Best regards,
> > > > > > Maxim
> > > > > >
> > > > > >
> ---------------------------------------------------------------------
> > > > > > To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
> > > > > > For additional commands, e-mail: users-help@wicket.apache.org
> > > > > >
> > > > > >
> > > >
> > > >
> > > >
> > > > --
> > > > Best regards,
> > > > Maxim
> > >
> > >
> > >
> > > --
> > > Best regards,
> > > Maxim
> > >
> > > ---------------------------------------------------------------------
> > > To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
> > > For additional commands, e-mail: users-help@wicket.apache.org
> > >
> > >
>
>
>
> --
> Best regards,
> Maxim
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
> For additional commands, e-mail: users-help@wicket.apache.org
>
>

Re: Equivalent for PerSessionPageStore in Wicket 9

Posted by Maxim Solodovnik <so...@gmail.com>.
Thanks a million!

On Wed, 8 Apr 2020 at 14:10, Thomas Heigl <th...@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 <so...@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 <so...@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 <th...@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 <so...@gmail.com>
> > > > wrote:
> > > >
> > > > > I can pack another release
> > > > > later this week ...
> > > > >
> > > > > On Wed, 8 Apr 2020 at 00:48, Thomas Heigl <th...@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 <sv...@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 <
> > thomas@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 <
> > thomas@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 <
> > thomas@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 <sven@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 <
> > > > > thomas@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-unsubscribe@wicket.apache.org
> > > > > > > >>>>>> For additional commands, e-mail:
> > users-help@wicket.apache.org
> > > > > > > >>>>>>
> > > > > > > >>>>>
> > > > > ---------------------------------------------------------------------
> > > > > > > >>>>> To unsubscribe, e-mail:
> > users-unsubscribe@wicket.apache.org
> > > > > > > >>>>> For additional commands, e-mail:
> > users-help@wicket.apache.org
> > > > > > > >>>>>
> > > > > > > >>>>>
> > > > > > >
> > > > > > >
> > ---------------------------------------------------------------------
> > > > > > > To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
> > > > > > > For additional commands, e-mail: users-help@wicket.apache.org
> > > > > > >
> > > > > > >
> > > > >
> > > > >
> > > > >
> > > > > --
> > > > > Best regards,
> > > > > Maxim
> > > > >
> > > > > ---------------------------------------------------------------------
> > > > > To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
> > > > > For additional commands, e-mail: users-help@wicket.apache.org
> > > > >
> > > > >
> > >
> > >
> > >
> > > --
> > > Best regards,
> > > Maxim
> >
> >
> >
> > --
> > Best regards,
> > Maxim
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
> > For additional commands, e-mail: users-help@wicket.apache.org
> >
> >



-- 
Best regards,
Maxim

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
For additional commands, e-mail: users-help@wicket.apache.org


Re: Equivalent for PerSessionPageStore in Wicket 9

Posted by Thomas Heigl <th...@umschalt.com>.
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 <so...@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 <so...@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 <th...@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 <so...@gmail.com>
> > > wrote:
> > >
> > > > I can pack another release
> > > > later this week ...
> > > >
> > > > On Wed, 8 Apr 2020 at 00:48, Thomas Heigl <th...@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 <sv...@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 <
> thomas@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 <
> thomas@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 <
> thomas@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 <sven@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 <
> > > > thomas@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-unsubscribe@wicket.apache.org
> > > > > > >>>>>> For additional commands, e-mail:
> users-help@wicket.apache.org
> > > > > > >>>>>>
> > > > > > >>>>>
> > > > ---------------------------------------------------------------------
> > > > > > >>>>> To unsubscribe, e-mail:
> users-unsubscribe@wicket.apache.org
> > > > > > >>>>> For additional commands, e-mail:
> users-help@wicket.apache.org
> > > > > > >>>>>
> > > > > > >>>>>
> > > > > >
> > > > > >
> ---------------------------------------------------------------------
> > > > > > To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
> > > > > > For additional commands, e-mail: users-help@wicket.apache.org
> > > > > >
> > > > > >
> > > >
> > > >
> > > >
> > > > --
> > > > Best regards,
> > > > Maxim
> > > >
> > > > ---------------------------------------------------------------------
> > > > To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
> > > > For additional commands, e-mail: users-help@wicket.apache.org
> > > >
> > > >
> >
> >
> >
> > --
> > Best regards,
> > Maxim
>
>
>
> --
> Best regards,
> Maxim
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
> For additional commands, e-mail: users-help@wicket.apache.org
>
>

Re: Equivalent for PerSessionPageStore in Wicket 9

Posted by Maxim Solodovnik <so...@gmail.com>.
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 <so...@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 <th...@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 <so...@gmail.com>
> > wrote:
> >
> > > I can pack another release
> > > later this week ...
> > >
> > > On Wed, 8 Apr 2020 at 00:48, Thomas Heigl <th...@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 <sv...@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 <th...@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 <th...@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 <thomas@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 <sv...@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 <
> > > thomas@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-unsubscribe@wicket.apache.org
> > > > > >>>>>> For additional commands, e-mail: users-help@wicket.apache.org
> > > > > >>>>>>
> > > > > >>>>>
> > > ---------------------------------------------------------------------
> > > > > >>>>> To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
> > > > > >>>>> For additional commands, e-mail: users-help@wicket.apache.org
> > > > > >>>>>
> > > > > >>>>>
> > > > >
> > > > > ---------------------------------------------------------------------
> > > > > To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
> > > > > For additional commands, e-mail: users-help@wicket.apache.org
> > > > >
> > > > >
> > >
> > >
> > >
> > > --
> > > Best regards,
> > > Maxim
> > >
> > > ---------------------------------------------------------------------
> > > To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
> > > For additional commands, e-mail: users-help@wicket.apache.org
> > >
> > >
>
>
>
> --
> Best regards,
> Maxim



-- 
Best regards,
Maxim

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
For additional commands, e-mail: users-help@wicket.apache.org


Re: Equivalent for PerSessionPageStore in Wicket 9

Posted by Maxim Solodovnik <so...@gmail.com>.
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 <th...@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 <so...@gmail.com>
> wrote:
>
> > I can pack another release
> > later this week ...
> >
> > On Wed, 8 Apr 2020 at 00:48, Thomas Heigl <th...@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 <sv...@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 <th...@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 <th...@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 <thomas@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 <sv...@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 <
> > thomas@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-unsubscribe@wicket.apache.org
> > > > >>>>>> For additional commands, e-mail: users-help@wicket.apache.org
> > > > >>>>>>
> > > > >>>>>
> > ---------------------------------------------------------------------
> > > > >>>>> To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
> > > > >>>>> For additional commands, e-mail: users-help@wicket.apache.org
> > > > >>>>>
> > > > >>>>>
> > > >
> > > > ---------------------------------------------------------------------
> > > > To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
> > > > For additional commands, e-mail: users-help@wicket.apache.org
> > > >
> > > >
> >
> >
> >
> > --
> > Best regards,
> > Maxim
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
> > For additional commands, e-mail: users-help@wicket.apache.org
> >
> >



-- 
Best regards,
Maxim

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
For additional commands, e-mail: users-help@wicket.apache.org


Re: Equivalent for PerSessionPageStore in Wicket 9

Posted by Thomas Heigl <th...@umschalt.com>.
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 <so...@gmail.com>
wrote:

> I can pack another release
> later this week ...
>
> On Wed, 8 Apr 2020 at 00:48, Thomas Heigl <th...@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 <sv...@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 <th...@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 <th...@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 <thomas@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 <sv...@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 <
> thomas@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-unsubscribe@wicket.apache.org
> > > >>>>>> For additional commands, e-mail: users-help@wicket.apache.org
> > > >>>>>>
> > > >>>>>
> ---------------------------------------------------------------------
> > > >>>>> To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
> > > >>>>> For additional commands, e-mail: users-help@wicket.apache.org
> > > >>>>>
> > > >>>>>
> > >
> > > ---------------------------------------------------------------------
> > > To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
> > > For additional commands, e-mail: users-help@wicket.apache.org
> > >
> > >
>
>
>
> --
> Best regards,
> Maxim
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
> For additional commands, e-mail: users-help@wicket.apache.org
>
>

Re: Equivalent for PerSessionPageStore in Wicket 9

Posted by Maxim Solodovnik <so...@gmail.com>.
I can pack another release
later this week ...

On Wed, 8 Apr 2020 at 00:48, Thomas Heigl <th...@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 <sv...@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 <th...@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 <th...@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 <th...@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 <sv...@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 <th...@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-unsubscribe@wicket.apache.org
> > >>>>>> For additional commands, e-mail: users-help@wicket.apache.org
> > >>>>>>
> > >>>>> ---------------------------------------------------------------------
> > >>>>> To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
> > >>>>> For additional commands, e-mail: users-help@wicket.apache.org
> > >>>>>
> > >>>>>
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
> > For additional commands, e-mail: users-help@wicket.apache.org
> >
> >



-- 
Best regards,
Maxim

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
For additional commands, e-mail: users-help@wicket.apache.org


Re: Equivalent for PerSessionPageStore in Wicket 9

Posted by Thomas Heigl <th...@umschalt.com>.
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 <sv...@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 <th...@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 <th...@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 <th...@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 <sv...@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 <th...@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-unsubscribe@wicket.apache.org
> >>>>>> For additional commands, e-mail: users-help@wicket.apache.org
> >>>>>>
> >>>>> ---------------------------------------------------------------------
> >>>>> To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
> >>>>> For additional commands, e-mail: users-help@wicket.apache.org
> >>>>>
> >>>>>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
> For additional commands, e-mail: users-help@wicket.apache.org
>
>

Re: Equivalent for PerSessionPageStore in Wicket 9

Posted by Sven Meier <sv...@meiers.net>.
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 <th...@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 <th...@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 <th...@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 <sv...@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 <th...@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-unsubscribe@wicket.apache.org
>>>>>> For additional commands, e-mail: users-help@wicket.apache.org
>>>>>>
>>>>> ---------------------------------------------------------------------
>>>>> To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
>>>>> For additional commands, e-mail: users-help@wicket.apache.org
>>>>>
>>>>>

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
For additional commands, e-mail: users-help@wicket.apache.org


Re: Equivalent for PerSessionPageStore in Wicket 9

Posted by Thomas Heigl <th...@umschalt.com>.
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 <th...@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 <th...@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 <th...@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 <sv...@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 <th...@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-unsubscribe@wicket.apache.org
>>>> > For additional commands, e-mail: users-help@wicket.apache.org
>>>> >
>>>>
>>>> ---------------------------------------------------------------------
>>>> To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
>>>> For additional commands, e-mail: users-help@wicket.apache.org
>>>>
>>>>

Re: Equivalent for PerSessionPageStore in Wicket 9

Posted by Thomas Heigl <th...@umschalt.com>.
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 <th...@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 <th...@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 <sv...@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 <th...@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-unsubscribe@wicket.apache.org
>>> > For additional commands, e-mail: users-help@wicket.apache.org
>>> >
>>>
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
>>> For additional commands, e-mail: users-help@wicket.apache.org
>>>
>>>