summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Benvenuto <mark.benvenuto@mongodb.com>2015-01-12 18:30:08 -0500
committerMark Benvenuto <mark.benvenuto@mongodb.com>2015-01-15 17:06:16 -0500
commit44c31ca911125b3b16e5279905a9516f4f05feee (patch)
tree759cb6752841544c27059ea772c5afefd2c7c4aa
parentab47afeb030b42097acede562760c3a2ca785086 (diff)
downloadmongo-44c31ca911125b3b16e5279905a9516f4f05feee.tar.gz
SERVER-16461: Set sub-second timeouts on Windows correctly
-rw-r--r--src/mongo/util/net/sock.cpp25
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;