spring-projects / spring-framework

Spring Framework
https://spring.io/projects/spring-framework
Apache License 2.0
56.47k stars 38.09k forks source link

Spring Boot CRaC checkpoint on refresh-error #32299

Closed smoell closed 8 months ago

smoell commented 8 months ago

Hi,

I ran into an issue with Spring Boot 3.2.2 and CRaC if I want to generate the snapshot using spring.context.checkpoint=onRefresh:

org.springframework.context.ApplicationContextException: Failed to take CRaC checkpoint on refresh
        at org.springframework.context.support.DefaultLifecycleProcessor$CracDelegate.checkpointRestore(DefaultLifecycleProcessor.java:534) ~[!/:1.0.0]
        at org.springframework.context.support.DefaultLifecycleProcessor.onRefresh(DefaultLifecycleProcessor.java:193) ~[!/:1.0.0]
        at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:978) ~[!/:1.0.0]
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:627) ~[!/:1.0.0]
        at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) ~[!/:1.0.0]
        at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:754) ~[!/:1.0.0]
        at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:456) ~[!/:1.0.0]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:334) ~[!/:1.0.0]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1354) ~[!/:1.0.0]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1343) ~[!/:1.0.0]
        at com.unicorn.store.StoreApplication.main(StoreApplication.java:13) ~[!/:1.0.0]
        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.launch.Launcher.launch(Launcher.java:91) ~[store-spring-1.0.0-exec.jar:1.0.0]
        at org.springframework.boot.loader.launch.Launcher.launch(Launcher.java:53) ~[store-spring-1.0.0-exec.jar:1.0.0]
        at org.springframework.boot.loader.launch.JarLauncher.main(JarLauncher.java:58) ~[store-spring-1.0.0-exec.jar:1.0.0]
Caused by: org.crac.CheckpointException: null
        at org.crac.Core$Compat.checkpointRestore(Core.java:144) ~[!/:1.0.0]
        at org.crac.Core.checkpointRestore(Core.java:237) ~[!/:1.0.0]
        at org.springframework.context.support.DefaultLifecycleProcessor$CracDelegate.checkpointRestore(DefaultLifecycleProcessor.java:528) ~[!/:1.0.0]
        ... 17 common frames omitted
        Suppressed: jdk.internal.crac.mirror.impl.CheckpointOpenSocketException: Socket[addr=localhost/127.0.0.1,port=5432,localport=38572]
                at java.base/jdk.internal.crac.JDKSocketResourceBase.lambda$beforeCheckpoint$0(JDKSocketResourceBase.java:68) ~[na:na]
                at java.base/jdk.internal.crac.mirror.Core.checkpointRestore1(Core.java:169) ~[na:na]
                at java.base/jdk.internal.crac.mirror.Core.checkpointRestore(Core.java:286) ~[na:na]
                at java.base/jdk.internal.crac.mirror.Core.checkpointRestore(Core.java:265) ~[na:na]
                at jdk.crac/jdk.crac.Core.checkpointRestore(Core.java:72) ~[jdk.crac: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:141) ~[!/:1.0.0]
                ... 19 common frames omitted
        Caused by: java.lang.Exception: This file descriptor was created by main at epoch:1708432795610 here
                at java.base/jdk.internal.crac.JDKFdResource.<init>(JDKFdResource.java:60)
                at java.base/jdk.internal.crac.JDKSocketResourceBase.<init>(JDKSocketResourceBase.java:44)
                at java.base/jdk.internal.crac.JDKSocketResource.<init>(JDKSocketResource.java:38)
                at java.base/java.net.SocketImpl$1.<init>(SocketImpl.java:110)
                at java.base/java.net.SocketImpl.<init>(SocketImpl.java:109)
                at java.base/sun.nio.ch.NioSocketImpl.<init>(NioSocketImpl.java:141)
                at java.base/java.net.SocketImpl.createPlatformSocketImpl(SocketImpl.java:85)
                at java.base/java.net.Socket.setImpl(Socket.java:558)
                at java.base/java.net.Socket.<init>(Socket.java:150)
                at java.base/javax.net.DefaultSocketFactory.createSocket(SocketFactory.java:265)
                at org.postgresql.core.PGStream.createSocket(PGStream.java:231)
                at org.postgresql.core.PGStream.<init>(PGStream.java:98)
                at org.postgresql.core.v3.ConnectionFactoryImpl.tryConnect(ConnectionFactoryImpl.java:132)
                at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:258)
                at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:54)
                at org.postgresql.jdbc.PgConnection.<init>(PgConnection.java:263)
                at org.postgresql.Driver.makeConnection(Driver.java:443)
                at org.postgresql.Driver.connect(Driver.java:297)
                at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138)
                at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:359)
                at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:201)
                at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:470)
                at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:561)
                at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:100)
                at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:112)
                at org.springframework.jdbc.datasource.DataSourceUtils.fetchConnection(DataSourceUtils.java:160)
                at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:118)
                at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:81)
                at org.springframework.jdbc.datasource.init.DatabasePopulatorUtils.execute(DatabasePopulatorUtils.java:52)
                at org.springframework.boot.jdbc.init.DataSourceScriptDatabaseInitializer.runScripts(DataSourceScriptDatabaseInitializer.java:87)
                at org.springframework.boot.sql.init.AbstractScriptDatabaseInitializer.runScripts(AbstractScriptDatabaseInitializer.java:146)
                at org.springframework.boot.sql.init.AbstractScriptDatabaseInitializer.applyScripts(AbstractScriptDatabaseInitializer.java:108)
                at org.springframework.boot.sql.init.AbstractScriptDatabaseInitializer.applySchemaScripts(AbstractScriptDatabaseInitializer.java:98)
                at org.springframework.boot.sql.init.AbstractScriptDatabaseInitializer.initializeDatabase(AbstractScriptDatabaseInitializer.java:76)
                at org.springframework.boot.sql.init.AbstractScriptDatabaseInitializer.afterPropertiesSet(AbstractScriptDatabaseInitializer.java:66)
                at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1820)
                at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1769)
                at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:599)
                at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:521)
                at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:325)
                at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
                at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:323)
                at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
                at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:312)
                at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
                at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1231)
                at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:949)
                at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:624)
                ... 14 common frames omitted

To reproduce the issue:

  1. Check out the repo https://github.com/smoell/unicorn-store-spring
  2. Build the application with Azul Zulu 17 (OpenJDK Runtime Environment Zulu17.48+15-CRaC-CA (build 17.0.10+7-LTS)) using mvn clean package -Dmaven.test.skip=true
  3. Start Postgres locally using docker run -itd -e POSTGRES_USER=postgres -e POSTGRES_PASSWORD=postgres -p 5432:5432 -v /data:/var/lib/postgresql/data --name postgresql postgres
  4. Try creating checkpoint using java -Dspring.context.checkpoint=onRefresh -Dspring.profiles.active=prod -Dmanagement.endpoint.health.probes.add-additional-paths="true" -Dmanagement.health.probes.enabled="true" -Djdk.crac.collect-fd-stacktraces=true -XX:CRaCCheckpointTo=./crac-files/ -jar target/store-spring-1.0.0-exec.jar
sdeleuze commented 8 months ago

This is likely expected and require specific configuration handling, see related documentation in https://github.com/spring-projects/spring-lifecycle-smoke-tests/tree/main/data/data-jpa.

smoell commented 8 months ago

Still the same behavior, I've added

spring.datasource.hikari.allow-pool-suspension=true

to the code and tested again.

sdeleuze commented 8 months ago

Please also take in account the "Lifecycle configuration guidance" section.

fatiq123 commented 2 months ago

spring.application.name=SpringBoot-PostgreSQL

spring.datasource.url=jdbc:postgresql://localhost:5432/practice-db spring.datasource.username=postgres spring.datasource.password=123 spring.jpa.show-sql=true

spring.datasource.driver-class-name=org.postgresql.Driver spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true

server.port=8080

spring.datasource.hikari.allow-pool-suspension=true spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect

spring.jpa.properties.hibernate.boot.allow_jdbc_metadata_access=false spring.jpa.hibernate.ddl-auto=update spring.sql.init.mode=never

Just Replace your application-name, user-name, password and database name. If error persists then create database explicitly in PostgreSQL and write your database name in URL.