Bug #1730

pkgsrc BIND asserts under load, kqueue-related?

Added by sjg almost 5 years ago. Updated 2 months ago.

Status:FeedbackStart date:
Priority:NormalDue date:
Assignee:sjg% Done:

0%

Category:Kernel
Target version:4.2.x

Description

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

History

#1 Updated by sjg almost 5 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 almost 5 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.

#3 Updated by tuxillo 2 months ago

  • Description updated (diff)
  • Category set to Kernel
  • Status changed from New to Feedback
  • Target version set to 4.2.x

Hi,

Is this still relevant?

Cheers,
Antonio Huete

Also available in: Atom PDF