diff --git a/src/backend/libpq/pqcomm.c b/src/backend/libpq/pqcomm.c index 34efac4..711ca2f 100644 --- a/src/backend/libpq/pqcomm.c +++ b/src/backend/libpq/pqcomm.c @@ -713,6 +713,8 @@ StreamConnection(pgsocket server_fd, Port *port) if (!IS_AF_UNIX(port->laddr.addr.ss_family)) { int on; + int oldopt; + int optlen; #ifdef TCP_NODELAY on = 1; @@ -734,16 +736,34 @@ StreamConnection(pgsocket server_fd, Port *port) #ifdef WIN32 /* - * This is a Win32 socket optimization. The ideal size is 32k. + * This is a Win32 socket optimization. The ideal size is 32k except + * for Windows 2012(and later versions). * http://support.microsoft.com/kb/823764/EN-US/ + * On Windows 2012, the default TCP send buffer size is 64k and with + * dynamic send buffering. And, the default setting is better. + * (Note:Dynamic send buffering will be disabled if sets the SO_SNDBUF + * socket option.) + * https://msdn.microsoft.com/en-us/library/windows/desktop/bb736549(v=vs.85).aspx + * On Windows 2008(and earlier versions), the default TCP send buffer + * size is 8k, enlarging it to 32k is better. */ - on = PQ_SEND_BUFFER_SIZE * 4; - if (setsockopt(port->sock, SOL_SOCKET, SO_SNDBUF, (char *) &on, - sizeof(on)) < 0) + optlen = sizeof(oldopt); + if (getsockopt(server_fd, SOL_SOCKET, SO_SNDBUF, (char *) &oldopt, + &optlen) < 0) { - elog(LOG, "setsockopt(SO_SNDBUF) failed: %m"); + elog(LOG, "getsockopt(SO_SNDBUF) failed: %m"); return STATUS_ERROR; } + on = PQ_SEND_BUFFER_SIZE * 4; + if(oldopt < on) + { + if (setsockopt(port->sock, SOL_SOCKET, SO_SNDBUF, (char *) &on, + sizeof(on)) < 0) + { + elog(LOG, "setsockopt(SO_SNDBUF) failed: %m"); + return STATUS_ERROR; + } + } #endif /*