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

Поиск
Список
Период
Сортировка
От Magnus Hagander
Тема Re: Winsock error 10035 while trying to upgrade from 8.0 to 8.2
Дата
Msg-id 465849A7.8090403@hagander.net
обсуждение исходный текст
Ответ на Re: Winsock error 10035 while trying to upgrade from 8.0 to 8.2  ("Cyril VELTER" <cyril.velter@metadys.com>)
Ответы [Re] Re: Winsock error 10035 while trying to upgrade from 8.0 to 8.2  ("Cyril VELTER" <cyril.velter@metadys.com>)
Список 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 по дате отправления:

Предыдущее
От: John DeSoi
Дата:
Сообщение: crash creating tsearch2 index
Следующее
От: Robert Treat
Дата:
Сообщение: Re: Vacuum DB in Postgres Vs similar concept in other RDBMS