libpq calls blocking recv when it could not send data enough.

Started by matsumura.ryo@fujitsu.comabout 6 years ago1 messages
#1matsumura.ryo@fujitsu.com
matsumura.ryo@fujitsu.com

Hi all

Libpq may be blocked by recv without checking data arrival
when libpq could not send data enough.
I think it should check by pqReadReady() for avoiding blocking.

Note: I didn't encounter any issue that the pqReadData is blocked.

[src/interfaces/libpq/fe-misc.c]
pqSendSome(PGconn *conn, int len)
:
sent = pqsecure_write(conn, ptr, Min(len, 65536));
if (sent < 0)
:
else
{
len -= sent;
}
if (len > 0)
{
if (pqReadData(conn) < 0) // read without checking

Must the pqReadData() return without blocking if it could not send enough?
It may be 'yes', but I think there is no guarantee that there is some data
and pqReadData() is not blocked.

I think the following is better. How about it?
< if (pqReadData(conn) < 0)

if (pqReadReady(conn) && pqReadData(conn) < 0)

Regards
Ryo Matsumura