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);
 }
 
 /* 
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to