[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.