]> git.sur5r.net Git - openldap/commitdiff
ITS#7725 add MDB_NORDAHEAD flag for env_open
authorHoward Chu <hyc@symas.com>
Sat, 12 Oct 2013 23:20:04 +0000 (16:20 -0700)
committerHoward Chu <hyc@symas.com>
Sat, 12 Oct 2013 23:20:04 +0000 (16:20 -0700)
libraries/liblmdb/lmdb.h
libraries/liblmdb/mdb.c

index f6dfa60c38f877c12b995a53ea3ed121f3b54ff9..f72869e6c85b75d35c38a6d6ae6859e27d69abda 100644 (file)
@@ -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.
+        *      <li>#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.
         * </ul>
         * @param[in] mode The UNIX permissions to set on created files. This parameter
         * is ignored on Windows.
index 25be7482ecc966db99724da48e0d798a73103167..2ebf1a9eabb7d47bd828803c967975d3b900b5dc 100644 (file)
@@ -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