From e40339856f1b5a968197d44700b915a48965d106 Mon Sep 17 00:00:00 2001 From: Zygo Blaxell Date: Wed, 4 Dec 2024 11:11:13 -0500 Subject: [PATCH] readahead: use the right parameter order when checking the range In some cases the offset and size arguments were flipped when checking to see if a range had already been read. This would have been OK as long as the same mistake had been made consistently, since `bees_readahead_check` only does a cache lookup on the parameters, it doesn't try to use them to read a file. Alas, there was one case where the correct order was used, albeit a relatively rare one. Fix all the calls to use the correct order. Also fix a comment: the recent request cache is global to all threads. Signed-off-by: Zygo Blaxell --- src/bees.cc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/bees.cc b/src/bees.cc index 1029cd4..c5c9ce9 100644 --- a/src/bees.cc +++ b/src/bees.cc @@ -220,7 +220,7 @@ bees_readahead_check(int const fd, off_t const offset, size_t const size) { // FIXME: the rest of the code calls this function more often than necessary, // usually back-to-back calls on the same range in a loop. - // Simply discard requests that are identical to recent requests from the same thread. + // Simply discard requests that are identical to recent requests. const Stat stat_rv(fd); auto tup = make_tuple(offset, size, stat_rv.st_dev, stat_rv.st_ino); static mutex s_recent_mutex; @@ -242,7 +242,7 @@ static void bees_readahead_nolock(int const fd, const off_t offset, const size_t size) { - if (!bees_readahead_check(fd, size, offset)) return; + if (!bees_readahead_check(fd, offset, size)) return; Timer readahead_timer; BEESNOTE("readahead " << name_fd(fd) << " offset " << to_hex(offset) << " len " << pretty(size)); BEESTOOLONG("readahead " << name_fd(fd) << " offset " << to_hex(offset) << " len " << pretty(size)); @@ -278,7 +278,7 @@ static mutex s_only_one; void bees_readahead_pair(int fd, off_t offset, size_t size, int fd2, off_t offset2, size_t size2) { - if (!bees_readahead_check(fd, size, offset) && !bees_readahead_check(fd2, offset2, size2)) return; + if (!bees_readahead_check(fd, offset, size) && !bees_readahead_check(fd2, offset2, size2)) return; BEESNOTE("waiting to readahead " << name_fd(fd) << " offset " << to_hex(offset) << " len " << pretty(size) << "," << "\n\t" << name_fd(fd2) << " offset " << to_hex(offset2) << " len " << pretty(size2)); unique_lock m_lock(s_only_one); @@ -289,7 +289,7 @@ bees_readahead_pair(int fd, off_t offset, size_t size, int fd2, off_t offset2, s void bees_readahead(int const fd, const off_t offset, const size_t size) { - if (!bees_readahead_check(fd, size, offset)) return; + if (!bees_readahead_check(fd, offset, size)) return; BEESNOTE("waiting to readahead " << name_fd(fd) << " offset " << to_hex(offset) << " len " << pretty(size)); unique_lock m_lock(s_only_one); bees_readahead_nolock(fd, offset, size);