Lists: | Postg토토SQL : Postg토토SQL |
---|
From: | "Merlin Moncure" <merlin(dot)moncure(at)rcsonline(dot)com> |
---|---|
To: | "Tom Lane" <tgl(at)sss(dot)pgh(dot)pa(dot)us> |
Cc: | "Win 32 hackers PGSQL" <pgsql-hackers-win32(at)postgresql(dot)org> |
Subject: | Re: statistics process shutting down |
Date: | 2004-11-30 18:26:05 |
Message-ID: | 6EE64EF3AB31D5448D0007DD34EEB3412A7545@Herge.rcsinc.local |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | pgsql-hackers-win32 |
> Evidently coming from here:
>
> len = piperead(readPipe, ((char *) &msg) + nread,
> targetlen - nread);
> if (len < 0)
> {
> if (errno == EINTR)
> continue;
> ereport(ERROR,
> (errcode_for_socket_access(),
> errmsg("could not read from statistics collector
> pipe: %m")));
> }
>
> So why is piperead() failing, and why doesn't it set errno to
something
> useful?
Well, the win32 piperead() is really just a call to recv() (vs unix
read()). Here is the win32 implemenation:
int
piperead(int s, char *buf, int len)
{
int ret = recv(s, buf, len, 0);
if (ret < 0 && WSAGetLastError() == WSAECONNRESET)
/* EOF on the pipe! (win32 socket based implementation)
*/
ret = 0;
return ret;
}
I think the key to this puzzle is the return code from
WSAGetLastError(). Also, the WSA call *might* be masking the value of
errno. I did a quick search and came up with this:
http://archives.postgresql.org/pgsql-patches/2001-10/msg00160.php
I think maybe errno needs to get set to WSAGetLastError(). In pipe.c:
if (ret < 0)
{
int wsa_errno;
wsa_errno = WSAGetLastError();
if (WSAECONNRESET == wsa_errno)
{ /* EOF on the pipe! (win32 socket based implementation) */
ret = 0;
}
else
{
errno = wsa_errno; /* this *might* be ok */
}
}
return ret;
Maybe Magnus might comment here. This doesn't explain why the read call
is failing but I'm pretty sure the error code is not being properly
returned.
Merlin
From: | Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us> |
---|---|
To: | "Merlin Moncure" <merlin(dot)moncure(at)rcsonline(dot)com> |
Cc: | "Win 32 hackers PGSQL" <pgsql-hackers-win32(at)postgresql(dot)org> |
Subject: | Re: statistics process shutting down |
Date: | 2004-11-30 20:45:04 |
Message-ID: | 24231.1101847504@sss.pgh.pa.us |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Lists: | Postg토토SQL : Postg토토SQL |
"Merlin Moncure" <merlin(dot)moncure(at)rcsonline(dot)com> writes:
> if (ret < 0)
> {
> int wsa_errno;
> wsa_errno = WSAGetLastError();
> if (WSAECONNRESET == wsa_errno)
> { /* EOF on the pipe! (win32 socket based implementation) */
> ret = 0;
> }
> else
> {
> errno = wsa_errno; /* this *might* be ok */
> }
> }
> Maybe Magnus might comment here. This doesn't explain why the read call
> is failing but I'm pretty sure the error code is not being properly
> returned.
I recall a lot of angst about whether the encoding of WSAGetLastError()
is compatible with errno values, but I forget what the conclusion was.
Can we just assign to errno like that, or do we need a mapping function?
regards, tom lane