diff options
author | Mark Benvenuto <mark.benvenuto@mongodb.com> | 2015-01-12 18:30:08 -0500 |
---|---|---|
committer | Mark Benvenuto <mark.benvenuto@mongodb.com> | 2015-01-15 17:06:16 -0500 |
commit | 44c31ca911125b3b16e5279905a9516f4f05feee (patch) | |
tree | 759cb6752841544c27059ea772c5afefd2c7c4aa | |
parent | ab47afeb030b42097acede562760c3a2ca785086 (diff) | |
download | mongo-44c31ca911125b3b16e5279905a9516f4f05feee.tar.gz |
SERVER-16461: Set sub-second timeouts on Windows correctly
-rw-r--r-- | src/mongo/util/net/sock.cpp | 25 |
1 files changed, 16 insertions, 9 deletions
diff --git a/src/mongo/util/net/sock.cpp b/src/mongo/util/net/sock.cpp index 95eebd75096..a21f9a97ccb 100644 --- a/src/mongo/util/net/sock.cpp +++ b/src/mongo/util/net/sock.cpp @@ -73,20 +73,27 @@ namespace mongo { static bool ipv6 = false; void enableIPv6(bool state) { ipv6 = state; } bool IPv6Enabled() { return ipv6; } - + void setSockTimeouts(int sock, double secs) { - struct timeval tv; - tv.tv_sec = (int)secs; - tv.tv_usec = (int)((long long)(secs*1000*1000) % (1000*1000)); bool report = shouldLog(logger::LogSeverity::Debug(4)); DEV report = true; #if defined(_WIN32) - tv.tv_sec *= 1000; // Windows timeout is a DWORD, in milliseconds. - int status = setsockopt( sock, SOL_SOCKET, SO_RCVTIMEO, (char *) &tv.tv_sec, sizeof(DWORD) ) == 0; - if( report && (status == SOCKET_ERROR) ) log() << "unable to set SO_RCVTIMEO" << endl; - status = setsockopt( sock, SOL_SOCKET, SO_SNDTIMEO, (char *) &tv.tv_sec, sizeof(DWORD) ) == 0; - DEV if( report && (status == SOCKET_ERROR) ) log() << "unable to set SO_SNDTIMEO" << endl; + DWORD timeout = secs * 1000; // Windows timeout is a DWORD, in milliseconds. + int status = + setsockopt( sock, SOL_SOCKET, SO_RCVTIMEO, + reinterpret_cast<char*>(&timeout), sizeof(DWORD) ); + if (report && (status == SOCKET_ERROR)) + log() << "unable to set SO_RCVTIMEO: " + << errnoWithDescription(WSAGetLastError()) << endl; + status = setsockopt( sock, SOL_SOCKET, SO_SNDTIMEO, + reinterpret_cast<char*>(&timeout), sizeof(DWORD) ); + DEV if (report && (status == SOCKET_ERROR)) + log() << "unable to set SO_SNDTIMEO: " + << errnoWithDescription(WSAGetLastError()) << endl; #else + struct timeval tv; + tv.tv_sec = (int)secs; + tv.tv_usec = (int)((long long)(secs*1000*1000) % (1000*1000)); bool ok = setsockopt( sock, SOL_SOCKET, SO_RCVTIMEO, (char *) &tv, sizeof(tv) ) == 0; if( report && !ok ) log() << "unable to set SO_RCVTIMEO" << endl; ok = setsockopt( sock, SOL_SOCKET, SO_SNDTIMEO, (char *) &tv, sizeof(tv) ) == 0; |