Affects: 6.1.11
BlockHound seems to detect a blocking call in ConcurrentReferenceHashMap, relevant lines from stacktrace:
reactor.blockhound.BlockingOperationError: Blocking call! jdk.internal.misc.Unsafe#park
at java.base/jdk.internal.misc.Unsafe.park(Unsafe.java) ~[?:?]
at java.base/java.util.concurrent.locks.LockSupport.park(LockSupport.java:221) ~[?:?]
at java.base/java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:754) ~[?:?]
at java.base/java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:990) ~[?:?]
at java.base/java.util.concurrent.locks.ReentrantLock$Sync.lock(ReentrantLock.java:153) ~[?:?]
at java.base/java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:322) ~[?:?]
at java.base/java.lang.ref.ReferenceQueue.poll(ReferenceQueue.java:182) ~[?:?]
at org.springframework.util.ConcurrentReferenceHashMap$ReferenceManager.pollForPurge(ConcurrentReferenceHashMap.java:1025) ~[spring-core-6.1.11.jar:6.1.11]
at org.springframework.util.ConcurrentReferenceHashMap$Segment.restructureIfNecessary(ConcurrentReferenceHashMap.java:575) ~[spring-core-6.1.11.jar:6.1.11]
at org.springframework.util.ConcurrentReferenceHashMap$Segment.getReference(ConcurrentReferenceHashMap.java:496) ~[spring-core-6.1.11.jar:6.1.11]
at org.springframework.util.ConcurrentReferenceHashMap.getReference(ConcurrentReferenceHashMap.java:266) ~[spring-core-6.1.11.jar:6.1.11]
at org.springframework.util.ConcurrentReferenceHashMap.get(ConcurrentReferenceHashMap.java:236) ~[spring-core-6.1.11.jar:6.1.11]
at java.base/java.util.concurrent.ConcurrentMap.computeIfAbsent(ConcurrentMap.java:329) ~[?:?]
at org.springframework.data.mapping.callback.DefaultReactiveEntityCallbacks.callback(DefaultReactiveEntityCallbacks.java:73) ~[spring-data-commons-3.3.2.jar:3.3.2]
Maybe the ConcurrentReferenceHashMap$Segment#restructureIfNecessary
or ConcurrentReferenceHashMap$ReferenceManager#pollForPurge
just needs to be whitelisted in SpringCoreBlockHoundIntegration
?
Comment From: simonbasle
I think we can indeed add pollForPurge
in the allow-list. I was however unable to produce a unit test that makes BlockHound fail on that particular method. Do you happen to have a reproducible case by any chance ?