On Tue, Jul 5, 2011 at 1:36 AM, Florian Pflug <f...@phlo.org> wrote: > On Jul4, 2011, at 17:53 , Heikki Linnakangas wrote: >>> Under Linux, select() may report a socket file descriptor as "ready >>> for >>> reading", while nevertheless a subsequent read blocks. This could >>> for >>> example happen when data has arrived but upon examination has >>> wrong >>> checksum and is discarded. There may be other circumstances in which >>> a >>> file descriptor is spuriously reported as ready. Thus it may be >>> safer >>> to use O_NONBLOCK on sockets that should not block. >> >> So in theory, on Linux you might WaitLatch might sometimes incorrectly >> return WL_POSTMASTER_DEATH. None of the callers check for >> WL_POSTMASTER_DEATH return code, they call PostmasterIsAlive() before >> assuming the postmaster has died, so that won't affect correctness at the >> moment. I doubt that scenario can even happen in our case, select() on a >> pipe that is never written to. But maybe we should add add an assertion to >> WaitLatch to assert that if select() reports that the postmaster pipe has >> been closed, PostmasterIsAlive() also returns false. > > The correct solution would be to read() from the pipe after select() > returns, and only return WL_POSTMASTER_DEATCH if the read doesn't return > EAGAIN. To prevent that read() from blocking if the read event was indeed > spurious, O_NONBLOCK must be set on the pipe but that patch does that already.
+1 The syslogger read() from the pipe after select(), then it thinks EOF has arrived and there is no longer write-side process if the return value of read() is just zero. Regards, -- Fujii Masao NIPPON TELEGRAPH AND TELEPHONE CORPORATION NTT Open Source Software Center -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers