]> git.sur5r.net Git - openldap/commitdiff
Partially revert 65d40eb5d2c7c28df05e2c1d9b21d90e2a82e0b5
authorHoward Chu <hyc@symas.com>
Tue, 11 Dec 2012 20:03:19 +0000 (12:03 -0800)
committerHoward Chu <hyc@symas.com>
Tue, 11 Dec 2012 20:03:19 +0000 (12:03 -0800)
Allow both increasing and decreasing the environment size.
But don't allow decreasing below the currently occupied space.

libraries/liblmdb/lmdb.h
libraries/liblmdb/mdb.c

index 9c21cdc68b12452e74ffae8d47ff00712f40814f..e4d55c8b229c8318e9fdd242fec97d00d6a70f60 100644 (file)
@@ -574,6 +574,9 @@ int  mdb_env_get_path(MDB_env *env, const char **path);
         * of the database. The value should be chosen as large as possible,
         * to accommodate future growth of the database.
         * This function may only be called after #mdb_env_create() and before #mdb_env_open().
+        * The size may be changed by closing and reopening the environment.
+        * Any attempt to set a size smaller than the space already consumed
+        * by the environment will be silently changed to the current size of the used space.
         * @param[in] env An environment handle returned by #mdb_env_create()
         * @param[in] size The size in bytes
         * @return A non-zero error value on failure and 0 on success. Some possible
index 4fe330b1d1e0ece3b0ef75f143fde95611d00e64..b25c372fb7c55d80c592b5b6a1423d19f1b43180 100644 (file)
@@ -2722,11 +2722,22 @@ mdb_env_open2(MDB_env *env)
                        return i;
                DPUTS("new mdbenv");
                newenv = 1;
-               meta.mm_mapsize = env->me_mapsize > DEFAULT_MAPSIZE ? env->me_mapsize : DEFAULT_MAPSIZE;
        }
 
-       if (env->me_mapsize < meta.mm_mapsize)
-               env->me_mapsize = meta.mm_mapsize;
+       /* Was a mapsize configured? */
+       if (!env->me_mapsize) {
+               /* If this is a new environment, take the default,
+                * else use the size recorded in the existing env.
+                */
+               env->me_mapsize = newenv ? DEFAULT_MAPSIZE : meta.mm_mapsize;
+       } else if (env->me_mapsize < meta.mm_mapsize) {
+               /* If the configured size is smaller, make sure it's
+                * still big enough. Silently round up to minimum if not.
+                */
+               size_t minsize = (meta.mm_last_pg + 1) * meta.mm_psize;
+               if (env->me_mapsize < minsize)
+                       env->me_mapsize = minsize;
+       }
 
 #ifdef _WIN32
        {