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