Skip to content

fix for failed to enlarge network buffer error #389

New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

Merged
merged 1 commit into from
Jul 14, 2017
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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() ) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Would it make sense to limit write attempts here? Could execution get stuck here when unable to write?

Copy link
Contributor Author

@ali-ince ali-ince Jul 13, 2017

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, I also thought on adding a limit but;

If we end up in a position where we could not write anything on a socket, it most probably points a resource starvation on the computer either cpu or network buffers related. In either case the problem lies somewhere else and if we throw some exception here - where theoretically it is not an error - we would break the runtime and eventually become a point of failure.

We also loop on the same condition at line on the same method, so I thought this would also not be a problem.

Does it make sense?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I found this argument is fair.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Makes sense, and if socket is completely broken exception will be thrown by #channelWrite () method.

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:
Expand Down