Check DB flags when refreshing a stale MDB DBI.

It's hairy to figure out when a DBI is valid. Catch destructive
user errors, and flags which another process changed under us.
vmware
Hallvard Furuseth 12 years ago
parent 2dbb8bb833
commit f97552a83a
  1. 4
      libraries/liblmdb/lmdb.h
  2. 7
      libraries/liblmdb/mdb.c

@ -362,7 +362,9 @@ typedef enum MDB_cursor_op {
#define MDB_PAGE_FULL (-30786) #define MDB_PAGE_FULL (-30786)
/** Database contents grew beyond environment mapsize */ /** Database contents grew beyond environment mapsize */
#define MDB_MAP_RESIZED (-30785) #define MDB_MAP_RESIZED (-30785)
#define MDB_LAST_ERRCODE MDB_MAP_RESIZED /** Operation is incompatible with database */
#define MDB_INCOMPATIBLE (-30784)
#define MDB_LAST_ERRCODE MDB_INCOMPATIBLE
/** @} */ /** @} */
/** @brief Statistics for a database in the environment */ /** @brief Statistics for a database in the environment */

@ -1056,6 +1056,7 @@ static char *const mdb_errstr[] = {
"MDB_CURSOR_FULL: Internal error - cursor stack limit reached", "MDB_CURSOR_FULL: Internal error - cursor stack limit reached",
"MDB_PAGE_FULL: Internal error - page has no more space", "MDB_PAGE_FULL: Internal error - page has no more space",
"MDB_MAP_RESIZED: Database contents grew beyond environment mapsize", "MDB_MAP_RESIZED: Database contents grew beyond environment mapsize",
"MDB_INCOMPATIBLE: Operation is incompatible with database",
}; };
char * char *
@ -4056,6 +4057,12 @@ mdb_page_search(MDB_cursor *mc, MDB_val *key, int flags)
if (!exact) if (!exact)
return MDB_NOTFOUND; return MDB_NOTFOUND;
mdb_node_read(mc->mc_txn, leaf, &data); mdb_node_read(mc->mc_txn, leaf, &data);
/* The txn may not know this DBI, or another process may
* have dropped and recreated the DB with other flags.
*/
if (mc->mc_db->md_flags != *(uint16_t *)
((char *) data.mv_data + offsetof(MDB_db, md_flags)))
return MDB_INCOMPATIBLE;
memcpy(mc->mc_db, data.mv_data, sizeof(MDB_db)); memcpy(mc->mc_db, data.mv_data, sizeof(MDB_db));
} }
if (flags & MDB_PS_MODIFY) if (flags & MDB_PS_MODIFY)

Loading…
Cancel
Save