Revert ITS#7789 commits, let's try this again.

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 02285aca58.
This reverts commit 38e71c68de.
This reverts commit a5e4eecb1e.
This reverts commit d8e18551c3.
This reverts commit 5926e54bba.
vl32
Howard Chu 11 years ago
parent 015d6b909a
commit 7ef970436d
  1. 7
      libraries/liblmdb/lmdb.h
  2. 74
      libraries/liblmdb/mdb.c

@ -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

@ -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);

Loading…
Cancel
Save