Date: Fri, 30 Apr 2010 17:14:18 -0500 From: Dan Nelson <dnelson@allantgroup.com> To: Joerg Bruehe <joerg@mysql.com> Cc: FreeBSD-Questions <freebsd-questions@freebsd.org> Subject: Re: Need info about FreeBSD and interrupted system calls for MySQL code Message-ID: <20100430221418.GJ14572@dan.emsphone.com> In-Reply-To: <4BDB49FF.4000303@mysql.com> References: <4BD9D098.8010201@mysql.com> <20100429194932.GI14572@dan.emsphone.com> <4BDB49FF.4000303@mysql.com>
next in thread | previous in thread | raw e-mail | index | archive | help
In the last episode (Apr 30), Joerg Bruehe said: > Dan Nelson wrote: > > In the last episode (Apr 29), Joerg Bruehe said: > >> For some long, unknown time, the MySQL code contains a variable > >> "net_retry_count" which is by default set to 10 (ten) for all platforms, > >> but to 1000000 (1 million) for FreeBSD (during configure phase). > >> > >> The source code comment about this variable reads > >> If a read on a communication port is interrupted, retry this many > >> times before giving up. > >> > >> [[...]] > > > > I'm pretty sure this is a holdover from when FreeBSD only had a user > > pthreads package (libc_r). libc calls that would normally block got > > converted into non-blocking versions and a select() loop would execute > > threads as the events they were waiting on occurred. Incoming signals > > would cause all threads waiting on read() to return EINTR. If you have > > other threads doing work and sending/receiving signals, this can add up > > to a lot of extra EINTR's. > > Interesting information - thanks. I never heard that before, but it > explains a lot. This may also have been due to a bug in the early libc_r code. Appropriate use of sigwait() and pthread_sigmask() should let the pthreads library know which read() calls it can silently retry on behalf of threads that are ignoring signals (and thus shouldn't have their syscalls aborted with EINTR). I have email records talking about libc_r problems with signal masking from the FreeBSD 2.2.7 days (~1998). It's possible that later libc_r versions had fixed the bug. I used to have copies of the ancient mysql source code around (3.22 and 3.23 era), but have since deleted them, so I don't know when the 1000000 workaround was added. -- Dan Nelson dnelson@allantgroup.com
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20100430221418.GJ14572>