From owner-freebsd-bugs@FreeBSD.ORG Sat Aug 21 20:40:02 2010 Return-Path: Delivered-To: freebsd-bugs@hub.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 0DFD51065696 for ; Sat, 21 Aug 2010 20:40:02 +0000 (UTC) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (freefall.freebsd.org [IPv6:2001:4f8:fff6::28]) by mx1.freebsd.org (Postfix) with ESMTP id C61ED8FC18 for ; Sat, 21 Aug 2010 20:40:01 +0000 (UTC) Received: from freefall.freebsd.org (localhost [127.0.0.1]) by freefall.freebsd.org (8.14.4/8.14.4) with ESMTP id o7LKe1DZ048218 for ; Sat, 21 Aug 2010 20:40:01 GMT (envelope-from gnats@freefall.freebsd.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.14.4/8.14.4/Submit) id o7LKe14N048217; Sat, 21 Aug 2010 20:40:01 GMT (envelope-from gnats) Resent-Date: Sat, 21 Aug 2010 20:40:01 GMT Resent-Message-Id: <201008212040.o7LKe14N048217@freefall.freebsd.org> Resent-From: FreeBSD-gnats-submit@FreeBSD.org (GNATS Filer) Resent-To: freebsd-bugs@FreeBSD.org Resent-Reply-To: FreeBSD-gnats-submit@FreeBSD.org, Volodymyr Kostyrko Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id B329E1065674 for ; Sat, 21 Aug 2010 20:33:11 +0000 (UTC) (envelope-from nobody@FreeBSD.org) Received: from www.freebsd.org (www.freebsd.org [IPv6:2001:4f8:fff6::21]) by mx1.freebsd.org (Postfix) with ESMTP id 885578FC0C for ; Sat, 21 Aug 2010 20:33:11 +0000 (UTC) Received: from www.freebsd.org (localhost [127.0.0.1]) by www.freebsd.org (8.14.3/8.14.3) with ESMTP id o7LKXBxp042580 for ; Sat, 21 Aug 2010 20:33:11 GMT (envelope-from nobody@www.freebsd.org) Received: (from nobody@localhost) by www.freebsd.org (8.14.3/8.14.3/Submit) id o7LKXBxx042579; Sat, 21 Aug 2010 20:33:11 GMT (envelope-from nobody) Message-Id: <201008212033.o7LKXBxx042579@www.freebsd.org> Date: Sat, 21 Aug 2010 20:33:11 GMT From: Volodymyr Kostyrko To: freebsd-gnats-submit@FreeBSD.org X-Send-Pr-Version: www-3.1 Cc: Subject: kern/149857: kqueue not reporting EOF under certain circumstances X-BeenThere: freebsd-bugs@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Bug reports List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 21 Aug 2010 20:40:02 -0000 >Number: 149857 >Category: kern >Synopsis: kqueue not reporting EOF under certain circumstances >Confidential: no >Severity: non-critical >Priority: low >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: sw-bug >Submitter-Id: current-users >Arrival-Date: Sat Aug 21 20:40:01 UTC 2010 >Closed-Date: >Last-Modified: >Originator: Volodymyr Kostyrko >Release: RELENG_8 >Organization: >Environment: FreeBSD limbo.lan 8.1-STABLE FreeBSD 8.1-STABLE #0 r211484M: Thu Aug 19 10:06:29 EEST 2010 arcade@limbo.lan:/usr/obj/usr/src/sys/MINIMAL_8 i386 >Description: kqueue ignores EOF event in some cases. I've tried to ping python people thinking that this one can be python based but they don't think this happens in python. In any case http://bugs.python.org/issue9591 is the place for this bug in python roundup. >How-To-Repeat: Sorry for the python code, I'm bad at C. Generally this program only eats everything what comes on stdin, logs any kevents faced and exits on stream end. Two EOF cases are checked - when kqueue returns 1 >> 15 (32768) or when we receive 0 bytes of data instead of value given in kevent. ---------- test.py #!/usr/bin/env python3.1 import select, sys kq = select.kqueue() assert kq.fileno() != -1, "Fatal error: can't initialise kqueue." kq.control([select.kevent(sys.stdin, select.KQ_FILTER_READ, select.KQ_EV_ADD)], 0) eof = False while True: kevs = kq.control(None, 1, None) for kev in kevs: print(kev.filter, kev.data, kev.flags, kev.ident, kev.fflags) if kev.filter == select.KQ_FILTER_READ and kev.data > 0: buffer = sys.stdin.read(kev.data) if len(buffer) == 0: print('eof') eof = True if kev.flags >> 15 == 1 or eof: eof = True kq.control([select.kevent(sys.stdin, select.KQ_FILTER_READ, select.KQ_EV_DELETE)], 0) if len(kevs) == 0 or eof: break ---------- test.py Now let's have some fun: # cat test.py | ./test.py -1 684 32768 0 0 # This hangs: # ./test.py < test.py -1 684 0 0 0 <- We are hanging and waiting for other data. I have tested that on RELENG_8 and RELENG_8_1 and results are the same. >Fix: None. >Release-Note: >Audit-Trail: >Unformatted: