]> git.sur5r.net Git - openldap/commitdiff
Revert ITS#7789 commits, let's try this again.
authorHoward Chu <hyc@symas.com>
Thu, 24 Jul 2014 00:10:41 +0000 (17:10 -0700)
committerHoward Chu <hyc@symas.com>
Thu, 24 Jul 2014 00:19:33 +0000 (17:19 -0700)
Revert "ITS#7789 Fix resize vs MDB_NOMETASYNC, and a comment."
Revert "ITS#7789 more"
Revert "Revert "ITS#7789 update RESIZED errmsg text""
Revert "ITS#7789 update RESIZED errmsg text"
Revert "ITS#7789 persist mapsize changes"

This reverts commit 02285aca58f5629547263ba09e7dd685dcf6b4b5.
This reverts commit 38e71c68de2ad61fb0fd72fd40214fd9a94479b9.
This reverts commit a5e4eecb1e59e9645113bb4c63d06a23a2c4bdf9.
This reverts commit d8e18551c3f03d5205f4dc8d1711e494d3814b17.
This reverts commit 5926e54bba7c976e0837221efb20cbff384207b8.

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

index 2374ef7cc7c23e9b2b6fd0c7313f8bacfc97950c..dfdbddc4408ad33d7875abbfa410fca6eac8e6c0 100644 (file)
@@ -411,7 +411,7 @@ typedef enum MDB_cursor_op {
 #define MDB_CURSOR_FULL        (-30787)
        /** Page has not enough space - internal error */
 #define MDB_PAGE_FULL  (-30786)
-       /** Environment mapsize was changed by another process */
+       /** Database contents grew beyond environment mapsize */
 #define MDB_MAP_RESIZED        (-30785)
        /** MDB_INCOMPATIBLE: Operation and DB incompatible, or DB flags changed */
 #define MDB_INCOMPATIBLE       (-30784)
@@ -785,10 +785,7 @@ int  mdb_env_get_fd(MDB_env *env, mdb_filehandle_t *fd);
         * This function should be called after #mdb_env_create() and before #mdb_env_open().
         * It may be called at later times if no transactions are active in
         * this process. Note that the library does not check for this condition,
-        * the caller must ensure it explicitly. The new size takes effect
-        * immediately for the current process but will not be persisted to
-        * any others until a write transaction has been committed by the
-        * current process.
+        * the caller must ensure it explicitly.
         *
         * If the mapsize is changed by another process, #mdb_txn_begin() will
         * return #MDB_MAP_RESIZED. This function may be called with a size
index 9e4a0689410c071d83bfc9d8866866f182a10d2f..cc4dd6ddc9dedd6c49817e6873ab26bc536ffb81 100644 (file)
@@ -1074,8 +1074,6 @@ struct MDB_env {
        HANDLE          me_mfd;                 /**< just for writing the meta pages */
        /** Failed to update the meta page. Probably an I/O error. */
 #define        MDB_FATAL_ERROR 0x80000000U
-       /** We're explicitly changing the mapsize. */
-#define        MDB_RESIZING    0x40000000U
        /** Some fields are initialized. */
 #define        MDB_ENV_ACTIVE  0x20000000U
        /** me_txkey is set */
@@ -2537,9 +2535,7 @@ mdb_txn_renew0(MDB_txn *txn)
        }
        txn->mt_dbflags[0] = txn->mt_dbflags[1] = DB_VALID;
 
-       /* If we didn't ask for a resize, but the size grew, fail */
-       if (!(env->me_flags & MDB_RESIZING)
-               && env->me_mapsize < meta->mm_mapsize) {
+       if (env->me_maxpg < txn->mt_next_pgno) {
                mdb_txn_reset0(txn, "renew0-mapfail");
                if (new_notls) {
                        txn->mt_u.reader->mr_pid = 0;
@@ -3277,13 +3273,8 @@ mdb_txn_commit(MDB_txn *txn)
        mdb_cursors_close(txn, 0);
 
        if (!txn->mt_u.dirty_list[0].mid &&
-               !(txn->mt_flags & (MDB_TXN_DIRTY|MDB_TXN_SPILLS))) {
-               if ((env->me_flags & MDB_RESIZING)
-                       && (rc = mdb_env_write_meta(txn))) {
-                       goto fail;
-               }
+               !(txn->mt_flags & (MDB_TXN_DIRTY|MDB_TXN_SPILLS)))
                goto done;
-       }
 
        DPRINTF(("committing txn %"Z"u %p on mdbenv %p, root page %"Z"u",
            txn->mt_txnid, (void*)txn, (void*)env, txn->mt_dbs[MAIN_DBI].md_root));
@@ -3324,6 +3315,7 @@ mdb_txn_commit(MDB_txn *txn)
 #endif
 
        if ((rc = mdb_page_flush(txn, 0)) ||
+               (rc = mdb_env_sync(env, 0)) ||
                (rc = mdb_env_write_meta(txn)))
                goto fail;
 
@@ -3480,7 +3472,7 @@ mdb_env_init_meta(MDB_env *env, MDB_meta *meta)
 static int
 mdb_env_write_meta(MDB_txn *txn)
 {
-       MDB_env *env = txn->mt_env;
+       MDB_env *env;
        MDB_meta        meta, metab, *mp;
        off_t off;
        int rc, len, toggle;
@@ -3492,22 +3484,17 @@ mdb_env_write_meta(MDB_txn *txn)
        int r2;
 #endif
 
-       /* Sync data and previous metapage before writing a new metapage */
-       if ((rc = mdb_env_sync(env, 0)) != MDB_SUCCESS)
-               return rc;
-
        toggle = txn->mt_txnid & 1;
        DPRINTF(("writing meta page %d for root page %"Z"u",
                toggle, txn->mt_dbs[MAIN_DBI].md_root));
 
+       env = txn->mt_env;
        mp = env->me_metas[toggle];
 
        if (env->me_flags & MDB_WRITEMAP) {
-               /* Persist any changes of mapsize config */
-               if (env->me_flags & MDB_RESIZING) {
+               /* Persist any increases of mapsize config */
+               if (env->me_mapsize > mp->mm_mapsize)
                        mp->mm_mapsize = env->me_mapsize;
-                       env->me_flags ^= MDB_RESIZING;
-               }
                mp->mm_dbs[0] = txn->mt_dbs[0];
                mp->mm_dbs[1] = txn->mt_dbs[1];
                mp->mm_last_pg = txn->mt_next_pgno - 1;
@@ -3535,11 +3522,10 @@ mdb_env_write_meta(MDB_txn *txn)
        metab.mm_last_pg = env->me_metas[toggle]->mm_last_pg;
 
        ptr = (char *)&meta;
-       if (env->me_flags & MDB_RESIZING) {
-               /* Persist any changes of mapsize config */
+       if (env->me_mapsize > mp->mm_mapsize) {
+               /* Persist any increases of mapsize config */
                meta.mm_mapsize = env->me_mapsize;
                off = offsetof(MDB_meta, mm_mapsize);
-               env->me_flags ^= MDB_RESIZING;
        } else {
                off = offsetof(MDB_meta, mm_dbs[0].md_depth);
        }
@@ -3728,25 +3714,19 @@ mdb_env_set_mapsize(MDB_env *env, size_t size)
         * sure there are no active txns.
         */
        if (env->me_map) {
-               int rc, change = 0;
+               int rc;
                void *old;
                if (env->me_txn)
                        return EINVAL;
                if (!size)
                        size = env->me_metas[mdb_env_pick_meta(env)]->mm_mapsize;
-               else {
-                       if (size < env->me_mapsize) {
-                               /* If the configured size is smaller, make sure it's
-                                * still big enough. Silently round up to minimum if not.
-                                */
-                               size_t minsize = (env->me_metas[mdb_env_pick_meta(env)]->mm_last_pg + 1) * env->me_psize;
-                               if (size < minsize)
-                                       size = minsize;
-                       }
-                       /* nothing actually changed */
-                       if (size == env->me_mapsize)
-                               return MDB_SUCCESS;
-                       change = 1;
+               else if (size < env->me_mapsize) {
+                       /* If the configured size is smaller, make sure it's
+                        * still big enough. Silently round up to minimum if not.
+                        */
+                       size_t minsize = (env->me_metas[mdb_env_pick_meta(env)]->mm_last_pg + 1) * env->me_psize;
+                       if (size < minsize)
+                               size = minsize;
                }
                munmap(env->me_map, env->me_mapsize);
                env->me_mapsize = size;
@@ -3754,8 +3734,6 @@ mdb_env_set_mapsize(MDB_env *env, size_t size)
                rc = mdb_env_map(env, old);
                if (rc)
                        return rc;
-               if (change)
-                       env->me_flags |= MDB_RESIZING;
        }
        env->me_mapsize = size;
        if (env->me_psize)
@@ -3828,17 +3806,13 @@ mdb_env_open2(MDB_env *env)
                 * 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;
-               }
-               if (env->me_mapsize != meta.mm_mapsize)
-                       env->me_flags |= MDB_RESIZING;
+       } 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;
        }
 
        rc = mdb_env_map(env, (flags & MDB_FIXEDMAP) ? meta.mm_address : NULL);