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