On Tue, 2026-08-11 at 17:37 +0300, Andrey Turbanov wrote:
> Hello!
> Recently got deadlock in one of our applications.
> Using locks in toString() it's generally not a good idea.
> I wonder if it's possible to avoid indefinite blocking inside
> SSLIOSession.toString()? Maybe it's better to use tryLock and if
> returns 'false' - then show only parts which are _safe_ to show.
> As alternative use lock with some small timeout.
> What do you think?
> 

Hi Andrey

Do feel free to submit the changes you are proposing as a pull request
at github

https://github.com/apache/httpcomponents-core

Oleg

PS: please also subscribe before posting to the list

https://hc.apache.org/mail.html

> ```
> Found one Java-level deadlock:
> =============================
> 
> "firebase-default-68":
>   waiting for ownable synchronizer 0x00000000c8c01aa0, (a
> java.util.concurrent.locks.ReentrantLock$NonfairSync),
>   which is held by "httpclient-dispatch-1"
> 
> "httpclient-dispatch-1":
>   waiting to lock monitor 0x00007f65a8009ae0 (object
> 0x00000000c1f1d5e0, a java.lang.Object),
>   which is held by "firebase-default-68"
> 
> Java stack information for the threads listed above:
> ===================================================
> "firebase-default-68":
> at jdk.internal.misc.Unsafe.park([email protected]/Native Method)
> - parking to wait for  <0x00000000c8c01aa0> (a
> java.util.concurrent.locks.ReentrantLock$NonfairSync)
> at
> java.util.concurrent.locks.LockSupport.park([email protected]/LockSup
> port.java:221)
> at
> java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(java.ba
> [email protected]/AbstractQueuedSynchronizer.java:788)
> at
> java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(java.ba
> [email protected]/AbstractQueuedSynchronizer.java:1024)
> at
> java.util.concurrent.locks.ReentrantLock$Sync.lock([email protected]/
> ReentrantLock.java:153)
> at
> java.util.concurrent.locks.ReentrantLock.lock([email protected]/Reent
> rantLock.java:322)
> at
> org.apache.hc.core5.reactor.ssl.SSLIOSession.toString(SSLIOSession.ja
> va:903)
> at
> org.apache.logging.log4j.message.ParameterFormatter.tryObjectToString
> (ParameterFormatter.java:600)
> at
> org.apache.logging.log4j.message.ParameterFormatter.recursiveDeepToSt
> ring(ParameterFormatter.java:450)
> at
> org.apache.logging.log4j.message.ParameterFormatter.recursiveDeepToSt
> ring(ParameterFormatter.java:419)
> at
> org.apache.logging.log4j.message.ParameterFormatter.formatMessageCont
> ainingNoEscapes(ParameterFormatter.java:284)
> at
> org.apache.logging.log4j.message.ParameterFormatter.formatMessage(Par
> ameterFormatter.java:267)
> at
> org.apache.logging.log4j.message.ReusableParameterizedMessage.formatT
> o(ReusableParameterizedMessage.java:351)
> at
> org.apache.logging.log4j.core.async.RingBufferLogEvent.setMessage(Rin
> gBufferLogEvent.java:146)
> at
> org.apache.logging.log4j.core.async.RingBufferLogEvent.setValues(Ring
> BufferLogEvent.java:116)
> at
> org.apache.logging.log4j.core.async.RingBufferLogEventTranslator.tran
> slateTo(RingBufferLogEventTranslator.java:60)
> at
> org.apache.logging.log4j.core.async.RingBufferLogEventTranslator.tran
> slateTo(RingBufferLogEventTranslator.java:37)
> at
> com.lmax.disruptor.RingBuffer.translateAndPublish(RingBuffer.java:962
> )
> at com.lmax.disruptor.RingBuffer.publishEvent(RingBuffer.java:466)
> at com.lmax.disruptor.dsl.Disruptor.publishEvent(Disruptor.java:331)
> at
> org.apache.logging.log4j.core.async.AsyncLoggerDisruptor.enqueueLogMe
> ssageWhenQueueFull(AsyncLoggerDisruptor.java:274)
> - locked <0x00000000c1f1d5e0> (a java.lang.Object)
> at
> org.apache.logging.log4j.core.async.AsyncLogger.handleRingBufferFull(
> AsyncLogger.java:291)
> at
> org.apache.logging.log4j.core.async.AsyncLogger.publish(AsyncLogger.j
> ava:275)
> at
> org.apache.logging.log4j.core.async.AsyncLogger.logWithThreadLocalTra
> nslator(AsyncLogger.java:270)
> at
> org.apache.logging.log4j.core.async.AsyncLogger.access$000(AsyncLogge
> r.java:70)
> at
> org.apache.logging.log4j.core.async.AsyncLogger$1.log(AsyncLogger.jav
> a:177)
> at
> org.apache.logging.log4j.core.async.AsyncLogger.log(AsyncLogger.java:
> 148)
> at
> org.apache.logging.log4j.spi.AbstractLogger.tryLogMessage(AbstractLog
> ger.java:2904)
> at
> org.apache.logging.log4j.spi.AbstractLogger.logMessageTrackRecursion(
> AbstractLogger.java:2857)
> at
> org.apache.logging.log4j.spi.AbstractLogger.logMessageSafely(Abstract
> Logger.java:2839)
> at
> org.apache.logging.log4j.spi.AbstractLogger.logMessage(AbstractLogger
> .java:2629)
> at
> org.apache.logging.log4j.spi.AbstractLogger.logIfEnabled(AbstractLogg
> er.java:2392)
> at org.apache.logging.slf4j.Log4jLogger.debug(Log4jLogger.java:128)
> at
> org.apache.hc.client5.http.impl.async.LoggingIOSession.enqueue(Loggin
> gIOSession.java:83)
> at
> org.apache.hc.core5.reactor.InternalDataChannel.enqueue(InternalDataC
> hannel.java:286)
> at
> org.apache.hc.client5.http.impl.nio.DefaultManagedAsyncClientConnecti
> on.submitCommand(DefaultManagedAsyncClientConnection.java:201)
> at
> org.apache.hc.client5.http.impl.nio.PoolingAsyncClientConnectionManag
> er$InternalConnectionEndpoint.execute(PoolingAsyncClientConnectionMan
> ager.java:765)
> at
> org.apache.hc.client5.http.impl.async.InternalHttpAsyncExecRuntime.ex
> ecute(InternalHttpAsyncExecRuntime.java:298)
> at
> org.apache.hc.client5.http.impl.async.HttpAsyncMainClientExec.execute
> (HttpAsyncMainClientExec.java:295)
> at
> org.apache.hc.client5.http.impl.async.AsyncExecChainElement.execute(A
> syncExecChainElement.java:54)
> at
> org.apache.hc.client5.http.impl.async.AsyncExecChainElement$$Lambda/0
> x00007f662cfd9680.proceed(Unknown
> Source)
> at
> org.apache.hc.client5.http.impl.async.AsyncConnectExec$1.completed(As
> yncConnectExec.java:159)
> at
> org.apache.hc.client5.http.impl.async.AsyncConnectExec$1.completed(As
> yncConnectExec.java:153)
> at
> org.apache.hc.client5.http.impl.async.InternalHttpAsyncExecRuntime$1.
> completed(InternalHttpAsyncExecRuntime.java:128)
> at
> org.apache.hc.client5.http.impl.async.InternalHttpAsyncExecRuntime$1.
> completed(InternalHttpAsyncExecRuntime.java:120)
> at
> org.apache.hc.core5.concurrent.BasicFuture.completed(BasicFuture.java
> :148)
> at
> org.apache.hc.client5.http.impl.nio.PoolingAsyncClientConnectionManag
> er$3$1.leaseCompleted(PoolingAsyncClientConnectionManager.java:342)
> at
> org.apache.hc.client5.http.impl.nio.PoolingAsyncClientConnectionManag
> er$3$1.completed(PoolingAsyncClientConnectionManager.java:324)
> at
> org.apache.hc.client5.http.impl.nio.PoolingAsyncClientConnectionManag
> er$3$1.completed(PoolingAsyncClientConnectionManager.java:289)
> at
> org.apache.hc.core5.concurrent.BasicFuture.completed(BasicFuture.java
> :148)
> at
> org.apache.hc.core5.pool.StrictConnPool.fireCallbacks(StrictConnPool.
> java:401)
> at
> org.apache.hc.core5.pool.StrictConnPool.lease(StrictConnPool.java:219
> )
> at
> org.apache.hc.client5.http.impl.nio.PoolingAsyncClientConnectionManag
> er$3.<init>(PoolingAsyncClientConnectionManager.java:286)
> at
> org.apache.hc.client5.http.impl.nio.PoolingAsyncClientConnectionManag
> er.lease(PoolingAsyncClientConnectionManager.java:281)
> at
> org.apache.hc.client5.http.impl.async.InternalHttpAsyncExecRuntime.ac
> quireEndpoint(InternalHttpAsyncExecRuntime.java:115)
> at
> org.apache.hc.client5.http.impl.async.AsyncConnectExec.execute(AsyncC
> onnectExec.java:152)
> at
> org.apache.hc.client5.http.impl.async.AsyncExecChainElement.execute(A
> syncExecChainElement.java:54)
> at
> org.apache.hc.client5.http.impl.async.AsyncExecChainElement$$Lambda/0
> x00007f662cfd9680.proceed(Unknown
> Source)
> at
> org.apache.hc.client5.http.impl.async.AsyncProtocolExec.internalExecu
> te(AsyncProtocolExec.java:209)
> at
> org.apache.hc.client5.http.impl.async.AsyncProtocolExec.execute(Async
> ProtocolExec.java:174)
> at
> org.apache.hc.client5.http.impl.async.AsyncExecChainElement.execute(A
> syncExecChainElement.java:54)
> at
> org.apache.hc.client5.http.impl.async.InternalAbstractHttpAsyncClient
> $$Lambda/0x00007f662cfd8fd0.proceed(Unknown
> Source)
> at
> org.apache.hc.client5.http.impl.async.InternalAbstractHttpAsyncClient
> .executeImmediate(InternalAbstractHttpAsyncClient.java:389)
> at
> org.apache.hc.client5.http.impl.async.InternalAbstractHttpAsyncClient
> .lambda$doExecute$0(InternalAbstractHttpAsyncClient.java:245)
> at
> org.apache.hc.client5.http.impl.async.InternalAbstractHttpAsyncClient
> $$Lambda/0x00007f662cfd2e30.sendRequest(Unknown
> Source)
> at
> org.apache.hc.core5.http.nio.support.BasicRequestProducer.sendRequest
> (BasicRequestProducer.java:93)
> at
> org.apache.hc.client5.http.impl.async.InternalAbstractHttpAsyncClient
> .doExecute(InternalAbstractHttpAsyncClient.java:209)
> at
> org.apache.hc.client5.http.impl.async.CloseableHttpAsyncClient.execut
> e(CloseableHttpAsyncClient.java:96)
> at
> org.apache.hc.client5.http.impl.async.CloseableHttpAsyncClient.execut
> e(CloseableHttpAsyncClient.java:106)
> at
> org.apache.hc.client5.http.impl.async.CloseableHttpAsyncClient.execut
> e(CloseableHttpAsyncClient.java:115)
> at
> com.google.firebase.internal.ApacheHttp2Request.execute(ApacheHttp2Re
> quest.java:98)
> at
> com.google.api.client.http.HttpRequest.execute(HttpRequest.java:1012)
> at
> com.google.firebase.internal.ErrorHandlingHttpClient.send(ErrorHandli
> ngHttpClient.java:97)
> at
> com.google.firebase.internal.ErrorHandlingHttpClient.sendAndParse(Err
> orHandlingHttpClient.java:72)
> at
> com.google.firebase.messaging.FirebaseMessagingClientImpl.sendSingleR
> equest(FirebaseMessagingClientImpl.java:127)
> at
> com.google.firebase.messaging.FirebaseMessagingClientImpl.send(Fireba
> seMessagingClientImpl.java:113)
> at
> com.google.firebase.messaging.FirebaseMessaging$1.execute(FirebaseMes
> saging.java:142)
> at
> com.google.firebase.messaging.FirebaseMessaging$1.execute(FirebaseMes
> saging.java:139)
> at
> com.google.firebase.internal.CallableOperation.call(CallableOperation
> .java:36)
> at
> com.google.common.util.concurrent.TrustedListenableFutureTask$Trusted
> FutureInterruptibleTask.runInterruptibly(TrustedListenableFutureTask.
> java:131)
> at
> com.google.common.util.concurrent.InterruptibleTask.run(Interruptible
> Task.java:75)
> at
> com.google.common.util.concurrent.TrustedListenableFutureTask.run(Tru
> stedListenableFutureTask.java:82)
> "httpclient-dispatch-1":
> at
> org.apache.logging.log4j.core.async.AsyncLoggerDisruptor.enqueueLogMe
> ssageWhenQueueFull(AsyncLoggerDisruptor.java:273)
> - waiting to lock <0x00000000c1f1d5e0> (a java.lang.Object)
> at
> org.apache.logging.log4j.core.async.AsyncLogger.handleRingBufferFull(
> AsyncLogger.java:291)
> at
> org.apache.logging.log4j.core.async.AsyncLogger.publish(AsyncLogger.j
> ava:275)
> at
> org.apache.logging.log4j.core.async.AsyncLogger.logWithThreadLocalTra
> nslator(AsyncLogger.java:270)
> at
> org.apache.logging.log4j.core.async.AsyncLogger.access$000(AsyncLogge
> r.java:70)
> at
> org.apache.logging.log4j.core.async.AsyncLogger$1.log(AsyncLogger.jav
> a:177)
> at
> org.apache.logging.log4j.core.async.AsyncLogger.log(AsyncLogger.java:
> 148)
> at
> org.apache.logging.log4j.spi.AbstractLogger.tryLogMessage(AbstractLog
> ger.java:2904)
> at
> org.apache.logging.log4j.spi.AbstractLogger.logMessageTrackRecursion(
> AbstractLogger.java:2857)
> at
> org.apache.logging.log4j.spi.AbstractLogger.logMessageSafely(Abstract
> Logger.java:2839)
> at
> org.apache.logging.log4j.spi.AbstractLogger.logMessage(AbstractLogger
> .java:2646)
> at
> org.apache.logging.log4j.spi.AbstractLogger.logIfEnabled(AbstractLogg
> er.java:2413)
> at org.apache.logging.slf4j.Log4jLogger.debug(Log4jLogger.java:123)
> at
> org.apache.hc.client5.http.impl.async.LogAppendable.append(LogAppenda
> ble.java:63)
> at
> org.apache.hc.client5.http.impl.async.LogAppendable.append(LogAppenda
> ble.java:55)
> at
> org.apache.hc.client5.http.impl.async.LogAppendable.append(LogAppenda
> ble.java:49)
> at
> org.apache.hc.core5.http2.frame.FramePrinter.printData(FramePrinter.j
> ava:209)
> at
> org.apache.hc.core5.http2.frame.FramePrinter.printPayload(FramePrinte
> r.java:174)
> at
> org.apache.hc.client5.http.impl.async.HttpAsyncClientProtocolNegotiat
> ionStarter$2.logFramePayload(HttpAsyncClientProtocolNegotiationStarte
> r.java:183)
> at
> org.apache.hc.client5.http.impl.async.HttpAsyncClientProtocolNegotiat
> ionStarter$2.onFrameOutput(HttpAsyncClientProtocolNegotiationStarter.
> java:227)
> at
> org.apache.hc.core5.http2.impl.nio.AbstractH2StreamMultiplexer.stream
> DataFrame(AbstractH2StreamMultiplexer.java:344)
> at
> org.apache.hc.core5.http2.impl.nio.AbstractH2StreamMultiplexer.stream
> Data(AbstractH2StreamMultiplexer.java:362)
> at
> org.apache.hc.core5.http2.impl.nio.AbstractH2StreamMultiplexer.access
> $1200(AbstractH2StreamMultiplexer.java:98)
> at
> org.apache.hc.core5.http2.impl.nio.AbstractH2StreamMultiplexer$H2Stre
> amChannelImpl.write(AbstractH2StreamMultiplexer.java:1477)
> at
> org.apache.hc.core5.http2.impl.nio.ClientH2StreamHandler$1.write(Clie
> ntH2StreamHandler.java:92)
> at
> org.apache.hc.client5.http.impl.async.LoggingAsyncClientExchangeHandl
> er$1.write(LoggingAsyncClientExchangeHandler.java:100)
> at
> org.apache.hc.client5.http.impl.async.HttpAsyncMainClientExec$1$1.wri
> te(HttpAsyncMainClientExec.java:176)
> at
> com.google.firebase.internal.ApacheHttp2AsyncEntityProducer.produce(A
> pacheHttp2AsyncEntityProducer.java:117)
> at
> org.apache.hc.core5.http.nio.support.BasicRequestProducer.produce(Bas
> icRequestProducer.java:104)
> at
> org.apache.hc.client5.http.impl.async.InternalAbstractHttpAsyncClient
> $3.produce(InternalAbstractHttpAsyncClient.java:300)
> at
> org.apache.hc.client5.http.impl.async.HttpAsyncMainClientExec$1.produ
> ce(HttpAsyncMainClientExec.java:167)
> at
> org.apache.hc.client5.http.impl.async.LoggingAsyncClientExchangeHandl
> er.produce(LoggingAsyncClientExchangeHandler.java:88)
> at
> org.apache.hc.core5.http2.impl.nio.ClientH2StreamHandler.commitReques
> t(ClientH2StreamHandler.java:157)
> at
> org.apache.hc.core5.http2.impl.nio.ClientH2StreamHandler.lambda$produ
> ceOutput$0(ClientH2StreamHandler.java:172)
> at
> org.apache.hc.core5.http2.impl.nio.ClientH2StreamHandler$$Lambda/0x00
> 007f662cffb878.sendRequest(Unknown
> Source)
> at
> org.apache.hc.client5.http.impl.async.LoggingAsyncClientExchangeHandl
> er.lambda$produceRequest$0(LoggingAsyncClientExchangeHandler.java:74)
> at
> org.apache.hc.client5.http.impl.async.LoggingAsyncClientExchangeHandl
> er$$Lambda/0x00007f662cffbaa0.sendRequest(Unknown
> Source)
> at
> org.apache.hc.client5.http.impl.async.HttpAsyncMainClientExec$1.produ
> ceRequest(HttpAsyncMainClientExec.java:154)
> at
> org.apache.hc.client5.http.impl.async.LoggingAsyncClientExchangeHandl
> er.produceRequest(LoggingAsyncClientExchangeHandler.java:69)
> at
> org.apache.hc.core5.http2.impl.nio.ClientH2StreamHandler.produceOutpu
> t(ClientH2StreamHandler.java:172)
> at
> org.apache.hc.core5.http2.impl.nio.AbstractH2StreamMultiplexer$H2Stre
> am.produceOutput(AbstractH2StreamMultiplexer.java:1675)
> at
> org.apache.hc.core5.http2.impl.nio.AbstractH2StreamMultiplexer.proces
> sPendingCommands(AbstractH2StreamMultiplexer.java:654)
> at
> org.apache.hc.core5.http2.impl.nio.AbstractH2StreamMultiplexer.onOutp
> ut(AbstractH2StreamMultiplexer.java:518)
> at
> org.apache.hc.core5.http2.impl.nio.AbstractH2IOEventHandler.outputRea
> dy(AbstractH2IOEventHandler.java:74)
> at
> org.apache.hc.core5.http2.impl.nio.ClientH2IOEventHandler.outputReady
> (ClientH2IOEventHandler.java:39)
> at
> org.apache.hc.client5.http.impl.async.LoggingIOSession$1.outputReady(
> LoggingIOSession.java:243)
> at
> org.apache.hc.core5.reactor.ssl.SSLIOSession.encryptData(SSLIOSession
> .java:658)
> at
> org.apache.hc.core5.reactor.ssl.SSLIOSession.access$400(SSLIOSession.
> java:74)
> at
> org.apache.hc.core5.reactor.ssl.SSLIOSession$1.outputReady(SSLIOSessi
> on.java:210)
> at
> org.apache.hc.core5.reactor.InternalDataChannel.onIOEvent(InternalDat
> aChannel.java:149)
> at
> org.apache.hc.core5.reactor.InternalChannel.handleIOEvent(InternalCha
> nnel.java:51)
> at
> org.apache.hc.core5.reactor.SingleCoreIOReactor.processEvents(SingleC
> oreIOReactor.java:176)
> at
> org.apache.hc.core5.reactor.SingleCoreIOReactor.doExecute(SingleCoreI
> OReactor.java:125)
> at
> org.apache.hc.core5.reactor.AbstractSingleCoreIOReactor.execute(Abstr
> actSingleCoreIOReactor.java:92)
> at
> org.apache.hc.core5.reactor.IOReactorWorker.run(IOReactorWorker.java:
> 44)
> ```
> 
> 
> Andrey Turbanov
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [email protected]
> For additional commands, e-mail: [email protected]

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to