On Tue, Jul 28, 2009 at 15:45, Tom Lane<t...@sss.pgh.pa.us> wrote: > Magnus Hagander <mag...@hagander.net> writes: >> On Mon, Jul 27, 2009 at 16:14, Tom Lane<t...@sss.pgh.pa.us> wrote: >>> I'm not really insisting on a redesign. I'm talking about the places >>> where the code author appears not to have understood that ERROR means >>> FATAL, because the code keeps plugging on after it anyway. As far as >>> I can see, using ERROR at lines 3630, 3657, 3674, and 3693 is just >>> plain bogus, and changing to LOG there requires no other fixing. > >> But. I'll look into cleaning those up for HEAD anyway, but due to lack >> of reports I think we should skip backpatch. Reasonable? > > Fair enough.
Here's what I came up with. Seems ok? -- Magnus Hagander Me: http://www.hagander.net/ Work: http://www.redpill-linpro.com/
*** a/src/backend/postmaster/postmaster.c --- b/src/backend/postmaster/postmaster.c *************** *** 3627,3633 **** internal_forkexec(int argc, char *argv[], Port *port) * mess with the half-started process */ if (!TerminateProcess(pi.hProcess, 255)) ! ereport(ERROR, (errmsg_internal("could not terminate unstarted process: error code %d", (int) GetLastError()))); CloseHandle(pi.hProcess); --- 3627,3633 ---- * mess with the half-started process */ if (!TerminateProcess(pi.hProcess, 255)) ! ereport(LOG, (errmsg_internal("could not terminate unstarted process: error code %d", (int) GetLastError()))); CloseHandle(pi.hProcess); *************** *** 3654,3660 **** internal_forkexec(int argc, char *argv[], Port *port) * process and give up. */ if (!TerminateProcess(pi.hProcess, 255)) ! ereport(ERROR, (errmsg_internal("could not terminate process that failed to reserve memory: error code %d", (int) GetLastError()))); CloseHandle(pi.hProcess); --- 3654,3660 ---- * process and give up. */ if (!TerminateProcess(pi.hProcess, 255)) ! ereport(LOG, (errmsg_internal("could not terminate process that failed to reserve memory: error code %d", (int) GetLastError()))); CloseHandle(pi.hProcess); *************** *** 3671,3677 **** internal_forkexec(int argc, char *argv[], Port *port) { if (!TerminateProcess(pi.hProcess, 255)) { ! ereport(ERROR, (errmsg_internal("could not terminate unstartable process: error code %d", (int) GetLastError()))); CloseHandle(pi.hProcess); --- 3671,3677 ---- { if (!TerminateProcess(pi.hProcess, 255)) { ! ereport(LOG, (errmsg_internal("could not terminate unstartable process: error code %d", (int) GetLastError()))); CloseHandle(pi.hProcess); *************** *** 3680,3686 **** internal_forkexec(int argc, char *argv[], Port *port) } CloseHandle(pi.hProcess); CloseHandle(pi.hThread); ! ereport(ERROR, (errmsg_internal("could not resume thread of unstarted process: error code %d", (int) GetLastError()))); return -1; --- 3680,3686 ---- } CloseHandle(pi.hProcess); CloseHandle(pi.hThread); ! ereport(LOG, (errmsg_internal("could not resume thread of unstarted process: error code %d", (int) GetLastError()))); return -1; *************** *** 4430,4437 **** 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, pid_t childPid); static void read_inheritable_socket(SOCKET *dest, InheritableSocket *src); #endif --- 4430,4437 ---- #define write_inheritable_socket(dest, src, childpid) (*(dest) = (src)) #define read_inheritable_socket(dest, src) (*(dest) = *(src)) #else ! 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,4454 **** save_backend_variables(BackendParameters *param, Port *port, #endif { memcpy(¶m->port, port, sizeof(Port)); ! write_inheritable_socket(¶m->portsocket, port->sock, childPid); strlcpy(param->DataDir, DataDir, MAXPGPATH); --- 4448,4455 ---- #endif { memcpy(¶m->port, port, sizeof(Port)); ! if (!write_inheritable_socket(¶m->portsocket, port->sock, childPid)) ! return false; strlcpy(param->DataDir, DataDir, MAXPGPATH); *************** *** 4469,4475 **** save_backend_variables(BackendParameters *param, Port *port, param->ProcGlobal = ProcGlobal; param->AuxiliaryProcs = AuxiliaryProcs; param->PMSignalState = PMSignalState; ! write_inheritable_socket(¶m->pgStatSock, pgStatSock, childPid); param->PostmasterPid = PostmasterPid; param->PgStartTime = PgStartTime; --- 4470,4477 ---- param->ProcGlobal = ProcGlobal; param->AuxiliaryProcs = AuxiliaryProcs; param->PMSignalState = PMSignalState; ! if (!write_inheritable_socket(¶m->pgStatSock, pgStatSock, childPid)) ! return false; param->PostmasterPid = PostmasterPid; param->PgStartTime = PgStartTime; *************** *** 4479,4487 **** save_backend_variables(BackendParameters *param, Port *port, #ifdef WIN32 param->PostmasterHandle = PostmasterHandle; ! write_duplicated_handle(¶m->initial_signal_pipe, pgwin32_create_signal_listener(childPid), ! childProcess); #endif memcpy(¶m->syslogPipe, &syslogPipe, sizeof(syslogPipe)); --- 4481,4490 ---- #ifdef WIN32 param->PostmasterHandle = PostmasterHandle; ! if (!write_duplicated_handle(¶m->initial_signal_pipe, pgwin32_create_signal_listener(childPid), ! childProcess)) ! return false; #endif memcpy(¶m->syslogPipe, &syslogPipe, sizeof(syslogPipe)); *************** *** 4501,4507 **** 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 write_duplicated_handle(HANDLE *dest, HANDLE src, HANDLE childProcess) { HANDLE hChild = INVALID_HANDLE_VALUE; --- 4504,4510 ---- * Duplicate a handle for usage in a child process, and write the child * process instance of the handle to the parameter file. */ ! static bool write_duplicated_handle(HANDLE *dest, HANDLE src, HANDLE childProcess) { HANDLE hChild = INVALID_HANDLE_VALUE; *************** *** 4513,4523 **** write_duplicated_handle(HANDLE *dest, HANDLE src, HANDLE childProcess) 0, TRUE, DUPLICATE_CLOSE_SOURCE | DUPLICATE_SAME_ACCESS)) ! ereport(ERROR, (errmsg_internal("could not duplicate handle to be written to backend parameter file: error code %d", (int) GetLastError()))); *dest = hChild; } /* --- 4516,4530 ---- 0, TRUE, DUPLICATE_CLOSE_SOURCE | DUPLICATE_SAME_ACCESS)) ! { ! 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,4533 **** write_duplicated_handle(HANDLE *dest, HANDLE src, HANDLE childProcess) * common on Windows (antivirus, firewalls, download managers etc) break * straight socket inheritance. */ ! static void write_inheritable_socket(InheritableSocket *dest, SOCKET src, pid_t childpid) { dest->origsocket = src; --- 4534,4540 ---- * common on Windows (antivirus, firewalls, download managers etc) break * straight socket inheritance. */ ! static bool write_inheritable_socket(InheritableSocket *dest, SOCKET src, pid_t childpid) { dest->origsocket = src; *************** *** 4535,4544 **** write_inheritable_socket(InheritableSocket *dest, SOCKET src, pid_t childpid) { /* Actual socket */ if (WSADuplicateSocket(src, childpid, &dest->wsainfo) != 0) ! ereport(ERROR, (errmsg("could not duplicate socket %d for use in backend: error code %d", src, WSAGetLastError()))); } } /* --- 4542,4555 ---- { /* Actual socket */ if (WSADuplicateSocket(src, childpid, &dest->wsainfo) != 0) ! { ! ereport(LOG, (errmsg("could not duplicate socket %d for use in backend: error code %d", src, WSAGetLastError()))); + return false; + } } + return true; } /*
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers