http://bugzilla.spamassassin.org/show_bug.cgi?id=4258





------- Additional Comments From [EMAIL PROTECTED]  2005-04-14 18:56 -------
wierd -- not seeing any problem here :(  check it out...
let's start halfway through.

cast of characters:

    fd 5 = accept fd
    fd 6 = control channel to child 66451
    fd 7 = "                      " 66443


write(2, "prefork: child states: IB\n", 26) = 26

        one child is processing, the other one's idle

select(16, [5 6 7], NULL, [5 6 7], {2, 0}) = 1 (in [6])
read(6, "I66451\n", 8192)               = 7

        child 66451 says "I'm idle"

write(2, "prefork: child states: II\n", 26) = 26

        prefork master says, "ok, we don't need two kids, we're idle"

kill(66451, SIGINT <unfinished ...>
--- SIGCHLD (Child exited) ---
--- SIGCHLD (Child exited) ---
<... kill resumed> )                    = 0
sigreturn(0x9ebff7a0)                   = 0
select(8, [4], NULL, [4], {0, 0})       = 0 (Timeout)
write(4, "<22>spamd[66218]: server hit by "..., 41) = 41
wait4(-1, [WIFSIGNALED(s) && WTERMSIG(s) == SIGINT], WNOHANG, NULL) = 66451
select(8, [4], NULL, [4], {0, 0})       = 0 (Timeout)
write(4, "<22>spamd[66218]: handled cleanu"..., 54) = 54
wait4(-1, 0x9ebff7dc, WNOHANG, NULL)    = 0
select(16, [5 6 7], NULL, [5 6 7], {2, 0}) = 1 (in [6])
read(6, "", 8192)                       = 0
close(-1)                               = -1 EBADF (Bad file descriptor)
close(6)                                = 0
write(2, "prefork: child states: I\n", 25) = 25

        and there's 1 idle child.

select(16, [5 7], NULL, [5 7], {2, 0})  = 1 (in [5])
write(7, "A\n", 2)                      = 2

        activity on the accept socket -- tells the child on fd 7 to accept...

read(7, "B66443\n", 8192)               = 7

        child says "I'm busy"

select(16, [5 7], NULL, [5 7], {2, 0})  = 1 (in [7])
read(7, "I66443\n", 8192)               = 7

        child finishes processing and says "I'm idle".

write(2, "prefork: child states: I\n", 25) = 25
select(16, [5 7], NULL, [5 7], {2, 0})  = 0 (Timeout)
select(16, [5 7], NULL, [5 7], {2, 0})  = 0 (Timeout)
select(16, [5 7], NULL, [5 7], {2, 0})  = 0 (Timeout)
select(16, [5 7], NULL, [5 7], {2, 0})  = 0 (Timeout)
select(16, [5 7], NULL, [5 7], {2, 0})  = 0 (Timeout)
select(16, [5 7], NULL, [5 7], {2, 0})  = 0 (Timeout)
select(16, [5 7], NULL, [5 7], {2, 0})  = 0 (Timeout)
select(16, [5 7], NULL, [5 7], {2, 0})  = 0 (Timeout)
select(16, [5 7], NULL, [5 7], {2, 0})  = 0 (Timeout)

        and repeat until eventually killed.


So in other words, the master spamd is not getting hung -- it really is
selecting on the accept fd.  But there's no activity arriving on that fd, which
is obviously incorrect?!

right now, I'm stumped as to how a select on the accept() fd could *fail*
to notice activity, if there is activity there, and that select() call looks
100% fine to me (unless BSD has changed its semantics somewhere since BSD
4.3...)

Could you retry again, using strace -ft (follow forks, add time)? maybe there's
something in the kid's straces that'll help.





------- You are receiving this mail because: -------
You are the assignee for the bug, or are watching the assignee.

Reply via email to