aboutsummaryrefslogtreecommitdiff
path: root/tests/sys/fs/fusefs/read.cc
diff options
context:
space:
mode:
authorAlan Somers <asomers@FreeBSD.org>2019-06-17 16:56:51 +0000
committerAlan Somers <asomers@FreeBSD.org>2019-06-17 16:56:51 +0000
commitd569012f4520b1be6fd057ee4577f7567329b156 (patch)
treec78b4061b2ab0e084fd3a60a52ba2cea8fc8c8c4 /tests/sys/fs/fusefs/read.cc
parenteadd12d35d89e35abc6179f0c6417260686ac033 (diff)
downloadsrc-d569012f4520b1be6fd057ee4577f7567329b156.tar.gz
src-d569012f4520b1be6fd057ee4577f7567329b156.zip
fusefs: implement non-clustered readahead
fusefs will now read ahead at most one cache block at a time (usually 64 KB). Clustered reads are still TODO. Individual file systems may disable read ahead by setting fuse_init_out.max_readahead=0 during initialization. Sponsored by: The FreeBSD Foundation
Notes
Notes: svn path=/projects/fuse2/; revision=349147
Diffstat (limited to 'tests/sys/fs/fusefs/read.cc')
-rw-r--r--tests/sys/fs/fusefs/read.cc39
1 files changed, 21 insertions, 18 deletions
diff --git a/tests/sys/fs/fusefs/read.cc b/tests/sys/fs/fusefs/read.cc
index e986c1310144..18e7217a2faa 100644
--- a/tests/sys/fs/fusefs/read.cc
+++ b/tests/sys/fs/fusefs/read.cc
@@ -112,7 +112,7 @@ virtual void SetUp() {
class ReadAhead: public ReadCacheable, public WithParamInterface<uint32_t> {
virtual void SetUp() {
m_maxreadahead = GetParam();
- Read::SetUp();
+ ReadCacheable::SetUp();
}
};
@@ -747,37 +747,40 @@ TEST_F(ReadCacheable, DISABLED_sendfile_eio)
}
/* fuse(4) should honor the filesystem's requested m_readahead parameter */
-/* https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=236472 */
-TEST_P(ReadAhead, DISABLED_readahead) {
+TEST_P(ReadAhead, readahead) {
const char FULLPATH[] = "mountpoint/some_file.txt";
const char RELPATH[] = "some_file.txt";
- const char *CONTENTS0 = "abcdefghijklmnop";
uint64_t ino = 42;
- int fd;
- ssize_t bufsize = 8;
- ssize_t filesize = m_maxbcachebuf * 2;
- char *contents;
- char buf[bufsize];
-
- ASSERT_TRUE(GetParam() < (uint32_t)m_maxbcachebuf)
- << "Test assumes that max_readahead < maxbcachebuf";
+ int fd, i;
+ ssize_t bufsize = m_maxbcachebuf;
+ ssize_t filesize = m_maxbcachebuf * 4;
+ char *rbuf, *contents;
- contents = (char*)calloc(1, filesize);
+ contents = (char*)malloc(filesize);
ASSERT_NE(NULL, contents);
- memmove(contents, CONTENTS0, strlen(CONTENTS0));
+ memset(contents, 'X', filesize);
+ rbuf = (char*)calloc(1, bufsize);
expect_lookup(RELPATH, ino, filesize);
expect_open(ino, 0, 1);
/* fuse(4) should only read ahead the allowed amount */
- expect_read(ino, 0, GetParam(), GetParam(), contents);
+ expect_read(ino, 0, m_maxbcachebuf, m_maxbcachebuf, contents);
+ for (i = 0; i < (int)GetParam() / m_maxbcachebuf; i++) {
+ off_t offs = (i + 1) * m_maxbcachebuf;
+ expect_read(ino, offs, m_maxbcachebuf, m_maxbcachebuf,
+ contents + offs);
+ }
fd = open(FULLPATH, O_RDONLY);
ASSERT_LE(0, fd) << strerror(errno);
- ASSERT_EQ(bufsize, read(fd, buf, bufsize)) << strerror(errno);
- ASSERT_EQ(0, memcmp(buf, CONTENTS0, bufsize));
+ /* Set the internal readahead counter to a "large" value */
+ ASSERT_EQ(0, fcntl(fd, F_READAHEAD, 1'000'000'000)) << strerror(errno);
+
+ ASSERT_EQ(bufsize, read(fd, rbuf, bufsize)) << strerror(errno);
+ ASSERT_EQ(0, memcmp(rbuf, contents, bufsize));
/* Deliberately leak fd. close(2) will be tested in release.cc */
}
-INSTANTIATE_TEST_CASE_P(RA, ReadAhead, ::testing::Values(0u, 2048u));
+INSTANTIATE_TEST_CASE_P(RA, ReadAhead, ::testing::Values(0u, 65536));