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(&param->port, port, sizeof(Port));
! 	write_inheritable_socket(&param->portsocket, port->sock, childPid);
  
  	strlcpy(param->DataDir, DataDir, MAXPGPATH);
  
--- 4448,4455 ----
  #endif
  {
  	memcpy(&param->port, port, sizeof(Port));
! 	if (!write_inheritable_socket(&param->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(&param->pgStatSock, pgStatSock, childPid);
  
  	param->PostmasterPid = PostmasterPid;
  	param->PgStartTime = PgStartTime;
--- 4470,4477 ----
  	param->ProcGlobal = ProcGlobal;
  	param->AuxiliaryProcs = AuxiliaryProcs;
  	param->PMSignalState = PMSignalState;
! 	if (!write_inheritable_socket(&param->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(&param->initial_signal_pipe,
  							pgwin32_create_signal_listener(childPid),
! 							childProcess);
  #endif
  
  	memcpy(&param->syslogPipe, &syslogPipe, sizeof(syslogPipe));
--- 4481,4490 ----
  
  #ifdef WIN32
  	param->PostmasterHandle = PostmasterHandle;
! 	if (!write_duplicated_handle(&param->initial_signal_pipe,
  							pgwin32_create_signal_listener(childPid),
! 							childProcess))
! 		return false;
  #endif
  
  	memcpy(&param->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

Reply via email to