Commit ea5ecdad authored by Tom Lane's avatar Tom Lane

On Windows, also call shutdown() while closing the client socket.

Further experimentation shows that commit 6051857fc is not sufficient
when using (some versions of?) OpenSSL.  The reason is obscure, but
calling shutdown(socket, SD_SEND) improves matters.

Per testing by Andrew Dunstan and Alexander Lakhin.
Back-patch as before.

Discussion: https://postgr.es/m/af5e0bf3-6a61-bb97-6cba-061ddf22ff6b@dunslane.net
parent b6360aa4
...@@ -287,7 +287,8 @@ socket_close(int code, Datum arg) ...@@ -287,7 +287,8 @@ socket_close(int code, Datum arg)
* not yet sent to the client. (This is a flat-out violation of the * not yet sent to the client. (This is a flat-out violation of the
* TCP RFCs, but count on Microsoft not to care about that.) To get * TCP RFCs, but count on Microsoft not to care about that.) To get
* the spec-compliant "graceful shutdown" behavior, we must invoke * the spec-compliant "graceful shutdown" behavior, we must invoke
* closesocket() explicitly. * closesocket() explicitly. When using OpenSSL, it seems that clean
* shutdown also requires an explicit shutdown() call.
* *
* This code runs late enough during process shutdown that we should * This code runs late enough during process shutdown that we should
* have finished all externally-visible shutdown activities, so that * have finished all externally-visible shutdown activities, so that
...@@ -295,6 +296,7 @@ socket_close(int code, Datum arg) ...@@ -295,6 +296,7 @@ socket_close(int code, Datum arg)
* Windows too. But it's a lot more fragile than the other way. * Windows too. But it's a lot more fragile than the other way.
*/ */
#ifdef WIN32 #ifdef WIN32
shutdown(MyProcPort->sock, SD_SEND);
closesocket(MyProcPort->sock); closesocket(MyProcPort->sock);
#endif #endif
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment