Upgrading from Spring Boot 2.4.0-M3 to 2.4.0-M4 causes a hang on AbstractEntityManagerFactoryBean.getNativeEntityManagerFactory().

A thread dump of main thread when the hang happens is as follows:

"main" #1 prio=5 os_prio=31 cpu=2876.69ms elapsed=25.68s tid=0x00007fa1f9808a00 nid=0x2703 waiting on condition  [0x0000700007308000]
   java.lang.Thread.State: WAITING (parking)
        at jdk.internal.misc.Unsafe.park(java.base@15/Native Method)
        - parking to wait for  <0x00000007015a62f0> (a java.util.concurrent.FutureTask)
        at java.util.concurrent.locks.LockSupport.park(java.base@15/LockSupport.java:211)
        at java.util.concurrent.FutureTask.awaitDone(java.base@15/FutureTask.java:447)
        at java.util.concurrent.FutureTask.get(java.base@15/FutureTask.java:190)
        at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.getNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:560)
        at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.invokeProxyMethod(AbstractEntityManagerFactoryBean.java:516)
        at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean$ManagedEntityManagerFactoryInvocationHandler.invoke(AbstractEntityManagerFactoryBean.java:731)
        at com.sun.proxy.$Proxy76.getStatistics(Unknown Source)
        at io.micrometer.core.instrument.binder.jpa.HibernateMetrics.<init>(HibernateMetrics.java:110)
        at org.springframework.boot.actuate.autoconfigure.metrics.orm.jpa.HibernateMetricsAutoConfiguration.bindEntityManagerFactoryToRegistry(HibernateMetricsAutoConfiguration.java:68)
        at org.springframework.boot.actuate.autoconfigure.metrics.orm.jpa.HibernateMetricsAutoConfiguration.lambda$bindEntityManagerFactoriesToRegistry$0(HibernateMetricsAutoConfiguration.java:60)
        at org.springframework.boot.actuate.autoconfigure.metrics.orm.jpa.HibernateMetricsAutoConfiguration$$Lambda$880/0x0000000800fdfd88.accept(Unknown Source)
        at java.util.LinkedHashMap.forEach(java.base@15/LinkedHashMap.java:723)
        at org.springframework.boot.actuate.autoconfigure.metrics.orm.jpa.HibernateMetricsAutoConfiguration.bindEntityManagerFactoriesToRegistry(HibernateMetricsAutoConfiguration.java:60)
        at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(java.base@15/Native Method)
        at jdk.internal.reflect.NativeMethodAccessorImpl.invoke(java.base@15/NativeMethodAccessorImpl.java:64)
        at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(java.base@15/DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(java.base@15/Method.java:564)
        at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredMethodElement.inject(AutowiredAnnotationBeanPostProcessor.java:755)
        at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:130)
        at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:399)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1415)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:608)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:531)
        at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335)
        at org.springframework.beans.factory.support.AbstractBeanFactory$$Lambda$246/0x0000000800cbf920.getObject(Unknown Source)
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
        - locked <0x000000070066dbc8> (a java.util.concurrent.ConcurrentHashMap)
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:944)
        at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:925)
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:588)
        - locked <0x0000000700666de0> (a java.lang.Object)
        at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:144)
        at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:767)
        at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:759)
        at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:418)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:326)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1309)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1298)
        at com.izeye.mydictionary.MyDictionaryApplication.main(MyDictionaryApplication.java:31)

This is a project that can be used to reproduce it: https://github.com/izeye/my-dictionary/tree/spring-boot-gh-23735 (spring-boot-gh-23735 branch)

Just running it as follows causes a hang:

./gradlew clean bootRun

Comment From: snicoll

Thanks @izeye. You can workaround the problem for now by adding spring.data.jpa.repositories.bootstrap-mode=default to your configuration

@jhoeller it looks like the fix to let us run database init as part of the EMF lock leads to another problem.

Comment From: snicoll

I've created https://github.com/spring-projects/spring-framework/issues/25930

Comment From: snicoll

The fix was applied in 2.3.x but we haven't released it yet hopefully so I've created a task to revisit the fix (#23740). On 2.4.x this is considered as a regression .