Re: Winsock error 10035 while trying to upgrade from 8.0 to 8.2

From: Magnus Hagander <magnus(at)hagander(dot)net>
To: cyril(dot)velter(at)metadys(dot)com
Cc: pgsql-general(at)postgresql(dot)org
Subject: Re: Winsock error 10035 while trying to upgrade from 8.0 to 8.2
Date: 2007-05-26 14:52:23
Message-ID: 465849A7.8090403@hagander.net
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

Cyril VELTER wrote:
>
>>> Cyril VELTER wrote:
>>>> Searching the source files, it seems the error message is generated in
>>>> port/win32/socket.c line 594.
>>> Right, but the important thing is which path down to that function is it
>>> generated in. Which is why a backtrace would help.
>> Yes, I understand that.
>>
>>> Looking at the code, the problem is probably somewhere in
>>> pgwin32_recv(). Now, it really shouldn't end up doing what you're
>>> seeing, but obviously it is.
>>
>> After looking at the code of pgwin32_recv(), I don't understand why
>> pgwin32_waitforsinglesocket() is called with the FD_ACCEPT argument.
>>
>>> Perhaps we just need to have it retry if it gets the WSAEWOULDBLOCK?
>>> Thoughts?
>> I've modified pgwin32_recv() to do that (repeat the
>> pgwin32_waitforsinglesocket() / WSARecv while the error is WSAEWOULDBLOCK and
>
>
>> not raising this error. I've an upgrade running right now (I will have the
>> result in the next hours).
>
>
> Replying to myself, the upgrade is not finished yet, but I can confirm that
> there is cases where pgwin32_waitforsinglesocket() return and the WSARecv
> immediatly fail. I-ve modified the end of pgwin32_recv() :
>
>
> /* No error, zero bytes (win2000+) or error+WSAEWOULDBLOCK (<=nt4) */
>
> for(;;) {
> if (pgwin32_waitforsinglesocket(s, FD_READ | FD_CLOSE | FD_ACCEPT,
> INFINITE) == 0)
> return -1;
>
> r = WSARecv(s, &wbuf, 1, &b, &flags, NULL, NULL);
> if (r == SOCKET_ERROR)
> {
> printf("SOCKERROR");
> if (WSAGetLastError() != WSAEWOULDBLOCK)
> {
> TranslateSocketError();
> return -1;
> }
> }
> else
> {
> return b;
> }
> }
>
>
> The printf("SOCKERROR") line have been hit two times.
>
> Any though ?
>
> Once this upgrade is finished, I will make another try removing FD_ACCEPT from
>
> the pgwin32_waitforsinglesocket() call.

Hmm. That really isn't supposed to happen, but seems it is. Does it work
when you add that loop, though? Spits out the message and works, or does
it spit out the message and still not work?

I'm also a bit worried about it getting caught in a tight loop if the
error codes are wrong, but probably it just goes back into waitfor.. and
blocks the second time. Otherwise, you'd see screenfuls of that message.

Can you determine if it was hit two times right after each other, or if
there was time between them?

//Magnus

In response to

Responses

Browse pgsql-general by date

  From Date Subject
Next Message Richard P. Welty 2007-05-26 15:34:54 backup strategies
Previous Message John DeSoi 2007-05-26 13:46:23 crash creating tsearch2 index