add prefetch to PosixRandomAccessFile in buffered io
Summary: Every time after a compaction/flush finish, we issue user reads to put the table into block cache which includes a couple of IO that read footer, index blocks, meta block, etc. So we implement Prefetch here to reduce IO. Closes https://github.com/facebook/rocksdb/pull/2196 Differential Revision: D4931782 Pulled By: lightmark fbshipit-source-id: 5a13d58dcab209964352322217193bbf7ff78149
This commit is contained in:
parent
1530f38baa
commit
6d29d8b3fa
24
env/io_posix.cc
vendored
24
env/io_posix.cc
vendored
@ -37,7 +37,7 @@
|
||||
namespace rocksdb {
|
||||
|
||||
// A wrapper for fadvise, if the platform doesn't support fadvise,
|
||||
// it will simply return Status::NotSupport.
|
||||
// it will simply return 0.
|
||||
int Fadvise(int fd, off_t offset, size_t len, int advice) {
|
||||
#ifdef OS_LINUX
|
||||
return posix_fadvise(fd, offset, len, advice);
|
||||
@ -336,7 +336,27 @@ Status PosixRandomAccessFile::Read(uint64_t offset, size_t n, Slice* result,
|
||||
return s;
|
||||
}
|
||||
|
||||
#if defined(OS_LINUX) || defined(OS_MACOSX)
|
||||
Status PosixRandomAccessFile::Prefetch(uint64_t offset, size_t n) {
|
||||
Status s;
|
||||
if (!use_direct_io()) {
|
||||
ssize_t r = 0;
|
||||
#ifdef OS_LINUX
|
||||
r = readahead(fd_, offset, n);
|
||||
#endif
|
||||
#ifdef OS_MACOSX
|
||||
radvisory advice;
|
||||
advice.ra_offset = static_cast<off_t>(offset);
|
||||
advice.ra_count = static_cast<int>(n);
|
||||
r = fcntl(fd_, F_RDADVISE, &advice);
|
||||
#endif
|
||||
if (r == -1) {
|
||||
s = IOError(filename_, errno);
|
||||
}
|
||||
}
|
||||
return s;
|
||||
}
|
||||
|
||||
#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_AIX)
|
||||
size_t PosixRandomAccessFile::GetUniqueId(char* id, size_t max_size) const {
|
||||
return PosixHelper::GetUniqueIdFromFile(fd_, id, max_size);
|
||||
}
|
||||
|
5
env/io_posix.h
vendored
5
env/io_posix.h
vendored
@ -79,7 +79,10 @@ class PosixRandomAccessFile : public RandomAccessFile {
|
||||
|
||||
virtual Status Read(uint64_t offset, size_t n, Slice* result,
|
||||
char* scratch) const override;
|
||||
#if defined(OS_LINUX) || defined(OS_MACOSX)
|
||||
|
||||
virtual Status Prefetch(uint64_t offset, size_t n) override;
|
||||
|
||||
#if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_AIX)
|
||||
virtual size_t GetUniqueId(char* id, size_t max_size) const override;
|
||||
#endif
|
||||
virtual void Hint(AccessPattern pattern) override;
|
||||
|
Loading…
Reference in New Issue
Block a user