-
Notifications
You must be signed in to change notification settings - Fork 38.5k
[CRaC] DefaultLifecycleProcessor and stopping beans on first refresh #34510
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Comments
Generally, This is also the pattern followed for an onRefresh checkpoint: We aim to not even start the components there yet, in order to avoid the need for explicit stopping to begin with. Only for later checkpoints at runtime, there is an actual need to stop components. For core framework components, we explicitly have all such activity in |
@jhoeller Thanks for those answers! The symmetry makes sense - could you make any suggestion for integration of components that don't have a proper lifecycle and do startup as part of bean instantiation? I've checked Cassandra code and the I've placed a few breakpoints into the starting application and it seems that I've implemented the lifecycle with |
@rvansa Is the |
@sdeleuze Yes, it is produced by
|
If am not sure we have something actionable on Spring Framework side. I mean, the choice to expose directly beans using a third-party class which open a connection very early at constructor level is not a good fit with training run use cases. I see 2 potential ways to solve this. Either at Spring Boot level (see related issue above) or Spring Data level, the Or alternatively, on Cassandra side you can either ask them a way to not create the connection eagerly in the constructor, or ask them to introduce an @rvansa Are you fine with us closing this issue? |
Would that mean that application code requesting
That would be a significant change in behaviour, IMO requiring major release. And it's not up to the fail-fast principle.
Technically I think this would be the best solution. However from my experience projects are not too keen on accepting an external dependency; maintainers often consider that a job of integrating frameworks like Spring. A middle-ground solution is exposing @sdeleuze So it depends whether you want to offer CRaC support, and whether it should be available in weeks/months/years. |
I've posted to https://lists.apache.org/thread/9sms1sk8fd739mp7699wrbj0vnd0kzd1 to see what is Cassandra community view on this. |
I think our strategy is to provide a reasonable support for CRaC when we can, but we don't want to invest too much trying to fight against either by design limitations of the technology or lack of support in libraries. JVM AOT cache from Project Leyden is going to provide gradually caracteristics close to what Project CRaC provides today (even if we won't reach exactly the same level of startup time reduction) with less compatibility issues on all OS. Since we have to chose where we put most of our time and energy, I think that AOT cache is a better investment. @mp911de has explained some Cassandra level limitations in the Spring Boot issue that has been declined, and I am also going to decline this one. |
Hi,
I started hacking a solution that would close Cassandra connections on checkpoint, following [1] and registering a
Lifecycle
that would let the Cassandra session 'suspend'. The checkpoint and restore works in my prototype when I issue the checkpoint viajcmd <pid> JDK.checkpoint
, but if I try automatic checkpoint through-Dspring.context.checkpoint=onRefresh
theLifecycle.stop()
is not called: at this pointDefaultLifecycleProcessor.running
is false andstopForRestart()
is not invoked.I would like to ask what's the reason and if there's any better pattern; [2] explains that the connections are established too early (before first refresh). Is that a show-stopper? We can close those connections and keep going.
An alternative solution would be to not use the
Lifecycle
and register as aorg.crac.Resource
; however I understand that it's preferred to integrate the handling into Spring using that rather than directly.CC @sdeleuze
[1] https://github.com/spring-projects/spring-boot/blob/main/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/jdbc/DataSourceCheckpointRestoreConfiguration.java
[2] spring-projects/spring-data-cassandra#1486
The text was updated successfully, but these errors were encountered: