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 ?