[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

[Libevent-users] bufferevent read high watermark and missing error/event callback



Hi

I've run into an issue and I'm wondering if it's expected behavior or not.

If a bufferevent with a configured read-high-watermark actually reaches the watermark, the TCP disconnect on the underlying socket is not reported.  I've observed this on Mac OS X (kevent) as well as linux 3.5 (epoll), using libevent 2.0.21

Here's a simple example.  Error checking omitted for brevity:  https://gist.github.com/minaguib/5250939

To reproduce, compile and run the server, which will listen on port 5001.

Do a simple test which does not exceed the read high watermark:
	$ echo "1" | nc localhost 5001
The server prints:
	New client
	Got data from client - ignoring it
	Client disconnected

Next, do a simple test which exceeds the read high watermark:
	$ echo "hello world" | nc localhost 5001
The server prints:
	New client
	Got data from client - ignoring it

Note that even though netcat has died, and the client->server FIN packet has been sent and ACKnowledged (verified with tcpdump), the handle_client_buffer_evt callback was never invoked.

Is it a requirement that input is fully drained so that libevent can observe the underlying socket's closure ?  Perhaps I've wrongly assumed that event/error notifications are out-of-band when they're not.

FWIW this is what I see with strace on linux when I write "hello world" from the client then the client closes:

	{{EPOLLIN, {u32=8, u64=8}}}, 32, -1) = 1
	ioctl(8, FIONREAD, [13])                = 0
	readv(8, [{"hell", 4}], 1)              = 4
	epoll_ctl(3, EPOLL_CTL_DEL, 8, {EPOLLIN, {u32=8, u64=8}}) = 0
	write(1, "Got data from client - ignoring "..., 35Got data from client - ignoring it
	) = 35
	epoll_wait(3,







***********************************************************************
To unsubscribe, send an e-mail to majordomo@xxxxxxxxxxxxx with
unsubscribe libevent-users    in the body.