DO NOT REPLY TO THIS EMAIL, BUT PLEASE POST YOUR BUGĀ·
RELATED COMMENTS THROUGH THE WEB INTERFACE AVAILABLE AT
<http://issues.apache.org/bugzilla/show_bug.cgi?id=42580>.
ANY REPLY MADE TO THIS MESSAGE WILL NOT BE COLLECTED ANDĀ·
INSERTED IN THE BUG DATABASE.

http://issues.apache.org/bugzilla/show_bug.cgi?id=42580





------- Additional Comments From [EMAIL PROTECTED]  2008-02-11 14:47 -------
Created an attachment (id=21511)
 --> (http://issues.apache.org/bugzilla/attachment.cgi?id=21511&action=view)
Patch

When I had the following settings :

Listen 192.168.21.1:81
Listen 192.168.22.1:81

<IfModule worker.c>
ListenBackLog     50000
StartServers         2
ThreadLimit        5
ThreadsPerChild    5
MinSpareThreads    1
MaxSpareThreads    1
ThreadsPerChild    5
MaxClients        10
MaxRequestsPerChild  0
</IfModule>

I was getting the following error in my error log
[Mon Feb 11 13:33:52 2008] [error] (70007)The timeout specified has expired:
apr_pollset_poll : (listen)

On debugging, I found out that the listener thread calls port_getn to listen
for new connections, it was getting SIGHUP signal. This was confirmed by truss
output.

5541/1:         read(6, 0xFFFFFD7FFFDFF38B, 1)  (sleeping...)
5541/7:         lwp_park(0x00000000, 0)         (sleeping...)
5541/6:         lwp_park(0x00000000, 0)         (sleeping...)
5541/5:         lwp_park(0x00000000, 0)         (sleeping...)
5541/4:         lwp_park(0x00000000, 0)         (sleeping...)
5541/3:         lwp_park(0x00000000, 0)         (sleeping...)
5541/8:         port_getn(12, 0x00539D30, 2, 1, 0x00000000) (sleeping...)
5543/1:         read(6, 0xFFFFFD7FFFDFF38B, 1)  (sleeping...)
5543/3:         lwp_park(0x00000000, 0)         (sleeping...)
5543/4:         lwp_park(0x00000000, 0)         (sleeping...)
5543/5:         lwp_park(0x00000000, 0)         (sleeping...)
5543/6:         lwp_park(0x00000000, 0)         (sleeping...)
5543/7:         lwp_park(0x00000000, 0)         (sleeping...)
5543/8:         fcntl(11, F_SETLKW, 0xFFFFFD7FFF241E10) (sleeping...)
5539/1:         pollsys(0xFFFFFD7FFFDFF2E0, 0, 0xFFFFFD7FFFDFF3A0, 0x00000000)
= 0
5539/1:         write(7, " !", 1)                               = 1
5541/1:         read(6, " !", 1)                                = 1
5541/1:         lwp_wait(2, 0xFFFFFD7FFFDFF31C)                 = 0
5541/1:         lwp_kill(8, SIGHUP)                             = 0
5541/1:         lwp_kill(8, SIG#0)                              = 0
5541/8:             Received signal #1, SIGHUP, in port_getn() [caught]
5541/8:               siginfo: SIGHUP pid=5541 uid=101 code=-1
5541/8:         port_getn(12, 0x00539D30, 2, 1, 0x00000000)     Err#4 EINTR
5541/8:         lwp_sigmask(SIG_SETMASK, 0xFFBEE007, 0x0000FFF7) = 0xFFBFFEFF
[0x0000FFFF]

Note that 5541/8 is the listener thread and 5541/1 was sending the SIGHUP
signal.

I further debugged why one of my process is dieing. Then I found out that
in worker.c, in perform_idle_server_maintenance function, 

    if (idle_thread_count > max_spare_threads) {
        /* Kill off one child */
        ap_mpm_pod_signal(pod, TRUE);
        idle_spawn_rate = 1;
        ..
>From debugging, I found out that idle_thread_count was set to 10 and
max_spare_threads was set to 6.  Hence the first thread was sending SIGHUP
signal to kill the process.

If I increase the MaxSpareThreads to 10 then this error disappeared because in
that case, worker process didn't try to kill himself.
<IfModule worker.c>
ListenBackLog     50000
StartServers         2
ThreadLimit        5
ThreadsPerChild    5
MinSpareThreads    1
MaxSpareThreads    10
ThreadsPerChild    5
MaxClients        10
MaxRequestsPerChild  0
</IfModule>

The error message is misleading and it may or may not appear. It depends on the

timing. If listener thread has been reached to the point when it is blocked
with port_getn then we get this error. It seems to me that server wanted to
deliberately kill one of the child process.

Casue of the problem is that apr_pollset_poll function doesn't differentiate
the EINTR and ETIME.  apr_pollset_poll contains ...
        if (errno == ETIME || errno == EINTR) {
            rv = APR_TIMEUP;
        }

In worker.c, we do expect EINTR to be normal as shown below :
-------------- worker.c --------------------------
                rv = apr_pollset_poll(pollset, -1, &numdesc, &pdesc);
                if (rv != APR_SUCCESS) {
                    if (APR_STATUS_IS_EINTR(rv)) {
                        continue;
                    }
--------------------------------------------------

If we allow EINTR as a known error and return APR_EINTR as given in suggested
patch then this error disappeared.

-- 
Configure bugmail: http://issues.apache.org/bugzilla/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the assignee for the bug, or are watching the assignee.

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to