add a global var leveldb::useMmapRead to enable mmap Summary:

Summary:
as subject. this can be used for benchmarking.
If we want it for some cases, we can do more changes to make this part of the option.

Test Plan: db_test

Reviewers: dhruba

CC: MarkCallaghan

Differential Revision: https://reviews.facebook.net/D5451
main
heyongqiang 12 years ago
parent dcbd6be340
commit b85cdca690
  1. 4
      db/db_bench.cc
  2. 18
      util/env_posix.cc

@ -170,6 +170,7 @@ static leveldb::Env* FLAGS_env = leveldb::Env::Default();
extern bool useOsBuffer; extern bool useOsBuffer;
extern bool useFsReadAhead; extern bool useFsReadAhead;
extern bool useMmapRead;
namespace leveldb { namespace leveldb {
@ -1182,6 +1183,9 @@ int main(int argc, char** argv) {
} else if (sscanf(argv[i], "--bufferedio=%d%c", &n, &junk) == 1 && } else if (sscanf(argv[i], "--bufferedio=%d%c", &n, &junk) == 1 &&
(n == 0 || n == 1)) { (n == 0 || n == 1)) {
useOsBuffer = n; useOsBuffer = n;
} else if (sscanf(argv[i], "--mmap_read=%d%c", &n, &junk) == 1 &&
(n == 0 || n == 1)) {
useMmapRead = n;
} else if (sscanf(argv[i], "--readhead=%d%c", &n, &junk) == 1 && } else if (sscanf(argv[i], "--readhead=%d%c", &n, &junk) == 1 &&
(n == 0 || n == 1)) { (n == 0 || n == 1)) {
useFsReadAhead = n; useFsReadAhead = n;

@ -28,6 +28,7 @@
bool useOsBuffer = 1; // cache data in OS buffers bool useOsBuffer = 1; // cache data in OS buffers
bool useFsReadAhead = 1; // allow filesystem to do readaheads bool useFsReadAhead = 1; // allow filesystem to do readaheads
bool useMmapRead = 0;
namespace leveldb { namespace leveldb {
@ -386,13 +387,26 @@ class PosixEnv : public Env {
virtual Status NewRandomAccessFile(const std::string& fname, virtual Status NewRandomAccessFile(const std::string& fname,
RandomAccessFile** result) { RandomAccessFile** result) {
// Use of mmap for random reads has been removed because it
// kills performance when storage is fast.
*result = NULL; *result = NULL;
Status s; Status s;
int fd = open(fname.c_str(), O_RDONLY); int fd = open(fname.c_str(), O_RDONLY);
if (fd < 0) { if (fd < 0) {
s = IOError(fname, errno); s = IOError(fname, errno);
} else if (useMmapRead && sizeof(void*) >= 8) {
// Use of mmap for random reads has been removed because it
// kills performance when storage is fast.
// Use mmap when virtual address-space is plentiful.
uint64_t size;
s = GetFileSize(fname, &size);
if (s.ok()) {
void* base = mmap(NULL, size, PROT_READ, MAP_SHARED, fd, 0);
if (base != MAP_FAILED) {
*result = new PosixMmapReadableFile(fname, base, size);
} else {
s = IOError(fname, errno);
}
}
close(fd);
} else { } else {
*result = new PosixRandomAccessFile(fname, fd); *result = new PosixRandomAccessFile(fname, fd);
} }

Loading…
Cancel
Save