A (perhaps silly) kqueue question

Vlad GALU dudu at dudu.ro
Fri Mar 14 16:05:29 UTC 2008


On 3/14/08, Dan Nelson <dnelson at allantgroup.com> wrote:
> In the last episode (Mar 14), Vlad GALU said:
>  > On 3/14/08, Vlad GALU <dudu at dudu.ro> wrote:
>  > > On 3/8/08, Vlad GALU <dudu at dudu.ro> wrote:
>  > > > On 3/8/08, Robert Watson <rwatson at freebsd.org> wrote:
>  > > > > On Fri, 7 Mar 2008, Vlad GALU wrote:
>  > > > > > I see an unusual symptom with one of our in-house
>  > > > > > applications. The main I/O loop calls kevent(), which in turn
>  > > > > > returns two events with EV_EOF error set, always for the same
>  > > > > > descriptors (they're both socket descriptors). As the man
>  > > > > > page is not pretty clear about it and I don't have my UNP
>  > > > > > copy at hand, I would like to ask the list whether the error
>  > > > > > events are supposed to be one-shot or not.
>  > > > >
>  > > > >  I wonder if it's returning one event for the read socket
>  > > > >  buffer, and one event for the write socket buffer, since there
>  > > > >  are really two event sources for each socket?  Not that this
>  > > > >  is desirable behavior, but it might explain it.  If you
>  > > > >  shutdown() only read, do you get back one EOF kevent and one
>  > > > >  writable kevent?
>  > > >
>  > > >  I'll try that and see. The only issue being the low frequency
>  > > >  this symptom appears at. I'll get back to the list once I have
>  > > >  more info.
>  > >
>  > >  Haven't gotten to the point of testing shutdown() behavior, but
>  > >  here's a truss excerpt of the symptom:
>  > >
>  > >  -- cut here --
>  > >  kevent(3,0x0,0,{0x7,EVFILT_WRITE,EV_EOF,54,0x832c,0x800d08080 0x7,EVFILT_READ,EV_EOF,54,0x2a,0x800d08080},1024,0x0) = 2 (0x2)
>  > >  kevent(3,0x0,0,{0x7,EVFILT_WRITE,EV_EOF,54,0x832c,0x800d08080 0x7,EVFILT_READ,EV_EOF,54,0x2a,0x800d08080},1024,0x0) = 2 (0x2)
>  > >  kevent(3,0x0,0,{0x7,EVFILT_WRITE,EV_EOF,54,0x832c,0x800d08080 0x7,EVFILT_READ,EV_EOF,54,0x2a,0x800d08080},1024,0x0) = 2 (0x2)
>
> > >  -- and here --
>  > >
>  > >  So two EOF are returrned for descriptor 7, and errno would be
>  > >  ECONNRESET. The question is now, why isn't it oneshot?
>  >
>  > Ah one more thing. When EOF is caught, a handler which forcibly
>  > removes the event is called, but it keeps poping up again and again.
>
>
> Are you sure the event is being removed?  I used to have a hack that
>  made the kernel return its current eventlist for a kqueue when you
>  called kevent() with nchanges set to -1 (handy for placing in a program
>  and using truss to print the result), but it has rotted.  I'm attaching
>  it in case anyone wants to make it work again.
>

   Yep, I'm sure, I've just read the app logs again, we close the
descriptor in the connection destructor..

>  Since you got EOF status for both the read and write halves of the
>  socket, why not just close the fd?  From my reading of the manpages,
>  unless you specified EV_ONESHOT when you added the event, events will
>  fire until you remove them or the condition that triggers them stops.
>
>
>  --
>         Dan Nelson
>         dnelson at allantgroup.com
>
>


-- 
Mahnahmahnah!


More information about the freebsd-hackers mailing list