svn commit: r361223 - head/tests/sys/fs/fusefs
Alan Somers
asomers at FreeBSD.org
Mon May 18 18:36:33 UTC 2020
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);
}
/*
More information about the svn-src-all
mailing list