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]
