]> granicus.if.org Git - postgresql/commitdiff
Avoid terminating the postmaster on a number of "can't happen" cases during
authorMagnus Hagander <magnus@hagander.net>
Thu, 6 Aug 2009 09:50:22 +0000 (09:50 +0000)
committerMagnus Hagander <magnus@hagander.net>
Thu, 6 Aug 2009 09:50:22 +0000 (09:50 +0000)
backend startup on Win32. Instead, log the error and just forget about
the potentially dangling process, since we can't do anything about it anyway.

src/backend/postmaster/postmaster.c

index 58cb5cb989f71b17c1151e7a901282505bfd95eb..e558348c964cd5406996c4ef14489ecbab96fd18 100644 (file)
@@ -37,7 +37,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/postmaster/postmaster.c,v 1.585 2009/07/24 20:12:42 mha Exp $
+ *       $PostgreSQL: pgsql/src/backend/postmaster/postmaster.c,v 1.586 2009/08/06 09:50:22 mha Exp $
  *
  * NOTES
  *
@@ -3627,7 +3627,7 @@ internal_forkexec(int argc, char *argv[], Port *port)
                 * mess with the half-started process
                 */
                if (!TerminateProcess(pi.hProcess, 255))
-                       ereport(ERROR,
+                       ereport(LOG,
                                        (errmsg_internal("could not terminate unstarted process: error code %d",
                                                                         (int) GetLastError())));
                CloseHandle(pi.hProcess);
@@ -3654,7 +3654,7 @@ internal_forkexec(int argc, char *argv[], Port *port)
                 * process and give up.
                 */
                if (!TerminateProcess(pi.hProcess, 255))
-                       ereport(ERROR,
+                       ereport(LOG,
                                        (errmsg_internal("could not terminate process that failed to reserve memory: error code %d",
                                                                         (int) GetLastError())));
                CloseHandle(pi.hProcess);
@@ -3671,7 +3671,7 @@ internal_forkexec(int argc, char *argv[], Port *port)
        {
                if (!TerminateProcess(pi.hProcess, 255))
                {
-                       ereport(ERROR,
+                       ereport(LOG,
                                        (errmsg_internal("could not terminate unstartable process: error code %d",
                                                                         (int) GetLastError())));
                        CloseHandle(pi.hProcess);
@@ -3680,7 +3680,7 @@ internal_forkexec(int argc, char *argv[], Port *port)
                }
                CloseHandle(pi.hProcess);
                CloseHandle(pi.hThread);
-               ereport(ERROR,
+               ereport(LOG,
                                (errmsg_internal("could not resume thread of unstarted process: error code %d",
                                                                 (int) GetLastError())));
                return -1;
@@ -4430,8 +4430,8 @@ extern int        pgStatSock;
 #define write_inheritable_socket(dest, src, childpid) (*(dest) = (src))
 #define read_inheritable_socket(dest, src) (*(dest) = *(src))
 #else
-static void write_duplicated_handle(HANDLE *dest, HANDLE src, HANDLE child);
-static void write_inheritable_socket(InheritableSocket *dest, SOCKET src,
+static bool write_duplicated_handle(HANDLE *dest, HANDLE src, HANDLE child);
+static bool write_inheritable_socket(InheritableSocket *dest, SOCKET src,
                                                 pid_t childPid);
 static void read_inheritable_socket(SOCKET *dest, InheritableSocket *src);
 #endif
@@ -4448,7 +4448,8 @@ save_backend_variables(BackendParameters *param, Port *port,
 #endif
 {
        memcpy(&param->port, port, sizeof(Port));
-       write_inheritable_socket(&param->portsocket, port->sock, childPid);
+       if (!write_inheritable_socket(&param->portsocket, port->sock, childPid))
+               return false;
 
        strlcpy(param->DataDir, DataDir, MAXPGPATH);
 
@@ -4469,7 +4470,8 @@ save_backend_variables(BackendParameters *param, Port *port,
        param->ProcGlobal = ProcGlobal;
        param->AuxiliaryProcs = AuxiliaryProcs;
        param->PMSignalState = PMSignalState;
-       write_inheritable_socket(&param->pgStatSock, pgStatSock, childPid);
+       if (!write_inheritable_socket(&param->pgStatSock, pgStatSock, childPid))
+               return false;
 
        param->PostmasterPid = PostmasterPid;
        param->PgStartTime = PgStartTime;
@@ -4479,9 +4481,10 @@ save_backend_variables(BackendParameters *param, Port *port,
 
 #ifdef WIN32
        param->PostmasterHandle = PostmasterHandle;
-       write_duplicated_handle(&param->initial_signal_pipe,
+       if (!write_duplicated_handle(&param->initial_signal_pipe,
                                                        pgwin32_create_signal_listener(childPid),
-                                                       childProcess);
+                                                       childProcess))
+               return false;
 #endif
 
        memcpy(&param->syslogPipe, &syslogPipe, sizeof(syslogPipe));
@@ -4501,7 +4504,7 @@ save_backend_variables(BackendParameters *param, Port *port,
  * Duplicate a handle for usage in a child process, and write the child
  * process instance of the handle to the parameter file.
  */
-static void
+static bool
 write_duplicated_handle(HANDLE *dest, HANDLE src, HANDLE childProcess)
 {
        HANDLE          hChild = INVALID_HANDLE_VALUE;
@@ -4513,11 +4516,15 @@ write_duplicated_handle(HANDLE *dest, HANDLE src, HANDLE childProcess)
                                                 0,
                                                 TRUE,
                                                 DUPLICATE_CLOSE_SOURCE | DUPLICATE_SAME_ACCESS))
-               ereport(ERROR,
+       {
+               ereport(LOG,
                                (errmsg_internal("could not duplicate handle to be written to backend parameter file: error code %d",
                                                                 (int) GetLastError())));
+               return false;
+       }
 
        *dest = hChild;
+       return true;
 }
 
 /*
@@ -4527,7 +4534,7 @@ write_duplicated_handle(HANDLE *dest, HANDLE src, HANDLE childProcess)
  * common on Windows (antivirus, firewalls, download managers etc) break
  * straight socket inheritance.
  */
-static void
+static bool
 write_inheritable_socket(InheritableSocket *dest, SOCKET src, pid_t childpid)
 {
        dest->origsocket = src;
@@ -4535,10 +4542,14 @@ write_inheritable_socket(InheritableSocket *dest, SOCKET src, pid_t childpid)
        {
                /* Actual socket */
                if (WSADuplicateSocket(src, childpid, &dest->wsainfo) != 0)
-                       ereport(ERROR,
+               {
+                       ereport(LOG,
                                        (errmsg("could not duplicate socket %d for use in backend: error code %d",
                                                        src, WSAGetLastError())));
+                       return false;
+               }
        }
+       return true;
 }
 
 /*