Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 18 May 2020 18:36:32 +0000 (UTC)
From:      Alan Somers <asomers@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r361223 - head/tests/sys/fs/fusefs
Message-ID:  <202005181836.04IIaWCJ005070@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: asomers
Date: Mon May 18 18:36:32 2020
New Revision: 361223
URL: https://svnweb.freebsd.org/changeset/base/361223

Log:
  fusefs: fix intermittency in some ENOENT tests
  
  When a FUSE operation other than LOOKUP returns ENOENT, the kernel will
  reclaim that vnode, resuling in a FUSE_FORGET being sent a short while
  later.  Many of the ENOENT tests weren't expecting those FUSE_FORGET
  operations.  They usually passed by luck since FUSE_FORGET is often delayed.
  This commit adds appropriate expectations.
  
  MFC after:	2 weeks

Modified:
  head/tests/sys/fs/fusefs/getattr.cc
  head/tests/sys/fs/fusefs/open.cc
  head/tests/sys/fs/fusefs/opendir.cc

Modified: head/tests/sys/fs/fusefs/getattr.cc
==============================================================================
--- head/tests/sys/fs/fusefs/getattr.cc	Mon May 18 18:32:58 2020	(r361222)
+++ head/tests/sys/fs/fusefs/getattr.cc	Mon May 18 18:36:32 2020	(r361223)
@@ -32,6 +32,8 @@
 
 extern "C" {
 #include <sys/param.h>
+
+#include <semaphore.h>
 }
 
 #include "mockfs.hh"
@@ -172,7 +174,10 @@ TEST_F(Getattr, enoent)
 	const char RELPATH[] = "some_file.txt";
 	struct stat sb;
 	const uint64_t ino = 42;
+	sem_t sem;
 
+	ASSERT_EQ(0, sem_init(&sem, 0, 0)) << strerror(errno);
+
 	expect_lookup(RELPATH, ino, S_IFREG | 0644, 0, 1, 0, 0);
 	EXPECT_CALL(*m_mock, process(
 		ResultOf([](auto in) {
@@ -181,8 +186,15 @@ TEST_F(Getattr, enoent)
 		}, Eq(true)),
 		_)
 	).WillOnce(Invoke(ReturnErrno(ENOENT)));
+	// Since FUSE_GETATTR returns ENOENT, the kernel will reclaim the vnode
+	// and send a FUSE_FORGET
+	expect_forget(ino, 1, &sem);
+
 	EXPECT_NE(0, stat(FULLPATH, &sb));
 	EXPECT_EQ(ENOENT, errno);
+
+	sem_wait(&sem);
+	sem_destroy(&sem);
 }
 
 TEST_F(Getattr, ok)

Modified: head/tests/sys/fs/fusefs/open.cc
==============================================================================
--- head/tests/sys/fs/fusefs/open.cc	Mon May 18 18:32:58 2020	(r361222)
+++ head/tests/sys/fs/fusefs/open.cc	Mon May 18 18:36:32 2020	(r361223)
@@ -32,7 +32,9 @@
 
 extern "C" {
 #include <sys/wait.h>
+
 #include <fcntl.h>
+#include <semaphore.h>
 }
 
 #include "mockfs.hh"
@@ -105,7 +107,10 @@ TEST_F(Open, enoent)
 	const char FULLPATH[] = "mountpoint/some_file.txt";
 	const char RELPATH[] = "some_file.txt";
 	uint64_t ino = 42;
+	sem_t sem;
 
+	ASSERT_EQ(0, sem_init(&sem, 0, 0)) << strerror(errno);
+
 	expect_lookup(RELPATH, ino, S_IFREG | 0644, 0, 1);
 	EXPECT_CALL(*m_mock, process(
 		ResultOf([=](auto in) {
@@ -114,8 +119,15 @@ TEST_F(Open, enoent)
 		}, Eq(true)),
 		_)
 	).WillOnce(Invoke(ReturnErrno(ENOENT)));
+	// Since FUSE_OPEN returns ENOENT, the kernel will reclaim the vnode
+	// and send a FUSE_FORGET
+	expect_forget(ino, 1, &sem);
+
 	ASSERT_EQ(-1, open(FULLPATH, O_RDONLY));
 	EXPECT_EQ(ENOENT, errno);
+
+	sem_wait(&sem);
+	sem_destroy(&sem);
 }
 
 /* 

Modified: head/tests/sys/fs/fusefs/opendir.cc
==============================================================================
--- head/tests/sys/fs/fusefs/opendir.cc	Mon May 18 18:32:58 2020	(r361222)
+++ head/tests/sys/fs/fusefs/opendir.cc	Mon May 18 18:36:32 2020	(r361223)
@@ -32,7 +32,9 @@
 
 extern "C" {
 #include <dirent.h>
+
 #include <fcntl.h>
+#include <semaphore.h>
 }
 
 #include "mockfs.hh"
@@ -82,12 +84,21 @@ TEST_F(Opendir, enoent)
 	const char FULLPATH[] = "mountpoint/some_dir";
 	const char RELPATH[] = "some_dir";
 	uint64_t ino = 42;
+	sem_t sem;
 
+	ASSERT_EQ(0, sem_init(&sem, 0, 0)) << strerror(errno);
+
 	expect_lookup(RELPATH, ino);
 	expect_opendir(ino, O_RDONLY, ReturnErrno(ENOENT));
+	// Since FUSE_OPENDIR returns ENOENT, the kernel will reclaim the vnode
+	// and send a FUSE_FORGET
+	expect_forget(ino, 1, &sem);
 
 	ASSERT_EQ(-1, open(FULLPATH, O_DIRECTORY));
 	EXPECT_EQ(ENOENT, errno);
+
+	sem_wait(&sem);
+	sem_destroy(&sem);
 }
 
 /* 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202005181836.04IIaWCJ005070>