From owner-svn-src-projects@freebsd.org Wed May 15 20:01:42 2019 Return-Path: Delivered-To: svn-src-projects@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 5027E15A085D for ; Wed, 15 May 2019 20:01:42 +0000 (UTC) (envelope-from asomers@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) server-signature RSA-PSS (4096 bits) client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "Let's Encrypt Authority X3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id EA3546F1C0; Wed, 15 May 2019 20:01:41 +0000 (UTC) (envelope-from asomers@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id C594AE710; Wed, 15 May 2019 20:01:41 +0000 (UTC) (envelope-from asomers@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id x4FK1fbK020881; Wed, 15 May 2019 20:01:41 GMT (envelope-from asomers@FreeBSD.org) Received: (from asomers@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id x4FK1fwi020880; Wed, 15 May 2019 20:01:41 GMT (envelope-from asomers@FreeBSD.org) Message-Id: <201905152001.x4FK1fwi020880@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: asomers set sender to asomers@FreeBSD.org using -f From: Alan Somers Date: Wed, 15 May 2019 20:01:41 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r347631 - projects/fuse2/tests/sys/fs/fusefs X-SVN-Group: projects X-SVN-Commit-Author: asomers X-SVN-Commit-Paths: projects/fuse2/tests/sys/fs/fusefs X-SVN-Commit-Revision: 347631 X-SVN-Commit-Repository: base MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Rspamd-Queue-Id: EA3546F1C0 X-Spamd-Bar: -- Authentication-Results: mx1.freebsd.org X-Spamd-Result: default: False [-2.98 / 15.00]; local_wl_from(0.00)[FreeBSD.org]; NEURAL_HAM_MEDIUM(-1.00)[-0.999,0]; NEURAL_HAM_SHORT(-0.98)[-0.982,0]; ASN(0.00)[asn:11403, ipnet:2610:1c1:1::/48, country:US]; NEURAL_HAM_LONG(-1.00)[-1.000,0] X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 15 May 2019 20:01:42 -0000 Author: asomers Date: Wed May 15 20:01:41 2019 New Revision: 347631 URL: https://svnweb.freebsd.org/changeset/base/347631 Log: fusefs: fix more intermittency in the dev_fuse_poll tests When using poll, kevent, or select there was a race window during which it would be impossible to shut down the daemon. The problem was that poll, kevent, and select don't return when the file descriptor gets closed (or maybe it was that the file descriptor got closed before those syscalls were entered?). The solution is to impose a timeout on those syscalls, and check m_quit after they time out. Sponsored by: The FreeBSD Foundation Modified: projects/fuse2/tests/sys/fs/fusefs/mockfs.cc Modified: projects/fuse2/tests/sys/fs/fusefs/mockfs.cc ============================================================================== --- projects/fuse2/tests/sys/fs/fusefs/mockfs.cc Wed May 15 19:23:29 2019 (r347630) +++ projects/fuse2/tests/sys/fs/fusefs/mockfs.cc Wed May 15 20:01:41 2019 (r347631) @@ -500,23 +500,31 @@ void MockFS::process_default(const mockfs_buf_in *in, void MockFS::read_request(mockfs_buf_in *in) { ssize_t res; - int nready; + int nready = 0; fd_set readfds; pollfd fds[1]; struct kevent changes[1]; struct kevent events[1]; - int nfds; + struct timespec timeout_ts; + struct timeval timeout_tv; + const int timeout_ms = 999; + int timeout_int, nfds; switch (m_pm) { case BLOCKING: break; case KQ: - EV_SET(&changes[0], m_fuse_fd, EVFILT_READ, EV_ADD, 0, 0, 0); - nready = kevent(m_kq, &changes[0], 1, &events[0], 1, NULL); - if (m_quit) - return; + timeout_ts.tv_sec = 0; + timeout_ts.tv_nsec = timeout_ms * 1'000'000; + while (nready == 0) { + EV_SET(&changes[0], m_fuse_fd, EVFILT_READ, EV_ADD, 0, + 0, 0); + nready = kevent(m_kq, &changes[0], 1, &events[0], 1, + &timeout_ts); + if (m_quit) + return; + } ASSERT_LE(0, nready) << strerror(errno); - ASSERT_EQ(1, nready) << "NULL timeout expired?"; ASSERT_EQ(events[0].ident, (uintptr_t)m_fuse_fd); if (events[0].flags & EV_ERROR) FAIL() << strerror(events[0].data); @@ -525,24 +533,30 @@ void MockFS::read_request(mockfs_buf_in *in) { m_nready = events[0].data; break; case POLL: + timeout_int = timeout_ms; fds[0].fd = m_fuse_fd; fds[0].events = POLLIN; - nready = poll(fds, 1, INFTIM); - if (m_quit) - return; + while (nready == 0) { + nready = poll(fds, 1, timeout_int); + if (m_quit) + return; + } ASSERT_LE(0, nready) << strerror(errno); - ASSERT_EQ(1, nready) << "NULL timeout expired?"; ASSERT_TRUE(fds[0].revents & POLLIN); break; case SELECT: - FD_ZERO(&readfds); - FD_SET(m_fuse_fd, &readfds); + timeout_tv.tv_sec = 0; + timeout_tv.tv_usec = timeout_ms * 1'000; nfds = m_fuse_fd + 1; - nready = select(nfds, &readfds, NULL, NULL, NULL); - if (m_quit) - return; + while (nready == 0) { + FD_ZERO(&readfds); + FD_SET(m_fuse_fd, &readfds); + nready = select(nfds, &readfds, NULL, NULL, + &timeout_tv); + if (m_quit) + return; + } ASSERT_LE(0, nready) << strerror(errno); - ASSERT_EQ(1, nready) << "NULL timeout expired?"; ASSERT_TRUE(FD_ISSET(m_fuse_fd, &readfds)); break; default: