Re: FD_SETSIZE with large #s of files/ports in use - Mailing list pgsql-odbc
From | Hiroshi Inoue |
---|---|
Subject | Re: FD_SETSIZE with large #s of files/ports in use |
Date | |
Msg-id | 4BF32A8E.3030900@tpf.co.jp Whole thread Raw |
In response to | FD_SETSIZE with large #s of files/ports in use (Barry Nicholson <b.nicholson@niceng.com>) |
Responses |
Re: FD_SETSIZE with large #s of files/ports in use
|
List | pgsql-odbc |
Hi, Could you please try the attached patch? regards, Hiroshi Inoue Barry Nicholson wrote: > An interesting issue came up the other day. We are working with an > application that opens a considerable number of files and tcp/udp ports > (>3000). Unfortunately, that means that the odbc driver fails > sometimes due to a corrupted stack. We eventually figured out what was > causing the corrupted stack. > > The SOCK_wait_for_ready(SocketClass *sock, BOOL output, int retry_count) > function inside socket.c calls select. Unfortunately, the socket file > descriptor number can be quite large at this time. That means that the > fd_set fds variable can misused. The fd_set variable type only allows > 1024 file descriptors to be used by the calling program on many Linux > versions. This can be changed by setting FD_SETSIZE or __FD_SETSIZE to > a larger number. We have ran tests where we were able to change the > __FD_SETSIZE value in > /usr/src/...linuxversion../linux/include/linux/posix_types.h. The fix > worked well. > > Unfortunately, this isn't a good solution because a software update to > another linux version will invalidate our fix. We've tried various > mechanisms to set FD_SETSIZE or __FD_SETSIZE in socket.c but with no > luck. Has anyone else had this problem and came up with a good fix? > Or is there a better solution? > > Barry Nicholson > Niceng.com *** socket.c.orig 2010-02-04 00:40:55.643000000 +0900 --- socket.c 2010-05-19 08:53:59.429000000 +0900 *************** *** 385,391 **** FD_ZERO(&except_fds); FD_SET(self->socket, &fds); FD_SET(self->socket, &except_fds); ! ret = select((int) self->socket + 1, NULL, &fds, &except_fds, timeout > 0 ? &tm : NULL); gerrno = SOCK_ERRNO; if (0 < ret) break; --- 385,391 ---- FD_ZERO(&except_fds); FD_SET(self->socket, &fds); FD_SET(self->socket, &except_fds); ! ret = select(1, NULL, &fds, &except_fds, timeout > 0 ? &tm : NULL); gerrno = SOCK_ERRNO; if (0 < ret) break; *************** *** 497,503 **** tm.tv_sec = retry_count; tm.tv_usec = 0; } ! ret = select((int) sock->socket + 1, output ? NULL : &fds, output ? &fds : NULL, &except_fds, no_timeout ? NULL: &tm); gerrno = SOCK_ERRNO; } while (ret < 0 && EINTR == gerrno); if (retry_count < 0) --- 497,503 ---- tm.tv_sec = retry_count; tm.tv_usec = 0; } ! ret = select(1, output ? NULL : &fds, output ? &fds : NULL, &except_fds, no_timeout ? NULL : &tm); gerrno = SOCK_ERRNO; } while (ret < 0 && EINTR == gerrno); if (retry_count < 0)
pgsql-odbc by date: