]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
On win32, don't use SO_REUSEADDR for TCP sockets.
authorMagnus Hagander <magnus@hagander.net>
Mon, 4 Jun 2007 11:59:34 +0000 (11:59 +0000)
committerMagnus Hagander <magnus@hagander.net>
Mon, 4 Jun 2007 11:59:34 +0000 (11:59 +0000)
Per failure on buildfarm member baiji and subsequent discussion.

src/backend/libpq/pqcomm.c

index d4475e8b56c6f2ced5448e39dbb16bedb0a90f67..9297bb26302a85c69116f94005cbb40d9fecdb3b 100644 (file)
@@ -30,7 +30,7 @@
  * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- *     $PostgreSQL: pgsql/src/backend/libpq/pqcomm.c,v 1.182.2.1 2006/01/24 16:38:50 tgl Exp $
+ *     $PostgreSQL: pgsql/src/backend/libpq/pqcomm.c,v 1.182.2.2 2007/06/04 11:59:34 mha Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -337,6 +337,16 @@ StreamServerPort(int family, char *hostName, unsigned short portNumber,
                        continue;
                }
 
+#ifndef WIN32
+               /*
+                * Without the SO_REUSEADDR flag, a new postmaster can't be started right away after
+                * a stop or crash, giving "address already in use" error on TCP ports.
+                *
+                * On win32, however, this behavior only happens if the SO_EXLUSIVEADDRUSE is set.
+                * With SO_REUSEADDR, win32 allows multiple servers to listen on the same address,
+                * resulting in unpredictable behavior. With no flags at all, win32 behaves as
+                * Unix with SO_REUSEADDR.
+                */
                if (!IS_AF_UNIX(addr->ai_family))
                {
                        if ((setsockopt(fd, SOL_SOCKET, SO_REUSEADDR,
@@ -349,6 +359,7 @@ StreamServerPort(int family, char *hostName, unsigned short portNumber,
                                continue;
                        }
                }
+#endif
 
 #ifdef IPV6_V6ONLY
                if (addr->ai_family == AF_INET6)