Hi, On 2020-02-08 08:55:25 -0500, Glauber Costa wrote: > - A connect() call is issued (and in the backend I can choose if I use > uring or not) > - The connection is supposed to take a while to establish. > - I call shutdown on the file descriptor > > If io_uring is not used: > - connect() starts by returning EINPROGRESS as expected, and after > the shutdown the file descriptor is finally made ready for epoll. I > call getsockopt(SOL_SOCKET, SO_ERROR), and see the error (104) > > if io_uring is used: > - if the SQE has the IOSQE_ASYNC flag on, connect() never returns. That should be easy enough to reproduce without seastar as it sounds deterministic - how about modifying liburing's test/connect.c test to behave this way? Hm, any chance you set O_NONBLOCK on the fd, before calling the async connect? Wonder if io_connect() file_flags = force_nonblock ? O_NONBLOCK : 0; ret = __sys_connect_file(req->file, &io->connect.address, req->connect.addr_len, file_flags); if ((ret == -EAGAIN || ret == -EINPROGRESS) && force_nonblock) { fully takes into account that __sys_connect_file err = sock->ops->connect(sock, (struct sockaddr *)address, addrlen, sock->file->f_flags | file_flags); appears to leave O_NONBLOCK set on the file in place, which'd then not block in the wq? Greetings, Andres Freund