Helath checking was hang when any data wasn't sent
from backend after connect(2) succeeded. To fix this,
pool_check_fd() returns 1 when select(2) exits with
EINTR due to SIGALRM while health checkking is performed.
Reported and patch provided by harukat and some modification
by Yugo. Per bug #204.
backported from 3.4 or later;
https://git.postgresql.org/gitweb/?p=pgpool2.git;a=commitdiff;h=
ed9f2900f1b611f5cfd52e8f758c3616861e60c0
int fds;
struct timeval timeout;
struct timeval *timeoutp;
+ int save_errno;
/*
* If SSL is enabled, we need to check SSL internal buffer
FD_SET(fd, &exceptmask);
fds = select(fd+1, &readmask, NULL, &exceptmask, timeoutp);
+ save_errno = errno;
if (fds == -1)
{
+ if (health_check_timer_expired && errno == EINTR)
+ {
+ pool_error("health check timed out while waiting for reading data");
+ errno = save_errno;
+ return 1;
+ }
if (errno == EAGAIN || errno == EINTR)
continue;