Created
March 6, 2015 14:15
-
-
Save wk-j/1d7501faf39f0ddb6940 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* Due to a bug in Windows Sockets (observed on NT and Windows | |
* 2000) it may be necessary to retry the send. The issue is that | |
* on blocking sockets send/WSASend is supposed to block if there | |
* is insufficient buffer space available. If there are a large | |
* number of threads blocked on write due to congestion then it's | |
* possile to hit the NT/2000 bug whereby send returns WSAENOBUFS. | |
* The workaround we use is to retry the send. If we have a | |
* large buffer to send (>2k) then we retry with a maximum of | |
* 2k buffer. If we hit the issue with <=2k buffer then we backoff | |
* for 1 second and retry again. We repeat this up to a reasonable | |
* limit before bailing out and throwing an exception. In load | |
* conditions we've observed that the send will succeed after 2-3 | |
* attempts but this depends on network buffers associated with | |
* other sockets draining. | |
*/ | |
if (WSAGetLastError() == WSAENOBUFS) { | |
if (llen > MAX_BUFFER_LEN) { | |
buflen = MAX_BUFFER_LEN; | |
chunkLen = MAX_BUFFER_LEN; | |
llen = MAX_BUFFER_LEN; | |
continue; | |
} | |
if (retry >= 30) { | |
JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", | |
"No buffer space available - exhausted attempts to queue buffer"); | |
if (bufP != BUF) { | |
free(bufP); | |
} | |
return; | |
} | |
Sleep(1000); | |
retry++; | |
continue; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment