A customer is facing a problem on PostgreSQL 8.3.10 on Windows where the syslogger process dies mysteriously every few hours under load. I haven't yet figured out why, but when postmaster tries to respawn syslogger, it doesn't start up but dies immediately.
The reason the relaunch fails is that in SysLoggerMain we have this: > /* > * If we restarted, our stderr is already redirected into our own input > * pipe. This is of course pretty useless, not to mention that it > * interferes with detecting pipe EOF. Point stderr to /dev/null. This > * assumes that all interesting messages generated in the syslogger will > * come through elog.c and will be sent to write_syslogger_file. > */ > if (redirection_done) > { > int fd = open(NULL_DEV, O_WRONLY, 0); > > /* > * The closes might look redundant, but they are not: we want > to be > * darn sure the pipe gets closed even if the open failed. > We can > * survive running with stderr pointing nowhere, but we can't > afford > * to have extra pipe input descriptors hanging around. > */ > close(fileno(stdout)); > close(fileno(stderr)); > dup2(fd, fileno(stdout)); > dup2(fd, fileno(stderr)); > close(fd); > } NULL_DEV is defined in c.h as "/dev/null", which doesn't work on windows. We have a port-specific #define DEVNULL which does work, we should be using that. Peter Eisentraut inadvertently fixed this for 8.4: http://archives.postgresql.org/pgsql-committers/2008-12/msg00095.php by removing NULL_DEV and using always DEVNULL, but back-branches need that too. I'll leave NULL_DEV as it is just in case it's used by 3rd party modules, but change the two uses of it to use DEVNULL. -- Heikki Linnakangas EnterpriseDB http://www.enterprisedb.com -- Sent via pgsql-bugs mailing list (pgsql-bugs@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-bugs