Hi,

This problem has been fixed. Please upgrade to the latest 7.0.x release.
Thanks.
Best regards,
Jérôme


Le lun. 23 sept. 2024 à 11:23, Łukasz Woźniak <[email protected]> a
écrit :

> Hello, we use CAS 7.0.0 with Redis, and we also have memory leak.
>
> Anyone have a solutions?
>
> Thanks and Best regards.
>
>
> wtorek, 4 czerwca 2024 o 16:46:26 UTC+2 Nathan Cailbourdin napisał(a):
>
>> Hello,
>>
>> Since version 7 of CAS, I have noticed an abnormal and progressive
>> increase in the memory consumed by the metaspace when the Redis ticket
>> registry is used. This issue is due to accessor classes that are
>> dynamically generated by Spring Data to access the attributes of
>> RedisTicketDocument.
>>
>> The increase can easily be observed by monitoring the evolution of the
>> metaspace as soon as connections are made: https://postimg.cc/21p7znzd
>> Here, the example involves approximately 2000 users connecting to CAS,
>> using it to obtain STs, and then disconnecting. We can see the increase in
>> memory consumption during the connection phase (from 10:52 AM to 11:02 AM),
>> and especially, we do not observe any memory release even during the
>> disconnection phase (starting at 11:02 AM).
>>
>> In comparison, with the same number of connections but with the default
>> ticket registry, no metaspace increase is observed:
>> https://postimg.cc/zL8wh5HV
>> With CAS version 6 and the Redis ticket registry, we do not observe any
>> increase, so the problem only appears starting from version *7*.
>>
>> We can observe the class loading by launching the CAS server with the
>> argument *-Xlog:class+load=info*. The following message is displayed
>> during each new connection to CAS (with a different class name each time):
>> [info][class,load] org.apereo.cas.ticket.registry.RedisTicketDocument_
>> *Accessor_ss8dk8* source: __JVM_LookupDefineClass__
>>
>> If we look at the loaded classes with the command *jcmd PID VM.classes |
>> grep org.apereo.cas.ticket.registry.RedisTicketDocument_Accessor*, we
>> can see that for each new connection, a new accessor class is created:
>> 0x00007f03c1e0f218    73  fully_initialized     W
>>  org.apereo.cas.ticket.registry.RedisTicketDocument_*Accessor_ss8dk8*
>> 0x00007f03c1cbdab8    73  fully_initialized     W
>>  org.apereo.cas.ticket.registry.RedisTicketDocument_*Accessor_3aa8i2*
>> and the list goes on...
>>
>>
>> Debugging step by step, I found that the problem comes from
>> RedisTicketRegistry.java, specifically from the addOrUpdateTicket method:
>> https://github.com/apereo/cas/blob/v7.0.4/support/cas-server-support-redis-ticket-registry/src/main/java/org/apereo/cas/ticket/registry/RedisTicketRegistry.java#L417
>>
>> Tracing the call chain progressively, I found that the following method
>> in Spring Data is invoked:
>> https://github.com/spring-projects/spring-data-commons/blob/main/src/main/java/org/springframework/data/mapping/model/ClassGeneratingPropertyAccessorFactory.java#L97
>>
>> This call results in creating a new class (not a new instance, a new
>> class) because the PersistentPropertyAccessorFactory responsible for
>> creating accessor classes associated with the mapping context does not know
>> that a class has already been generated for this purpose.
>> A map (propertyAccessorClasses) is used to save the class type (here
>> RedisTicketDocument) to its associated accessor class, but in our case, it
>> becomes empty for each new ticket! (Whereas it should only be empty for the
>> first one, see
>> https://github.com/spring-projects/spring-data-commons/blob/main/src/main/java/org/springframework/data/mapping/model/ClassGeneratingPropertyAccessorFactory.java#L186
>> )
>>
>> This issue is due to a new RedisKeyValueAdapter being created for each
>> call to addOrUpdateTicket, resulting in a new RedisMappingContext being
>> created each time. *When a new RedisMappingContext is created, it also
>> creates a new PersistentPropertyAccessorFactory, which does not have
>> knowledge of the previously created accessor class and will create a new
>> one when it tries to access the ticket attributes.*
>>
>> RedisMappingContext instances are created in this method:
>> https://github.com/apereo/cas/blob/v7.0.4/support/cas-server-support-redis-ticket-registry/src/main/java/org/apereo/cas/ticket/registry/RedisTicketRegistry.java#L439
>>
>> They seem to depend on a KeyspaceConfiguration that changes based on the
>> TGT. We cannot directly modify the MappingConfiguration or
>> KeyspaceConfiguration as they are final attributes (which explains why a
>> new MappingConfiguration is recreated each time).
>>
>> *My question is: what would be the best way to solve this problem?*
>>
>>
>> A potential fix would be to create only one RedisMappingContext, then
>> dynamically change its KeyspaceSettings in the buildRedisKeyValueAdapter
>> method. In other words, this would involve this change in the
>> buildRedisKeyValueAdapter method:
>>
>> *this.redisMappingContext.getMappingConfiguration().getKeyspaceConfiguration().addKeyspaceSettings(new
>> KeyspaceConfiguration.KeyspaceSettings(RedisTicketDocument.class,
>> redisKeyPattern));  val adapter = new
>> RedisKeyValueAdapter(casRedisTemplates.getTicketsRedisTemplate(),
>> this.redisMappingContext)  *
>>
>> With this modification, the metaspace memory consumption returns to
>> normal, but maybe there is a better way to solve the problem.
>>
>>
>> Thanks in advance for your assistance.
>> Best regards.
>
> --
> - Website: https://apereo.github.io/cas
> - List Guidelines: https://goo.gl/1VRrw7
> - Contributions: https://goo.gl/mh7qDG
> ---
> You received this message because you are subscribed to the Google Groups
> "CAS Community" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> To view this discussion on the web visit
> https://groups.google.com/a/apereo.org/d/msgid/cas-user/4c7c2843-39a5-431c-8a97-2d8160bf7f26n%40apereo.org
> <https://groups.google.com/a/apereo.org/d/msgid/cas-user/4c7c2843-39a5-431c-8a97-2d8160bf7f26n%40apereo.org?utm_medium=email&utm_source=footer>
> .
>

-- 
- Website: https://apereo.github.io/cas
- List Guidelines: https://goo.gl/1VRrw7
- Contributions: https://goo.gl/mh7qDG
--- 
You received this message because you are subscribed to the Google Groups "CAS 
Community" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/a/apereo.org/d/msgid/cas-user/CAP279LxFYqi_pw-qpqS2ZaFqvkCixTvpHNw3c2efnxftPoohMg%40mail.gmail.com.

Reply via email to