Re: Re: BUG #8647: Backend process hangs and becomes unkillable when SSL client looses connection

Поиск
Список
Период
Сортировка
От Alexander Kukushkin
Тема Re: Re: BUG #8647: Backend process hangs and becomes unkillable when SSL client looses connection
Дата
Msg-id CAFh8B=nnR-zWc5N5n-D7jhx5VquZZT1k87Dych_Az+pPzJKWxQ@mail.gmail.com
обсуждение исходный текст
Ответ на Re: Re: BUG #8647: Backend process hangs and becomes unkillable when SSL client looses connection  (Tom Lane <tgl@sss.pgh.pa.us>)
Список pgsql-bugs
2013/12/5 Tom Lane <tgl@sss.pgh.pa.us>

> Alexander Kukushkin <cyberdemn@gmail.com> writes:
> > After analysing source code of postgres and openssl I've found (at least
> I
> > think) the reason why it is happening:
> >
>
----------------------------------------------------------------------------------------------------------------------------
> > static int
> > my_sock_write(BIO *h, const char *buf, int size)
> > {
> >         int                     res = 0;
>
> >         res = send(h->num, buf, size, 0);
> >         if (res <= 0)
> >         {
> >                 if (errno == EINTR)
> >                 {
> >                         BIO_set_retry_write(h);
> >                 }
> >         }
>
> >         return res;
> > }
>
> BTW, I was looking at that function the other day and thinking it was
> wrong: if the send() returns exactly zero, it hasn't set errno has it?
> But perhaps that case never arises.
>
>                         regards, tom lane
>

According to documentation, "On success, these calls return the number of
characters sent.  On error, -1 is returned, and errno is set appropriately."
So, return zero is not an error and errno should not be set.
I guess you could get zero only in case when you are sending an empty
buffer or in nonblocking mode, which obviously is not the case.

But, returning to my original message... I noticed that I've made stupid
copy&paste error


static int
my_sock_write(BIO *h, const char *buf, int size)
{
        int                     res = 0;

        res = send(h->num, buf, size, 0);
+        BIO_clear_retry_flags(h); // <-- here, should be "h" not "b" as in
original message.

        if (res <= 0)
        {
                if (errno == EINTR)
                {
                        BIO_set_retry_write(h);
                }

Best regards,
Alexander Kukushkin

В списке pgsql-bugs по дате отправления:

Предыдущее
От: Tom Lane
Дата:
Сообщение: Re: Re: BUG #8647: Backend process hangs and becomes unkillable when SSL client looses connection
Следующее
От: Tom Lane
Дата:
Сообщение: Re: Re: BUG #8647: Backend process hangs and becomes unkillable when SSL client looses connection