From owner-freebsd-hackers@FreeBSD.ORG Fri Mar 14 16:05:28 2008 Return-Path: Delivered-To: freebsd-hackers@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id E2F8810656A6 for ; Fri, 14 Mar 2008 16:05:28 +0000 (UTC) (envelope-from dudu@dudu.ro) Received: from fk-out-0910.google.com (fk-out-0910.google.com [209.85.128.186]) by mx1.freebsd.org (Postfix) with ESMTP id 75CCE8FC13 for ; Fri, 14 Mar 2008 16:05:28 +0000 (UTC) (envelope-from dudu@dudu.ro) Received: by fk-out-0910.google.com with SMTP id b27so4796221fka.11 for ; Fri, 14 Mar 2008 09:05:27 -0700 (PDT) Received: by 10.82.155.10 with SMTP id c10mr193547bue.7.1205510726745; Fri, 14 Mar 2008 09:05:26 -0700 (PDT) Received: by 10.82.185.8 with HTTP; Fri, 14 Mar 2008 09:05:26 -0700 (PDT) Message-ID: Date: Fri, 14 Mar 2008 18:05:26 +0200 From: "Vlad GALU" To: "Dan Nelson" In-Reply-To: <20080314153801.GB30116@dan.emsphone.com> MIME-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Content-Disposition: inline References: <20080307223723.X42870@fledge.watson.org> <20080314153801.GB30116@dan.emsphone.com> Cc: freebsd-hackers@freebsd.org Subject: Re: A (perhaps silly) kqueue question X-BeenThere: freebsd-hackers@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Technical Discussions relating to FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 14 Mar 2008 16:05:29 -0000 On 3/14/08, Dan Nelson wrote: > In the last episode (Mar 14), Vlad GALU said: > > On 3/14/08, Vlad GALU wrote: > > > On 3/8/08, Vlad GALU wrote: > > > > On 3/8/08, Robert Watson 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@allantgroup.com > > -- Mahnahmahnah!