mirror of
https://github.com/postgres/postgres.git
synced 2025-06-13 07:41:39 +03:00
Plug several holes in backend's ability to cope with
unexpected loss of connection to frontend.
This commit is contained in:
@ -7,7 +7,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/tcop/postgres.c,v 1.126 1999/07/19 02:27:06 momjian Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/tcop/postgres.c,v 1.127 1999/07/22 02:40:07 tgl Exp $
|
||||
*
|
||||
* NOTES
|
||||
* this is the "main" module of the postgres backend and
|
||||
@ -158,9 +158,9 @@ int _exec_repeat_ = 1;
|
||||
* decls for routines only used in this file
|
||||
* ----------------------------------------------------------------
|
||||
*/
|
||||
static char InteractiveBackend(char *inBuf);
|
||||
static char SocketBackend(char *inBuf);
|
||||
static char ReadCommand(char *inBuf);
|
||||
static int InteractiveBackend(char *inBuf);
|
||||
static int SocketBackend(char *inBuf);
|
||||
static int ReadCommand(char *inBuf);
|
||||
static void pg_exec_query(char *query_string);
|
||||
|
||||
|
||||
@ -172,10 +172,12 @@ static void pg_exec_query(char *query_string);
|
||||
/* ----------------
|
||||
* InteractiveBackend() is called for user interactive connections
|
||||
* the string entered by the user is placed in its parameter inBuf.
|
||||
*
|
||||
* EOF is returned if end-of-file input is seen; time to shut down.
|
||||
* ----------------
|
||||
*/
|
||||
|
||||
static char
|
||||
static int
|
||||
InteractiveBackend(char *inBuf)
|
||||
{
|
||||
char *stuff = inBuf; /* current place in input buffer */
|
||||
@ -244,8 +246,7 @@ InteractiveBackend(char *inBuf)
|
||||
{
|
||||
if (Verbose)
|
||||
puts("EOF");
|
||||
IsEmptyQuery = true;
|
||||
proc_exit(0);
|
||||
return EOF;
|
||||
}
|
||||
|
||||
/* ----------------
|
||||
@ -274,11 +275,13 @@ InteractiveBackend(char *inBuf)
|
||||
*
|
||||
* If the input is a fastpath function call (case 'F') then
|
||||
* the function call is processed in HandleFunctionRequest().
|
||||
* (now called from PostgresMain())
|
||||
* (now called from PostgresMain()).
|
||||
*
|
||||
* EOF is returned if the connection is lost.
|
||||
* ----------------
|
||||
*/
|
||||
|
||||
static char
|
||||
static int
|
||||
SocketBackend(char *inBuf)
|
||||
{
|
||||
char qtype;
|
||||
@ -290,13 +293,7 @@ SocketBackend(char *inBuf)
|
||||
*/
|
||||
qtype = '?';
|
||||
if (pq_getbytes(&qtype, 1) == EOF)
|
||||
{
|
||||
/* ------------
|
||||
* when front-end applications quits/dies
|
||||
* ------------
|
||||
*/
|
||||
proc_exit(0);
|
||||
}
|
||||
return EOF;
|
||||
|
||||
switch (qtype)
|
||||
{
|
||||
@ -305,7 +302,8 @@ SocketBackend(char *inBuf)
|
||||
* ----------------
|
||||
*/
|
||||
case 'Q':
|
||||
pq_getstr(inBuf, MAX_PARSE_BUFFER);
|
||||
if (pq_getstr(inBuf, MAX_PARSE_BUFFER))
|
||||
return EOF;
|
||||
result = 'Q';
|
||||
break;
|
||||
|
||||
@ -314,8 +312,8 @@ SocketBackend(char *inBuf)
|
||||
* ----------------
|
||||
*/
|
||||
case 'F':
|
||||
pq_getstr(inBuf, MAX_PARSE_BUFFER); /* ignore the rest of the
|
||||
* line */
|
||||
if (pq_getstr(inBuf, MAX_PARSE_BUFFER))
|
||||
return EOF; /* ignore "string" at start of F message */
|
||||
result = 'F';
|
||||
break;
|
||||
|
||||
@ -345,10 +343,10 @@ SocketBackend(char *inBuf)
|
||||
* ReadCommand reads a command from either the frontend or
|
||||
* standard input, places it in inBuf, and returns a char
|
||||
* representing whether the string is a 'Q'uery or a 'F'astpath
|
||||
* call.
|
||||
* call. EOF is returned if end of file.
|
||||
* ----------------
|
||||
*/
|
||||
static char
|
||||
static int
|
||||
ReadCommand(char *inBuf)
|
||||
{
|
||||
if (IsUnderPostmaster)
|
||||
@ -890,7 +888,7 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[])
|
||||
bool secure = true;
|
||||
int errs = 0;
|
||||
|
||||
char firstchar;
|
||||
int firstchar;
|
||||
char parser_input[MAX_PARSE_BUFFER];
|
||||
char *userName;
|
||||
|
||||
@ -1494,7 +1492,7 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[])
|
||||
if (!IsUnderPostmaster)
|
||||
{
|
||||
puts("\nPOSTGRES backend interactive interface ");
|
||||
puts("$Revision: 1.126 $ $Date: 1999/07/19 02:27:06 $\n");
|
||||
puts("$Revision: 1.127 $ $Date: 1999/07/22 02:40:07 $\n");
|
||||
}
|
||||
|
||||
/* ----------------
|
||||
@ -1581,7 +1579,12 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[])
|
||||
TPRINTF(TRACE_VERBOSE, "StartTransactionCommand");
|
||||
StartTransactionCommand();
|
||||
|
||||
HandleFunctionRequest();
|
||||
if (HandleFunctionRequest() == EOF)
|
||||
{
|
||||
/* lost frontend connection during F message input */
|
||||
pq_close();
|
||||
proc_exit(0);
|
||||
}
|
||||
break;
|
||||
|
||||
/* ----------------
|
||||
@ -1621,10 +1624,13 @@ PostgresMain(int argc, char *argv[], int real_argc, char *real_argv[])
|
||||
break;
|
||||
|
||||
/* ----------------
|
||||
* 'X' means that the frontend is closing down the socket
|
||||
* 'X' means that the frontend is closing down the socket.
|
||||
* EOF means unexpected loss of frontend connection.
|
||||
* Either way, perform normal shutdown.
|
||||
* ----------------
|
||||
*/
|
||||
case 'X':
|
||||
case EOF:
|
||||
pq_close();
|
||||
proc_exit(0);
|
||||
break;
|
||||
|
Reference in New Issue
Block a user