svn commit: r347403 - projects/fuse2/tests/sys/fs/fusefs

Alan Somers asomers at FreeBSD.org
Thu May 9 18:23:11 UTC 2019


Author: asomers
Date: Thu May  9 18:23:09 2019
New Revision: 347403
URL: https://svnweb.freebsd.org/changeset/base/347403

Log:
  fusefs: shorten and consolidate sleeps
  
  Some fusefs tests must sleep because they deliberately trigger a race, or
  because they're testing the cache timeout functionality.  Consolidate the
  sleep interval in a single place so it will be easy to adjust.  Shorten it
  from either 500ms or 250ms to 100ms.  From experiment I find that 10ms works
  every time, so 100ms should be fairly safe.
  
  Sponsored by:	The FreeBSD Foundation

Modified:
  projects/fuse2/tests/sys/fs/fusefs/getattr.cc
  projects/fuse2/tests/sys/fs/fusefs/interrupt.cc
  projects/fuse2/tests/sys/fs/fusefs/lookup.cc
  projects/fuse2/tests/sys/fs/fusefs/read.cc
  projects/fuse2/tests/sys/fs/fusefs/utils.hh

Modified: projects/fuse2/tests/sys/fs/fusefs/getattr.cc
==============================================================================
--- projects/fuse2/tests/sys/fs/fusefs/getattr.cc	Thu May  9 18:06:11 2019	(r347402)
+++ projects/fuse2/tests/sys/fs/fusefs/getattr.cc	Thu May  9 18:23:09 2019	(r347403)
@@ -100,11 +100,6 @@ TEST_F(Getattr, attr_cache_timeout)
 	const char RELPATH[] = "some_file.txt";
 	const uint64_t ino = 42;
 	struct stat sb;
-	/* 
-	 * The timeout should be longer than the longest plausible time the
-	 * daemon would take to complete a write(2) to /dev/fuse, but no longer.
-	 */
-	long timeout_ns = 250'000'000;
 
 	expect_lookup(RELPATH, ino, S_IFREG | 0644, 0, 1, 0, 0);
 	EXPECT_CALL(*m_mock, process(
@@ -116,14 +111,14 @@ TEST_F(Getattr, attr_cache_timeout)
 	).Times(2)
 	.WillRepeatedly(Invoke(ReturnImmediate([=](auto i __unused, auto out) {
 		SET_OUT_HEADER_LEN(out, attr);
-		out->body.attr.attr_valid_nsec = timeout_ns;
+		out->body.attr.attr_valid_nsec = NAP_NS / 2;
 		out->body.attr.attr_valid = 0;
 		out->body.attr.attr.ino = ino;	// Must match nodeid
 		out->body.attr.attr.mode = S_IFREG | 0644;
 	})));
 
 	EXPECT_EQ(0, stat(FULLPATH, &sb));
-	usleep(2 * timeout_ns / 1000);
+	nap();
 	/* Timeout has expired. stat(2) should requery the daemon */
 	EXPECT_EQ(0, stat(FULLPATH, &sb));
 }

Modified: projects/fuse2/tests/sys/fs/fusefs/interrupt.cc
==============================================================================
--- projects/fuse2/tests/sys/fs/fusefs/interrupt.cc	Thu May  9 18:06:11 2019	(r347402)
+++ projects/fuse2/tests/sys/fs/fusefs/interrupt.cc	Thu May  9 18:23:09 2019	(r347403)
@@ -69,7 +69,7 @@ void sigusr2_handler(int __unused sig) {
 void* killer(void* target) {
 	/* Wait until the main thread is blocked in fdisp_wait_answ */
 	if (killer_should_sleep)
-		usleep(250'000);
+		nap();
 	else
 		sem_wait(blocked_semaphore);
 	if (verbosity > 1)
@@ -478,7 +478,7 @@ TEST_F(Interrupt, in_kernel_restartable)
 	ASSERT_EQ(0, sem_post(&sem0)) << strerror(errno);
 
 	/* Wait awhile to make sure the signal generates no FUSE_INTERRUPT */
-	usleep(250'000);
+	nap();
 
 	pthread_join(th1, &thr1_value);
 	pthread_join(th0, &thr0_value);
@@ -548,7 +548,7 @@ TEST_F(Interrupt, in_kernel_nonrestartable)
 	ASSERT_EQ(0, sem_post(&sem0)) << strerror(errno);
 
 	/* Wait awhile to make sure the signal generates no FUSE_INTERRUPT */
-	usleep(250'000);
+	nap();
 
 	pthread_join(th0, &thr0_value);
 	EXPECT_EQ(0, (intptr_t)thr0_value);
@@ -700,7 +700,7 @@ TEST_F(Interrupt, priority)
 	ASSERT_EQ(0, mkdir(FULLDIRPATH1, MODE)) << strerror(errno);
 
 	/* Wait awhile to make sure the signal generates no FUSE_INTERRUPT */
-	usleep(250'000);
+	nap();
 
 	pthread_join(th0, NULL);
 	sem_destroy(&sem1);

Modified: projects/fuse2/tests/sys/fs/fusefs/lookup.cc
==============================================================================
--- projects/fuse2/tests/sys/fs/fusefs/lookup.cc	Thu May  9 18:06:11 2019	(r347402)
+++ projects/fuse2/tests/sys/fs/fusefs/lookup.cc	Thu May  9 18:23:09 2019	(r347403)
@@ -110,18 +110,13 @@ TEST_F(Lookup, attr_cache_timeout)
 	const char RELPATH[] = "some_file.txt";
 	const uint64_t ino = 42;
 	struct stat sb;
-	/* 
-	 * The timeout should be longer than the longest plausible time the
-	 * daemon would take to complete a write(2) to /dev/fuse, but no longer.
-	 */
-	long timeout_ns = 250'000'000;
 
 	EXPECT_LOOKUP(1, RELPATH)
 	.Times(2)
 	.WillRepeatedly(Invoke(ReturnImmediate([=](auto in __unused, auto out) {
 		SET_OUT_HEADER_LEN(out, entry);
 		out->body.entry.nodeid = ino;
-		out->body.entry.attr_valid_nsec = timeout_ns;
+		out->body.entry.attr_valid_nsec = NAP_NS / 2;
 		out->body.entry.attr.ino = ino;	// Must match nodeid
 		out->body.entry.attr.mode = S_IFREG | 0644;
 	})));
@@ -129,7 +124,7 @@ TEST_F(Lookup, attr_cache_timeout)
 	/* access(2) will issue a VOP_LOOKUP and fill the attr cache */
 	ASSERT_EQ(0, access(FULLPATH, F_OK)) << strerror(errno);
 	/* Next access(2) will use the cached attributes */
-	usleep(2 * timeout_ns / 1000);
+	nap();
 	/* The cache has timed out; VOP_GETATTR should query the daemon*/
 	ASSERT_EQ(0, stat(FULLPATH, &sb)) << strerror(errno);
 }
@@ -247,11 +242,7 @@ TEST_F(Lookup, entry_cache_negative_timeout)
 {
 	const char *RELPATH = "does_not_exist";
 	const char *FULLPATH = "mountpoint/does_not_exist";
-	/* 
-	 * The timeout should be longer than the longest plausible time the
-	 * daemon would take to complete a write(2) to /dev/fuse, but no longer.
-	 */
-	struct timespec entry_valid = {.tv_sec = 0, .tv_nsec = 250'000'000};
+	struct timespec entry_valid = {.tv_sec = 0, .tv_nsec = NAP_NS / 2};
 
 	EXPECT_LOOKUP(1, RELPATH).Times(2)
 	.WillRepeatedly(Invoke(ReturnNegativeCache(&entry_valid)));
@@ -259,7 +250,7 @@ TEST_F(Lookup, entry_cache_negative_timeout)
 	EXPECT_NE(0, access(FULLPATH, F_OK));
 	EXPECT_EQ(ENOENT, errno);
 
-	usleep(2 * entry_valid.tv_nsec / 1000);
+	nap();
 
 	/* The cache has timed out; VOP_LOOKUP should requery the daemon*/
 	EXPECT_NE(0, access(FULLPATH, F_OK));
@@ -274,17 +265,12 @@ TEST_F(Lookup, entry_cache_timeout)
 {
 	const char FULLPATH[] = "mountpoint/some_file.txt";
 	const char RELPATH[] = "some_file.txt";
-	/* 
-	 * The timeout should be longer than the longest plausible time the
-	 * daemon would take to complete a write(2) to /dev/fuse, but no longer.
-	 */
-	long timeout_ns = 250'000'000;
 
 	EXPECT_LOOKUP(1, RELPATH)
 	.Times(2)
 	.WillRepeatedly(Invoke(ReturnImmediate([=](auto in __unused, auto out) {
 		SET_OUT_HEADER_LEN(out, entry);
-		out->body.entry.entry_valid_nsec = timeout_ns;
+		out->body.entry.entry_valid_nsec = NAP_NS / 2;
 		out->body.entry.attr.mode = S_IFREG | 0644;
 		out->body.entry.nodeid = 14;
 	})));
@@ -293,7 +279,7 @@ TEST_F(Lookup, entry_cache_timeout)
 	ASSERT_EQ(0, access(FULLPATH, F_OK)) << strerror(errno);
 	/* Next access(2) will use the cached entry */
 	ASSERT_EQ(0, access(FULLPATH, F_OK)) << strerror(errno);
-	usleep(2 * timeout_ns / 1000);
+	nap();
 	/* The cache has timed out; VOP_LOOKUP should requery the daemon*/
 	ASSERT_EQ(0, access(FULLPATH, F_OK)) << strerror(errno);
 }

Modified: projects/fuse2/tests/sys/fs/fusefs/read.cc
==============================================================================
--- projects/fuse2/tests/sys/fs/fusefs/read.cc	Thu May  9 18:06:11 2019	(r347402)
+++ projects/fuse2/tests/sys/fs/fusefs/read.cc	Thu May  9 18:23:09 2019	(r347403)
@@ -200,7 +200,7 @@ TEST_F(AioRead, async_read_disabled)
 	 * Sleep for awhile to make sure the kernel has had a chance to issue
 	 * the second read, even though the first has not yet returned
 	 */
-	usleep(250'000);
+	nap();
 	
 	/* Deliberately leak iocbs */
 	/* Deliberately leak fd.  close(2) will be tested in release.cc */
@@ -278,7 +278,7 @@ TEST_F(AsyncRead, DISABLED_async_read)
 	 * Sleep for awhile to make sure the kernel has had a chance to issue
 	 * both reads.
 	 */
-	usleep(250'000);
+	nap();
 	
 	/* Deliberately leak iocbs */
 	/* Deliberately leak fd.  close(2) will be tested in release.cc */

Modified: projects/fuse2/tests/sys/fs/fusefs/utils.hh
==============================================================================
--- projects/fuse2/tests/sys/fs/fusefs/utils.hh	Thu May  9 18:06:11 2019	(r347402)
+++ projects/fuse2/tests/sys/fs/fusefs/utils.hh	Thu May  9 18:23:09 2019	(r347403)
@@ -37,7 +37,14 @@
 #define FUSE_WRITE_CACHE 1
 #endif
 
+/* Nanoseconds to sleep, for tests that must */
+#define NAP_NS	(100'000'000)
+
 void get_unprivileged_id(uid_t *uid, gid_t *gid);
+inline void nap()
+{
+	usleep(NAP_NS / 1000);
+}
 
 class FuseTest : public ::testing::Test {
 	protected:


More information about the svn-src-projects mailing list