On Tue, Jun 21, 2011 at 6:22 PM, Peter Geoghegan <pe...@2ndquadrant.com> wrote:
> Thanks for giving this your attention Fujii. Attached patch addresses
> your concerns.

Thanks for updating the patch! I have a few comments;

+WaitLatch(volatile Latch *latch, int wakeEvents, long timeout)
+WaitLatchOrSocket(volatile Latch *latch, int wakeEvents, pgsocket
sock, long timeout)

If 'wakeEvent' is zero, we cannot get out of WaitLatch(). Something like
Assert(waitEvents != 0) is required? Or, WaitLatch() should always wait
on latch even when 'waitEvents' is zero?

In unix_latch.c, select() in WaitLatchOrSocket() checks the timeout only when
WL_TIMEOUT is set in 'wakeEvents'. OTOH, in win32_latch.c,
WaitForMultipleObjects()
in WaitLatchOrSocket() always checks the timeout even if WL_TIMEOUT is not
given. Is this intentional?

+               else if (rc == WAIT_OBJECT_0 + 2 &&
+                                ((wakeEvents & WL_SOCKET_READABLE) || 
(wakeEvents & WL_SOCKET_WRITEABLE)))

Another corner case: when WL_POSTMASTER_DEATH and WL_SOCKET_READABLE
are given and 'sock' is set to PGINVALID_SOCKET, we can wrongly pass through the
above check. If this OK?

                rc = WaitForMultipleObjects(numevents, events, FALSE,
                                                           (timeout >= 0) ? 
(timeout / 1000) : INFINITE);
-               if (rc == WAIT_FAILED)
+               if ( (wakeEvents & WL_POSTMASTER_DEATH) &&
+                        !PostmasterIsAlive(true))

After WaitForMultipleObjects() detects the death of postmaster,
WaitForSingleObject()
is called in PostmasterIsAlive(). In this case, what code does
WaitForSingleObject() return?
I wonder if WaitForSingleObject() returns the code other than
WAIT_TIMEOUT and really
can detect the death of postmaster.

+       if (fcntl(postmaster_alive_fds[POSTMASTER_FD_WATCH], F_GETFL) < 0)
+       {
+               ereport(FATAL,
+                       (errcode_for_socket_access(),
+                        errmsg("failed to set the postmaster death watching 
fd's flags:
%s", strerror(errno))));
+       }

Is the above check really required? It's harmless, but looks unnecessary.

+                        errmsg( "pipe() call failed to create pipe to monitor 
postmaster
death: %s", strerror(errno))));
+                        errmsg("failed to set the postmaster death watching 
fd's flags:
%s", strerror(errno))));
+                        errmsg("failed to set the postmaster death watching 
fd's flags:
%s", strerror(errno))));

'%m' should be used instead of '%s' and 'strerror(errno)'.

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

Reply via email to