Spring Boot Version: 3.2.0-M1

When creating an executable JAR of the spring-petclinic project and running it with the modified io.github.crac.org.apache.tomcat.embed:tomcat-embed-core:10.1.7 Tomcat container and latest CRaC JDK, the -Dspring.context.checkpoint=onRefresh switch (while also setting -XX:CRaCCheckpointTo=/app switch) will create an CheckpointOpenFileException. I think the issue is that the Spring Jar launcher keeps the app jar FD open, and CRaC doesn't like that:

2023-08-22T16:37:29.040Z  INFO 129 --- [           main] o.s.s.petclinic.PetClinicApplication     : Starting PetClinicApplication v3.1.0-SNAPSHOT using Java 17-crac with PID 129 (/app/app.jar started by root in /app)
2023-08-22T16:37:29.050Z  INFO 129 --- [           main] o.s.s.petclinic.PetClinicApplication     : No active profile set, falling back to 1 default profile: "default"
2023-08-22T16:37:32.303Z  INFO 129 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode.
2023-08-22T16:37:32.488Z  INFO 129 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 152 ms. Found 2 JPA repository interfaces.
2023-08-22T16:37:35.110Z  INFO 129 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port 8080 (http)
2023-08-22T16:37:35.136Z  INFO 129 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2023-08-22T16:37:35.136Z  INFO 129 --- [           main] o.apache.catalina.core.StandardEngine    : Starting Servlet engine: [Apache Tomcat/10.1.7]
2023-08-22T16:37:35.362Z  INFO 129 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2023-08-22T16:37:35.374Z  INFO 129 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 6123 ms
2023-08-22T16:37:36.025Z  INFO 129 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
2023-08-22T16:37:36.645Z  INFO 129 --- [           main] com.zaxxer.hikari.pool.HikariPool        : HikariPool-1 - Added connection conn0: url=jdbc:h2:mem:700ebe8b-6b1d-49fe-b639-b730acf8c6a9 user=SA
2023-08-22T16:37:36.650Z  INFO 129 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.
2023-08-22T16:37:37.066Z  INFO 129 --- [           main] o.hibernate.jpa.internal.util.LogHelper  : HHH000204: Processing PersistenceUnitInfo [name: default]
2023-08-22T16:37:37.270Z  INFO 129 --- [           main] org.hibernate.Version                    : HHH000412: Hibernate ORM core version 6.2.6.Final
2023-08-22T16:37:37.279Z  INFO 129 --- [           main] org.hibernate.cfg.Environment            : HHH000406: Using bytecode reflection optimizer
2023-08-22T16:37:37.796Z  INFO 129 --- [           main] o.h.b.i.BytecodeProviderInitiator        : HHH000021: Bytecode provider name : bytebuddy
2023-08-22T16:37:38.283Z  INFO 129 --- [           main] o.s.o.j.p.SpringPersistenceUnitInfo      : No LoadTimeWeaver setup: ignoring JPA class transformer
2023-08-22T16:37:38.980Z  INFO 129 --- [           main] o.h.b.i.BytecodeProviderInitiator        : HHH000021: Bytecode provider name : bytebuddy
2023-08-22T16:37:40.711Z  INFO 129 --- [           main] o.h.e.t.j.p.i.JtaPlatformInitiator       : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform]
2023-08-22T16:37:40.718Z  INFO 129 --- [           main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default'
2023-08-22T16:37:41.390Z  INFO 129 --- [           main] o.s.d.j.r.query.QueryEnhancerFactory     : Hibernate is in classpath; If applicable, HQL parser will be used.
2023-08-22T16:37:44.645Z  INFO 129 --- [           main] o.s.b.a.e.web.EndpointLinksResolver      : Exposing 13 endpoint(s) beneath base path '/actuator'
2023-08-22T16:37:44.918Z  INFO 129 --- [           main] o.s.c.support.DefaultLifecycleProcessor  : Triggering JVM checkpoint/restore
2023-08-22T16:37:44.923Z  INFO 129 --- [           main] jdk.crac                                 : Starting checkpoint
2023-08-22T16:37:45.030Z  INFO 129 --- [           main] jdk.crac                                 : /app/app.jar is recorded as always available on restore
2023-08-22T16:37:45.317Z  INFO 129 --- [           main] o.s.c.support.DefaultLifecycleProcessor  : Restarting Spring-managed lifecycle beans after JVM restore
2023-08-22T16:37:45.318Z  INFO 129 --- [           main] o.s.c.support.DefaultLifecycleProcessor  : Spring-managed lifecycle restart completed in 0 ms
2023-08-22T16:37:45.319Z  WARN 129 --- [           main] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.context.ApplicationContextException: Failed to take CRaC checkpoint on refresh
2023-08-22T16:37:45.323Z  INFO 129 --- [           main] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default'
2023-08-22T16:37:45.338Z  INFO 129 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown initiated...
2023-08-22T16:37:45.349Z  INFO 129 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown completed.
2023-08-22T16:37:45.353Z  INFO 129 --- [           main] o.apache.catalina.core.StandardService   : Stopping service [Tomcat]
2023-08-22T16:37:45.412Z  INFO 129 --- [           main] .s.b.a.l.ConditionEvaluationReportLogger : 

Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled.
2023-08-22T16:37:45.467Z ERROR 129 --- [           main] o.s.boot.SpringApplication               : Application run failed

org.springframework.context.ApplicationContextException: Failed to take CRaC checkpoint on refresh
        at org.springframework.context.support.DefaultLifecycleProcessor$CracDelegate.checkpointRestore(DefaultLifecycleProcessor.java:504) ~[spring-context-6.1.0-M3.jar!/:6.1.0-M3]
        at org.springframework.context.support.DefaultLifecycleProcessor.onRefresh(DefaultLifecycleProcessor.java:174) ~[spring-context-6.1.0-M3.jar!/:6.1.0-M3]
        at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:958) ~[spring-context-6.1.0-M3.jar!/:6.1.0-M3]
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:611) ~[spring-context-6.1.0-M3.jar!/:6.1.0-M3]
        at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) ~[spring-boot-3.2.0-M1.jar!/:3.2.0-M1]
        at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:734) ~[spring-boot-3.2.0-M1.jar!/:3.2.0-M1]
        at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:436) ~[spring-boot-3.2.0-M1.jar!/:3.2.0-M1]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:312) ~[spring-boot-3.2.0-M1.jar!/:3.2.0-M1]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1306) ~[spring-boot-3.2.0-M1.jar!/:3.2.0-M1]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1295) ~[spring-boot-3.2.0-M1.jar!/:3.2.0-M1]
        at org.springframework.samples.petclinic.PetClinicApplication.main(PetClinicApplication.java:34) ~[classes!/:3.1.0-SNAPSHOT]
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
        at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]
        at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:49) ~[app.jar:3.1.0-SNAPSHOT]
        at org.springframework.boot.loader.Launcher.launch(Launcher.java:95) ~[app.jar:3.1.0-SNAPSHOT]
        at org.springframework.boot.loader.Launcher.launch(Launcher.java:58) ~[app.jar:3.1.0-SNAPSHOT]
        at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:65) ~[app.jar:3.1.0-SNAPSHOT]
Caused by: org.crac.CheckpointException: null
        at org.crac.Core$Compat.checkpointRestore(Core.java:141) ~[org-crac-0.1.0.jar!/:na]
        at org.crac.Core.checkpointRestore(Core.java:219) ~[org-crac-0.1.0.jar!/:na]
        at org.springframework.context.support.DefaultLifecycleProcessor$CracDelegate.checkpointRestore(DefaultLifecycleProcessor.java:498) ~[spring-context-6.1.0-M3.jar!/:6.1.0-M3]
        ... 18 common frames omitted
        Suppressed: jdk.crac.impl.CheckpointOpenFileException: /app/app.jar
                at java.base/jdk.internal.crac.JDKFileResource.lambda$beforeCheckpoint$1(JDKFileResource.java:71) ~[na:na]
                at java.base/jdk.crac.Core.checkpointRestore1(Core.java:174) ~[na:na]
                at java.base/jdk.crac.Core.checkpointRestore(Core.java:299) ~[na:na]
                at java.base/jdk.crac.Core.checkpointRestore(Core.java:278) ~[na:na]
                at java.base/javax.crac.Core.checkpointRestore(Core.java:73) ~[na:na]
                at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
                at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]
                at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
                at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]
                at org.crac.Core$Compat.checkpointRestore(Core.java:138) ~[org-crac-0.1.0.jar!/:na]
                ... 20 common frames omitted
        Caused by: java.lang.Exception: This file descriptor was created by main at epoch:1692722249574 here
                at java.base/jdk.internal.crac.JDKFdResource.<init>(JDKFdResource.java:36)
                at java.base/jdk.internal.crac.JDKFileResource.<init>(JDKFileResource.java:16)
                at java.base/java.io.RandomAccessFile$1.<init>(RandomAccessFile.java:86)
                at java.base/java.io.RandomAccessFile.<init>(RandomAccessFile.java:86)
                at java.base/java.io.RandomAccessFile.<init>(RandomAccessFile.java:247)
                at org.springframework.boot.loader.data.RandomAccessDataFile$FileAccess.openIfNecessary(RandomAccessDataFile.java:234)
                at org.springframework.boot.loader.data.RandomAccessDataFile$FileAccess.<init>(RandomAccessDataFile.java:220)
                at org.springframework.boot.loader.data.RandomAccessDataFile.<init>(RandomAccessDataFile.java:50)
                at org.springframework.boot.loader.jar.JarFile.<init>(JarFile.java:102)
                at org.springframework.boot.loader.jar.Handler.getRootJarFile(Handler.java:385)
                at org.springframework.boot.loader.jar.Handler.getRootJarFileFromUrl(Handler.java:373)
                at org.springframework.boot.loader.jar.Handler.openConnection(Handler.java:92)
                at java.base/java.net.URL.openConnection(URL.java:1094)
                at org.springframework.core.io.UrlResource.getInputStream(UrlResource.java:226)
                at org.springframework.core.type.classreading.SimpleMetadataReader.getClassReader(SimpleMetadataReader.java:54)
                at org.springframework.core.type.classreading.SimpleMetadataReader.<init>(SimpleMetadataReader.java:48)
                at org.springframework.core.type.classreading.SimpleMetadataReaderFactory.getMetadataReader(SimpleMetadataReaderFactory.java:103)
                at org.springframework.core.type.classreading.CachingMetadataReaderFactory.getMetadataReader(CachingMetadataReaderFactory.java:122)
                at org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.scanCandidateComponents(ClassPathScanningCandidateComponentProvider.java:436)
                at org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.findCandidateComponents(ClassPathScanningCandidateComponentProvider.java:318)
                at org.springframework.context.annotation.ClassPathBeanDefinitionScanner.doScan(ClassPathBeanDefinitionScanner.java:276)
                at org.springframework.context.annotation.ComponentScanAnnotationParser.parse(ComponentScanAnnotationParser.java:128)
                at org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:289)
                at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:243)
                at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:196)
                at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:164)
                at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:415)
                at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:287)
                at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:344)
                at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:115)
                at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:768)
                at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:589)
                ... 15 common frames omitted
        Suppressed: jdk.crac.impl.CheckpointOpenFileException: /app/app.jar
                at java.base/jdk.internal.crac.JDKFileResource.lambda$beforeCheckpoint$1(JDKFileResource.java:71) ~[na:na]
                at java.base/jdk.crac.Core.checkpointRestore1(Core.java:174) ~[na:na]
                at java.base/jdk.crac.Core.checkpointRestore(Core.java:299) ~[na:na]
                at java.base/jdk.crac.Core.checkpointRestore(Core.java:278) ~[na:na]
                at java.base/javax.crac.Core.checkpointRestore(Core.java:73) ~[na:na]
                at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
                at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]
                at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
                at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]
                at org.crac.Core$Compat.checkpointRestore(Core.java:138) ~[org-crac-0.1.0.jar!/:na]
                ... 20 common frames omitted
        Caused by: java.lang.Exception: This file descriptor was created by main at epoch:1692722246589 here
                at java.base/jdk.internal.crac.JDKFdResource.<init>(JDKFdResource.java:36)
                at java.base/jdk.internal.crac.JDKFileResource.<init>(JDKFileResource.java:16)
                at java.base/java.io.RandomAccessFile$1.<init>(RandomAccessFile.java:86)
                at java.base/java.io.RandomAccessFile.<init>(RandomAccessFile.java:86)
                at java.base/java.io.RandomAccessFile.<init>(RandomAccessFile.java:247)
                at org.springframework.boot.loader.data.RandomAccessDataFile$FileAccess.openIfNecessary(RandomAccessDataFile.java:234)
                at org.springframework.boot.loader.data.RandomAccessDataFile$FileAccess.<init>(RandomAccessDataFile.java:220)
                at org.springframework.boot.loader.data.RandomAccessDataFile.<init>(RandomAccessDataFile.java:50)
                at org.springframework.boot.loader.jar.JarFile.<init>(JarFile.java:102)
                at org.springframework.boot.loader.archive.JarFileArchive.<init>(JarFileArchive.java:73)
                at org.springframework.boot.loader.archive.JarFileArchive.<init>(JarFileArchive.java:69)
                at org.springframework.boot.loader.Launcher.createArchive(Launcher.java:136)
                at org.springframework.boot.loader.ExecutableArchiveLauncher.<init>(ExecutableArchiveLauncher.java:53)
                at org.springframework.boot.loader.JarLauncher.<init>(JarLauncher.java:42)
                ... 1 common frames omitted

Comment From: sdeleuze

Hi, with Spring Boot 3.2.0-M1 there is no need to use Tomcat modified version, Spring Boot handle Tomcat lifecycle in a CRaC compatible way. I tried Checkpoint/Restore with https://github.com/spring-projects/spring-petclinic and was not able to reproduce the error you shared. Could be related to the distribution/version of the CRaC JDK used.

Could you please try with https://www.azul.com/downloads/?package=jdk-crac#zulu (that I used) and let me know how it goes?

Comment From: MrBuddyCasino

Still no luck using zulu17.44.17-ca-crac-jdk17.0.8-linux_x64. I checked out pet clinic, changed the parent to 3.2.0-M1 like this:

  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>3.2.0-M1</version>
  </parent>

and excluded *.tar from check style plugin so it would build.

Then I built the app using ./mvnw package and then built a Docker image using this Dockerfile:

# syntax=docker/dockerfile:1
FROM ubuntu:22.04
WORKDIR /app

COPY "zulu17.44.17-ca-crac-jdk17.0.8-linux_x64.tar" jdk.tar
RUN tar -xf jdk.tar
ENV PATH="$PATH:/app/zulu17.44.17-ca-crac-jdk17.0.8-linux_x64/bin"

COPY target/spring-petclinic-3.1.0-SNAPSHOT.jar app.jar

CMD ["java", "-XX:CRaCCheckpointTo=/tmp", "-Dspring.context.checkpoint=onRefresh", "-Djdk.crac.collect-fd-stacktraces=true", "-jar", "app.jar"]

On startup, this is the exception I get, using no custom dependencies such as a modified Tomcat:

java.lang.NoClassDefFoundError: org/crac/CheckpointException
        at org.springframework.context.support.DefaultLifecycleProcessor.onRefresh(DefaultLifecycleProcessor.java:174) ~[spring-context-6.1.0-M3.jar!/:6.1.0-M3]
        at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:958) ~[spring-context-6.1.0-M3.jar!/:6.1.0-M3]
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:611) ~[spring-context-6.1.0-M3.jar!/:6.1.0-M3]
        at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) ~[spring-boot-3.2.0-M1.jar!/:3.2.0-M1]
        at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:734) ~[spring-boot-3.2.0-M1.jar!/:3.2.0-M1]
        at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:436) ~[spring-boot-3.2.0-M1.jar!/:3.2.0-M1]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:312) ~[spring-boot-3.2.0-M1.jar!/:3.2.0-M1]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1306) ~[spring-boot-3.2.0-M1.jar!/:3.2.0-M1]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1295) ~[spring-boot-3.2.0-M1.jar!/:3.2.0-M1]
        at org.springframework.samples.petclinic.PetClinicApplication.main(PetClinicApplication.java:34) ~[classes!/:3.1.0-SNAPSHOT]
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
        at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]
        at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:49) ~[app.jar:3.1.0-SNAPSHOT]
        at org.springframework.boot.loader.Launcher.launch(Launcher.java:95) ~[app.jar:3.1.0-SNAPSHOT]
        at org.springframework.boot.loader.Launcher.launch(Launcher.java:58) ~[app.jar:3.1.0-SNAPSHOT]
        at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:65) ~[app.jar:3.1.0-SNAPSHOT]
Caused by: java.lang.ClassNotFoundException: org.crac.CheckpointException
        at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:445) ~[na:na]
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:592) ~[na:na]
        at org.springframework.boot.loader.LaunchedURLClassLoader.loadClass(LaunchedURLClassLoader.java:149) ~[app.jar:3.1.0-SNAPSHOT]
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:525) ~[na:na]

Comment From: MrBuddyCasino

I just noticed the docs say to add the org.crac:crac lib manually, which I then did. Starting the app with -XX:CRaCCheckpointTo=cr gives the following error:

2023-08-23T14:53:13.296Z  INFO 8 --- [           main] o.s.c.support.DefaultLifecycleProcessor  : Triggering JVM checkpoint/restore
2023-08-23T14:53:13.375Z  INFO 8 --- [           main] jdk.crac                                 : /app/app.jar is recorded as always available on restore
CR: Checkpoint ...
JVM: invalid info for restore provided: queued code -1
2023-08-23T14:53:14.127Z  INFO 8 --- [           main] o.s.c.support.DefaultLifecycleProcessor  : Restarting Spring-managed lifecycle beans after JVM restore
2023-08-23T14:53:14.141Z  INFO 8 --- [           main] o.s.c.support.DefaultLifecycleProcessor  : Spring-managed lifecycle restart completed in 11 ms
2023-08-23T14:53:14.143Z  WARN 8 --- [           main] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.context.ApplicationContextException: Failed to take CRaC checkpoint on refresh
2023-08-23T14:53:14.150Z  INFO 8 --- [           main] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'default'
2023-08-23T14:53:14.158Z  INFO 8 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown initiated...
2023-08-23T14:53:14.164Z  INFO 8 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown completed.
2023-08-23T14:53:14.170Z  INFO 8 --- [           main] o.apache.catalina.core.StandardService   : Stopping service [Tomcat]
2023-08-23T14:53:14.261Z  INFO 8 --- [           main] .s.b.a.l.ConditionEvaluationReportLogger : 

Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled.
2023-08-23T14:53:14.386Z ERROR 8 --- [           main] o.s.boot.SpringApplication               : Application run failed

org.springframework.context.ApplicationContextException: Failed to take CRaC checkpoint on refresh
        at org.springframework.context.support.DefaultLifecycleProcessor$CracDelegate.checkpointRestore(DefaultLifecycleProcessor.java:504) ~[spring-context-6.1.0-M3.jar!/:6.1.0-M3]
        at org.springframework.context.support.DefaultLifecycleProcessor.onRefresh(DefaultLifecycleProcessor.java:174) ~[spring-context-6.1.0-M3.jar!/:6.1.0-M3]
        at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:958) ~[spring-context-6.1.0-M3.jar!/:6.1.0-M3]
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:611) ~[spring-context-6.1.0-M3.jar!/:6.1.0-M3]
        at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) ~[spring-boot-3.2.0-M1.jar!/:3.2.0-M1]
        at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:734) ~[spring-boot-3.2.0-M1.jar!/:3.2.0-M1]
        at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:436) ~[spring-boot-3.2.0-M1.jar!/:3.2.0-M1]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:312) ~[spring-boot-3.2.0-M1.jar!/:3.2.0-M1]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1306) ~[spring-boot-3.2.0-M1.jar!/:3.2.0-M1]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1295) ~[spring-boot-3.2.0-M1.jar!/:3.2.0-M1]
        at org.springframework.samples.petclinic.PetClinicApplication.main(PetClinicApplication.java:34) ~[classes!/:3.1.0-SNAPSHOT]
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
        at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]
        at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
        at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]
        at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:49) ~[app.jar:3.1.0-SNAPSHOT]
        at org.springframework.boot.loader.Launcher.launch(Launcher.java:95) ~[app.jar:3.1.0-SNAPSHOT]
        at org.springframework.boot.loader.Launcher.launch(Launcher.java:58) ~[app.jar:3.1.0-SNAPSHOT]
        at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:65) ~[app.jar:3.1.0-SNAPSHOT]
Caused by: org.crac.CheckpointException: null
        at org.crac.Core$Compat.checkpointRestore(Core.java:144) ~[crac-1.3.0.jar!/:na]
        at org.crac.Core.checkpointRestore(Core.java:237) ~[crac-1.3.0.jar!/:na]
        at org.springframework.context.support.DefaultLifecycleProcessor$CracDelegate.checkpointRestore(DefaultLifecycleProcessor.java:498) ~[spring-context-6.1.0-M3.jar!/:6.1.0-M3]
        ... 18 common frames omitted

This hints at issues using CRIU, as described by Azul Docs. I'll investigate.

Comment From: MrBuddyCasino

Yeah so using Docker requires the --privileged flag, otherwise CRIU is unhappy.

A useful scenario would be to create a snapshot using RUN java -XX:CRaCCheckpointTo=cr -Dspring.context.checkpoint=onRefresh -jar app.jar during the build step, and later simply restoring from it when running the image: CMD ["java", "-XX:CRaCRestoreFrom=cr", "-jar", "app.jar"]. This doesn't work because the RUN command does not accept the --privileged flag, and I haven't figured out how to work around this.

Did you per chance find a way?

Comment From: sdeleuze

For the dependency, I have refined the error message as part of https://github.com/spring-projects/spring-framework/issues/31096 to make it more explicit.

The sample https://github.com/sdeleuze/spring-boot-crac-demo is a bit different but should be a good source of inspiration for you. https://github.com/spring-projects/spring-checkpoint-restore-smoke-tests/blob/main/run-dev-container.sh and https://github.com/spring-projects/spring-checkpoint-restore-smoke-tests/tree/main/ci/images may also be useful.