On Tue, Jul 28, 2009 at 15:45, Tom Lane<[email protected]> wrote:
> Magnus Hagander <[email protected]> writes:
>> On Mon, Jul 27, 2009 at 16:14, Tom Lane<[email protected]> 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 ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers