Re: Winsock error 10035 while trying to upgrade from 8.0 to 8.2 - Mailing list pgsql-general

From Magnus Hagander
Subject Re: Winsock error 10035 while trying to upgrade from 8.0 to 8.2
Date
Msg-id 465849A7.8090403@hagander.net
Whole thread Raw
In response to Re: Winsock error 10035 while trying to upgrade from 8.0 to 8.2  ("Cyril VELTER" <cyril.velter@metadys.com>)
Responses [Re] Re: Winsock error 10035 while trying to upgrade from 8.0 to 8.2
List 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

pgsql-general by date:

Previous
From: John DeSoi
Date:
Subject: crash creating tsearch2 index
Next
From: Robert Treat
Date:
Subject: Re: Vacuum DB in Postgres Vs similar concept in other RDBMS