From a78e441dc69486fc5b7649f1d11e396b5ace3d9f Mon Sep 17 00:00:00 2001 From: Ali Ince Date: Wed, 12 Jul 2017 22:53:21 +0100 Subject: [PATCH] changed TLSSocketChannel#wrap to agressively do channelWrite upon BUFFER_OVERFLOW --- .../internal/security/TLSSocketChannel.java | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/driver/src/main/java/org/neo4j/driver/internal/security/TLSSocketChannel.java b/driver/src/main/java/org/neo4j/driver/internal/security/TLSSocketChannel.java index 5abea24f60..38daeb8421 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/security/TLSSocketChannel.java +++ b/driver/src/main/java/org/neo4j/driver/internal/security/TLSSocketChannel.java @@ -345,18 +345,22 @@ private HandshakeStatus wrap( ByteBuffer buffer ) throws IOException, ClientExce } else { + logger.debug( "Network output buffer doesn't need enlarging, flushing data to the channel instead to open up space on the buffer." ); // flush as much data as possible cipherOut.flip(); - if ( channelWrite( cipherOut ) == 0 ) - { - throw new ClientException( format( - "Failed to enlarge network buffer from %s to %s. This is either because the " + - "new size is however less than the old size, or because the application " + - "buffer size %s is so big that the application data still cannot fit into the " + - "new network buffer.", curNetSize, netSize, buffer.capacity() ) ); + while ( cipherOut.hasRemaining() ) { + int written = channelWrite( cipherOut ); + + if (written > 0) { + break; + } + + logger.debug( "having difficulty flushing data (network contention on local computer?). will continue trying after yielding execution." ); + Thread.yield(); + + logger.debug( "nothing written to the underlying channel (network output buffer is full?), will try till we can." ); } cipherOut.compact(); - logger.debug( "Network output buffer couldn't be enlarged, flushing data to the channel instead." ); } break; default: