From ab9b08f8af70b8ce7bcc9cd28f9704f1f4542320 Mon Sep 17 00:00:00 2001 From: Howard Chu Date: Sat, 12 Oct 2013 16:20:04 -0700 Subject: [PATCH] ITS#7725 add MDB_NORDAHEAD flag for env_open --- libraries/liblmdb/lmdb.h | 8 ++++++++ libraries/liblmdb/mdb.c | 9 ++++++--- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/libraries/liblmdb/lmdb.h b/libraries/liblmdb/lmdb.h index f6dfa60c38..f72869e6c8 100644 --- a/libraries/liblmdb/lmdb.h +++ b/libraries/liblmdb/lmdb.h @@ -275,6 +275,8 @@ typedef void (MDB_rel_func)(MDB_val *item, void *oldptr, void *newptr, void *rel #define MDB_NOTLS 0x200000 /** don't do any locking, caller must manage their own locks */ #define MDB_NOLOCK 0x400000 + /** don't do readahead (no effect on Windows) */ +#define MDB_NORDAHEAD 0x800000 /** @} */ /** @defgroup mdb_dbi_open Database Flags @@ -538,6 +540,12 @@ int mdb_env_create(MDB_env **env); * that no readers are using old transactions while a writer is * active. The simplest approach is to use an exclusive lock so that * no readers may be active at all when a writer begins. + *
  • #MDB_NORDAHEAD + * Turn off readahead. Most operating systems perform readahead on + * read requests by default. This option turns it off if the OS + * supports it. Turning it off may help random read performance + * when the DB is larger than RAM and system RAM is full. + * The option is not implemented on Windows. * * @param[in] mode The UNIX permissions to set on created files. This parameter * is ignored on Windows. diff --git a/libraries/liblmdb/mdb.c b/libraries/liblmdb/mdb.c index 25be7482ec..2ebf1a9eab 100644 --- a/libraries/liblmdb/mdb.c +++ b/libraries/liblmdb/mdb.c @@ -3283,14 +3283,17 @@ mdb_env_map(MDB_env *env, void *addr, int newsize) env->me_map = NULL; return ErrCode(); } - /* Turn off readahead. It's harmful when the DB is larger than RAM. */ + + if (flags & MDB_NORDAHEAD) { + /* Turn off readahead. It's harmful when the DB is larger than RAM. */ #ifdef MADV_RANDOM - madvise(env->me_map, env->me_mapsize, MADV_RANDOM); + madvise(env->me_map, env->me_mapsize, MADV_RANDOM); #else #ifdef POSIX_MADV_RANDOM - posix_madvise(env->me_map, env->me_mapsize, POSIX_MADV_RANDOM); + posix_madvise(env->me_map, env->me_mapsize, POSIX_MADV_RANDOM); #endif /* POSIX_MADV_RANDOM */ #endif /* MADV_RANDOM */ + } #endif /* _WIN32 */ /* Can happen because the address argument to mmap() is just a