On Wed, Jul 16, 2014 at 2:29 AM, Sawada Masahiko <sawada.m...@gmail.com> wrote: > On Tue, Jul 15, 2014 at 7:38 PM, Fujii Masao <masao.fu...@gmail.com> wrote: >> On Thu, Jul 10, 2014 at 11:10 PM, Sawada Masahiko <sawada.m...@gmail.com> >> wrote: >>> Hi, >>> >>> At 1047 line of receivelog.c:CopyStreamPoll(), we set NULL to >>> timeoutptr variable. >>> if the value of timeoutprt is set NULL then the process will wait >>> until can read socket using by select() function as following. >>> >>> if (timeout_ms < 0) >>> timeoutptr = NULL; >>> else >>> { >>> timeout.tv_sec = timeout_ms / 1000L; >>> timeout.tv_usec = (timeout_ms % 1000L) * 1000L; >>> timeoutptr = &timeout; >>> } >>> >>> ret = select(PQsocket(conn) + 1, &input_mask, NULL, NULL, timeoutptr); >>> >>> But the 1047 line of receivelog.c is never executed because the value >>> of timeout_ms is NOT allowed less than 0 at CopyStreamReceive which is >>> only one function calls CopyStreamPoll(). >>> The currently code, if we specify -s to 0 then CopyStreamPoll() >>> function is never called. >>> And the pg_receivexlog will be execute PQgetCopyData() and failed, in >>> succession. >> >> Thanks for reporting this! Yep, this is a problem. >> >>> I think that it is contradiction, and should execute select() function >>> with NULL of fourth argument. >>> the attached patch allows to execute select() with NULL, i.g., >>> pg_receivexlog.c will wait until can read socket without timeout, if >>> -s is specified to 0. >> >> Your patch changed the code so that CopyStreamPoll is called even >> when the timeout is 0. I don't agree with this change because the >> timeout=0 basically means that the caller doesn't request to block and >> there is no need to call CopyStreamPoll in this case. So I'm thinking to >> apply the attached patch. Thought? >> > > Thank you for the response. > I think this is better. > > One another point about select() function, I think that they are same > behavior between the fifth argument is NULL and 0(i.g. 0 sec).
No, per manpage of select(2), select(2) with timeout=0 behaves differently from select(2) with timeout=NULL. So I don't think your suggestion is acceptable... Regards, -- Fujii Masao -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers