int
check_connection_completion(int fd)
{
+ static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(5, 10);
struct pollfd pfd;
int retval;
retval = poll(&pfd, 1, 0);
} while (retval < 0 && errno == EINTR);
if (retval == 1) {
- return get_socket_error(fd);
+ if (pfd.revents & POLLERR) {
+ ssize_t n = send(fd, "", 1, MSG_DONTWAIT);
+ if (n < 0) {
+ return errno;
+ } else {
+ VLOG_ERR_RL(&rl, "poll return POLLERR but send succeeded");
+ return EPROTO;
+ }
+ }
+ return 0;
} else if (retval < 0) {
- static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(5, 10);
VLOG_ERR_RL(&rl, "poll: %s", strerror(errno));
return errno;
} else {
def check_connection_completion(sock):
p = ovs.poller.SelectPoll()
p.register(sock, ovs.poller.POLLOUT)
- if len(p.poll(0)) == 1:
- return get_socket_error(sock)
+ pfds = p.poll(0)
+ if len(pfds) == 1:
+ revents = pfds[0][1]
+ if revents & ovs.poller.POLLERR:
+ try:
+ # The following should raise an exception.
+ socket.send("\0", socket.MSG_DONTWAIT)
+
+ # (Here's where we end up if it didn't.)
+ # XXX rate-limit
+ vlog.err("poll return POLLERR but send succeeded")
+ return errno.EPROTO
+ except socket.error, e:
+ return get_exception_errno(e)
+ else:
+ return 0
else:
return errno.EAGAIN