Hi All,
In ODBC library later to change done as part of commit Title "Rip out broken retry/timeout logic in SOCK_wait_for_ready." in file socket.c
Now the cpde snippet for SOCK_wait_for_ready() is like:
do {
#ifdef HAVE_POLL
fds.fd = sock->socket;
fds.events = output ? POLLOUT : POLLIN;
fds.revents = 0;
ret = poll(&fds, 1, nowait ? 0 : -1);
mylog("!!! poll ret=%d revents=%x\n", ret, fds.revents);
#else
FD_ZERO(&fds);
FD_ZERO(&except_fds);
FD_SET(sock->socket, &fds);
FD_SET(sock->socket, &except_fds);
if (nowait)
{
tm.tv_sec = 0;
tm.tv_usec = 0;
}
ret = select((int) sock->socket + 1, output ? NULL : &fds, output ? &fds : NULL, &except_fds, nowait ? &tm : NULL);
#endif /* HAVE_POLL */
gerrno = SOCK_ERRNO;
} while (ret < 0 && EINTR == gerrno);
So whenever there is no fd is ready to be read it will immediately return and solve the issue of infinite query hung but due to immediate return it will go for continuous retries and causing CPU to shoot very high.This is one of the case we are suffering in our scenario after upgrading ODBC.
One way is to put usleep from post to every call of SOCK_wait_for_ready() to solve this,but would request if a better patch can be available to fix this issue.