Join GitHub today
GitHub is home to over 40 million developers working together to host and review code, manage projects, and build software together.Sign up
runtime: sockets closed by remote peer may remain undetected by poller #6753
I have observed a network TCP server blocked on a Write although the client (Go program located on a remote machine) has closed the connection. So far I have been unable to produce a minimal reproducer. My hypothesis is that the poller is not handling EPOLLRDHUP correctly. map epoll_ctl(2) says that it means: "Stream socket peer closed connection, or shut down writing half of connection." But when obtaining EPOLLRDHUP from the socket the poller wakes up WaitRead() but not WaitWrite(), so if the EPOLLRDHUP was generated by a remote close, waiting writers will never wake up (one would expect something like "connection reset by peer"). Using linux/amd64.
Writes must not be unblocked/prohibited after EPOLLRDHUP, writing is exactly what server is supposed to do after EPOLLRDHUP (shutdown(SHUT_WR) on client). If the client does close(fd), then the server receives EPOLLRDHUP | EPOLLHUP | EPOLLERR, so writes must be unblocked. So far I do not see where the problem is. Do you use CloseRead/CloseWrite?