Re: Replication server timeout patch
От | Heikki Linnakangas |
---|---|
Тема | Re: Replication server timeout patch |
Дата | |
Msg-id | 4D92DAC5.20605@enterprisedb.com обсуждение исходный текст |
Ответ на | Re: Replication server timeout patch (Fujii Masao <masao.fujii@gmail.com>) |
Ответы |
Re: Replication server timeout patch
|
Список | pgsql-hackers |
On 29.03.2011 07:55, Fujii Masao wrote: > On Mon, Mar 28, 2011 at 7:49 PM, Heikki Linnakangas > <heikki.linnakangas@enterprisedb.com> wrote: >>> pq_flush_if_writable() calls internal_flush() without using PG_TRY block. >>> This seems unsafe because for example pgwin32_waitforsinglesocket() >>> called by secure_write() can throw ERROR. >> >> Perhaps it's time to give up on the assumption that the socket is in >> blocking mode except within those two functions. Attached patch adds the >> pq_set_nonblocking() function from your patch, and adds calls to it before >> all secure_read/write operations to put the socket in the right mode. >> There's only a few of those operations. > > Sounds good. > > + pq_set_nonblocking(false); /* XXX: Is this required? */ > > No. Since secure_close and close_SSL don't use MyProcPort->sock and > MyProcPort->noblock which can be changed in pq_set_nonblocking, > I don't think that is required. Ok, I took that out. > + pq_putmessage_noblock('d', msgbuf, 1 + sizeof(WalDataMessageHeader) + nbytes); > > Don't we need to check the return value of pq_putmessage_noblock? That > can return EOF when trouble happens (for example the send system call fails). No, pq_putmessage_noblock doesn't call send() because it enlarges the buffer to make sure the message fits, and it doesn't anything else that could fail else. I changed its return type to void, and added an Assert() to check that the pq_putmessage() call it does internally indeed doesn't fail. >> Should we use COMMERROR instead of ERROR if we fail to put the socket in the >> right mode? > > Maybe. I made it COMMERROR. ERRORs are sent to the client, and you could get into infinite recursion if sending the ERROR requires setting the blocking mode again. Committed with those changes. I also reworded the docs a bit. -- Heikki Linnakangas EnterpriseDB http://www.enterprisedb.com
В списке pgsql-hackers по дате отправления: