pkgsrc BIND asserts under load, kqueue-related?
BIND from pkgsrc fails quickly under load with the message
sockmanager:maximum number of FD events (64) received
followed by an assertion
socket.c:2559: INSIST(!sock->pending_recv) failed
This seems to be fixed by configuring with --disable-kqueue
To repeat: Use queryperf
#1 Updated by sjg about 6 years ago
BIND is queuing socket operations (read/write), marking them as queued, but then
not filtering ready events (from kqueue/poll/select) that would result in a
second queued operation and then asserting when they catch it just prior to
queueing (in dispatch_recv() in this case, but it is also possible for it to
happen in dispatch_send()). Raising the number of FD events,
ISC_SOCKET_MAXEVENTS may work around this in our kevent case.
A possible fix might be to change the INSIST()'s in dispatch_send/recv() to if
(sock->pending_recv) return;, but I have not tested this.
There is an underlying bug here and we should re-file this upstream.
#2 Updated by sjg about 6 years ago
I might have been wrong here, BIND does "unwatch" the descriptor for the read or
write case after queuing the read or write event. So it looks like it is
possible we are returning events from kevent(2) previously passed in with an
EV_DELETE flag. Will investigate further.