Rearrange LOG_CONNECTIONS code so that two log messages are made:

one immediately upon forking to handle a new connection, and one after
the authentication cycle is finished.  Per today's pggeneral discussion.
This commit is contained in:
Tom Lane 2002-05-28 23:56:51 +00:00
parent 36a1e732a6
commit 75c93c0a68
1 changed files with 54 additions and 39 deletions

View File

@ -37,7 +37,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/postmaster/postmaster.c,v 1.274 2002/05/17 01:19:17 tgl Exp $ * $Header: /cvsroot/pgsql/src/backend/postmaster/postmaster.c,v 1.275 2002/05/28 23:56:51 tgl Exp $
* *
* NOTES * NOTES
* *
@ -1065,10 +1065,13 @@ ProcessStartupPacket(Port *port, bool SSLdone)
len = ntohl(len); len = ntohl(len);
len -= 4; len -= 4;
if (len < sizeof(len) || len > sizeof(len) + sizeof(StartupPacket)) if (len < sizeof(ProtocolVersion) || len > sizeof(StartupPacket))
elog(FATAL, "invalid length of startup packet"); elog(FATAL, "invalid length of startup packet");
buf = palloc(len); buf = palloc(sizeof(StartupPacket));
/* Ensure we see zeroes for any bytes not sent */
MemSet(buf, 0, sizeof(StartupPacket));
if (pq_getbytes(buf, len) == EOF) if (pq_getbytes(buf, len) == EOF)
{ {
@ -1141,7 +1144,7 @@ ProcessStartupPacket(Port *port, bool SSLdone)
/* /*
* Get the parameters from the startup packet as C strings. The * Get the parameters from the startup packet as C strings. The
* packet destination was cleared first so a short packet has zeros * packet destination was cleared first so a short packet has zeros
* silently added and a long packet is silently truncated. * silently added.
*/ */
StrNCpy(port->database, packet->database, sizeof(port->database)); StrNCpy(port->database, packet->database, sizeof(port->database));
StrNCpy(port->user, packet->user, sizeof(port->user)); StrNCpy(port->user, packet->user, sizeof(port->user));
@ -1188,7 +1191,7 @@ ProcessStartupPacket(Port *port, bool SSLdone)
break; break;
case CAC_OK: case CAC_OK:
default: default:
; break;
} }
return STATUS_OK; return STATUS_OK;
@ -2036,42 +2039,15 @@ DoBackend(Port *port)
* We arrange for a simple exit(0) if we receive SIGTERM or SIGQUIT * We arrange for a simple exit(0) if we receive SIGTERM or SIGQUIT
* during any client authentication related communication. Otherwise * during any client authentication related communication. Otherwise
* the postmaster cannot shutdown the database FAST or IMMED cleanly * the postmaster cannot shutdown the database FAST or IMMED cleanly
* if a buggy client blocks a backend during authentication. We also * if a buggy client blocks a backend during authentication.
* will exit(0) after a time delay, so that a broken client can't hog
* a connection indefinitely.
*
* PreAuthDelay is a debugging aid for investigating problems in the
* authentication cycle: it can be set in postgresql.conf to allow
* time to attach to the newly-forked backend with a debugger. (See
* also the -W backend switch, which we allow clients to pass through
* PGOPTIONS, but it is not honored until after authentication.)
*/ */
pqsignal(SIGTERM, authdie); pqsignal(SIGTERM, authdie);
pqsignal(SIGQUIT, authdie); pqsignal(SIGQUIT, authdie);
pqsignal(SIGALRM, authdie); pqsignal(SIGALRM, authdie);
PG_SETMASK(&AuthBlockSig); PG_SETMASK(&AuthBlockSig);
if (PreAuthDelay > 0)
sleep(PreAuthDelay);
if (!enable_sigalrm_interrupt(AuthenticationTimeout * 1000))
elog(FATAL, "DoBackend: Unable to set timer for auth timeout");
/* /*
* Receive the startup packet (which might turn out to be a cancel * Get the remote host name and port for logging and status display.
* request packet).
*/
status = ProcessStartupPacket(port, false);
if (status != STATUS_OK)
return 0; /* cancel request processed, or error */
/*
* Now that we have the user and database name, we can set the process
* title for ps. It's good to do this as early as possible in
* startup.
*
* But first, we need the remote host name.
*/ */
if (port->raddr.sa.sa_family == AF_INET) if (port->raddr.sa.sa_family == AF_INET)
{ {
@ -2101,11 +2077,17 @@ DoBackend(Port *port)
if (remote_host == NULL) if (remote_host == NULL)
remote_host = pstrdup(host_addr); remote_host = pstrdup(host_addr);
if (Log_connections)
elog(LOG, "connection received: host=%s port=%hu",
remote_host, remote_port);
if (ShowPortNumber) if (ShowPortNumber)
{ {
char *str = palloc(strlen(remote_host) + 7); /* modify remote_host for use in ps status */
int slen = strlen(remote_host) + 10;
char *str = palloc(slen);
sprintf(str, "%s:%hu", remote_host, remote_port); snprintf(str, slen, "%s:%hu", remote_host, remote_port);
pfree(remote_host); pfree(remote_host);
remote_host = str; remote_host = str;
} }
@ -2114,10 +2096,43 @@ DoBackend(Port *port)
{ {
/* not AF_INET */ /* not AF_INET */
remote_host = "[local]"; remote_host = "[local]";
if (Log_connections)
elog(LOG, "connection received: host=%s",
remote_host);
} }
/* /*
* Set process parameters for ps display. * PreAuthDelay is a debugging aid for investigating problems in the
* authentication cycle: it can be set in postgresql.conf to allow
* time to attach to the newly-forked backend with a debugger. (See
* also the -W backend switch, which we allow clients to pass through
* PGOPTIONS, but it is not honored until after authentication.)
*/
if (PreAuthDelay > 0)
sleep(PreAuthDelay);
/*
* Ready to begin client interaction. We will give up and exit(0)
* after a time delay, so that a broken client can't hog a connection
* indefinitely. PreAuthDelay doesn't count against the time limit.
*/
if (!enable_sigalrm_interrupt(AuthenticationTimeout * 1000))
elog(FATAL, "DoBackend: Unable to set timer for auth timeout");
/*
* Receive the startup packet (which might turn out to be a cancel
* request packet).
*/
status = ProcessStartupPacket(port, false);
if (status != STATUS_OK)
return 0; /* cancel request processed, or error */
/*
* Now that we have the user and database name, we can set the process
* title for ps. It's good to do this as early as possible in
* startup.
*/ */
init_ps_display(port->user, port->database, remote_host); init_ps_display(port->user, port->database, remote_host);
set_ps_display("authentication"); set_ps_display("authentication");
@ -2136,8 +2151,8 @@ DoBackend(Port *port)
PG_SETMASK(&BlockSig); PG_SETMASK(&BlockSig);
if (Log_connections) if (Log_connections)
elog(LOG, "connection: host=%s user=%s database=%s", elog(LOG, "connection authorized: user=%s database=%s",
remote_host, port->user, port->database); port->user, port->database);
/* /*
* Don't want backend to be able to see the postmaster random number * Don't want backend to be able to see the postmaster random number