On Windows, also call shutdown() while closing the client socket.
authorTom Lane
Tue, 7 Dec 2021 18:34:06 +0000 (13:34 -0500)
committerTom Lane
Tue, 7 Dec 2021 18:34:06 +0000 (13:34 -0500)
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

src/backend/libpq/pqcomm.c

index 96ab37c7d0ede11264b23fda1f283836a6512870..4c37df09cffce6a9e923120514c0fbfc9f15e0ec 100644 (file)
@@ -287,7 +287,8 @@ socket_close(int code, Datum arg)
         * 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
         * 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
         * have finished all externally-visible shutdown activities, so that
@@ -295,6 +296,7 @@ socket_close(int code, Datum arg)
         * Windows too.  But it's a lot more fragile than the other way.
         */
 #ifdef WIN32
+       shutdown(MyProcPort->sock, SD_SEND);
        closesocket(MyProcPort->sock);
 #endif