Merge remote branch 'origin/mdb.master'

This commit is contained in:
Howard Chu 2011-11-09 15:36:00 -08:00
commit 52a0d00031

View File

@ -255,7 +255,7 @@ typedef ID txnid_t;
* pressure from other processes is high. So until OSs have * pressure from other processes is high. So until OSs have
* actual paging support for Huge pages, they're not viable. * actual paging support for Huge pages, they're not viable.
*/ */
#define PAGESIZE 4096 #define MDB_PAGESIZE 4096
/** The minimum number of keys required in a database page. /** The minimum number of keys required in a database page.
* Setting this to a larger value will place a smaller bound on the * Setting this to a larger value will place a smaller bound on the
@ -283,7 +283,7 @@ typedef ID txnid_t;
/** The maximum size of a key in the database. /** The maximum size of a key in the database.
* While data items have essentially unbounded size, we require that * While data items have essentially unbounded size, we require that
* keys all fit onto a regular page. This limit could be raised a bit * keys all fit onto a regular page. This limit could be raised a bit
* further if needed; to something just under #PAGESIZE / #MDB_MINKEYS. * further if needed; to something just under #MDB_PAGESIZE / #MDB_MINKEYS.
*/ */
#define MAXKEYSIZE 511 #define MAXKEYSIZE 511
@ -1898,7 +1898,7 @@ mdb_txn_commit(MDB_txn *txn)
DPRINTF("committing page %zu", dp->mp_pgno); DPRINTF("committing page %zu", dp->mp_pgno);
iov[n].iov_len = env->me_psize; iov[n].iov_len = env->me_psize;
if (IS_OVERFLOW(dp)) iov[n].iov_len *= dp->mp_pages; if (IS_OVERFLOW(dp)) iov[n].iov_len *= dp->mp_pages;
iov[n].iov_base = dp; iov[n].iov_base = (char *)dp;
size += iov[n].iov_len; size += iov[n].iov_len;
next = dp->mp_pgno + (IS_OVERFLOW(dp) ? dp->mp_pages : 1); next = dp->mp_pgno + (IS_OVERFLOW(dp) ? dp->mp_pages : 1);
/* clear dirty flag */ /* clear dirty flag */
@ -1985,7 +1985,7 @@ done:
static int static int
mdb_env_read_header(MDB_env *env, MDB_meta *meta) mdb_env_read_header(MDB_env *env, MDB_meta *meta)
{ {
char page[PAGESIZE]; char page[MDB_PAGESIZE];
MDB_page *p; MDB_page *p;
MDB_meta *m; MDB_meta *m;
int rc, err; int rc, err;
@ -1994,14 +1994,14 @@ mdb_env_read_header(MDB_env *env, MDB_meta *meta)
*/ */
#ifdef _WIN32 #ifdef _WIN32
if (!ReadFile(env->me_fd, page, PAGESIZE, (DWORD *)&rc, NULL) || rc == 0) if (!ReadFile(env->me_fd, page, MDB_PAGESIZE, (DWORD *)&rc, NULL) || rc == 0)
#else #else
if ((rc = read(env->me_fd, page, PAGESIZE)) == 0) if ((rc = read(env->me_fd, page, MDB_PAGESIZE)) == 0)
#endif #endif
{ {
return ENOENT; return ENOENT;
} }
else if (rc != PAGESIZE) { else if (rc != MDB_PAGESIZE) {
err = ErrCode(); err = ErrCode();
if (rc > 0) if (rc > 0)
err = EINVAL; err = EINVAL;
@ -2576,7 +2576,7 @@ mdb_env_setup_locks(MDB_env *env, char *lpath, int mode, int *excl)
} }
} }
#else #else
env->me_txns = mmap(0, rsize, PROT_READ|PROT_WRITE, MAP_SHARED, env->me_txns = (MDB_txninfo *)mmap(0, rsize, PROT_READ|PROT_WRITE, MAP_SHARED,
env->me_lfd, 0); env->me_lfd, 0);
if (env->me_txns == MAP_FAILED) { if (env->me_txns == MAP_FAILED) {
rc = ErrCode(); rc = ErrCode();
@ -2842,7 +2842,7 @@ mdb_env_close(MDB_env *env)
for (i=0; i<env->me_txns->mti_numreaders; i++) for (i=0; i<env->me_txns->mti_numreaders; i++)
if (env->me_txns->mti_readers[i].mr_pid == pid) if (env->me_txns->mti_readers[i].mr_pid == pid)
env->me_txns->mti_readers[i].mr_pid = 0; env->me_txns->mti_readers[i].mr_pid = 0;
munmap(env->me_txns, (env->me_maxreaders-1)*sizeof(MDB_reader)+sizeof(MDB_txninfo)); munmap((void *)env->me_txns, (env->me_maxreaders-1)*sizeof(MDB_reader)+sizeof(MDB_txninfo));
} }
close(env->me_lfd); close(env->me_lfd);
mdb_midl_free(env->me_free_pgs); mdb_midl_free(env->me_free_pgs);
@ -3922,7 +3922,7 @@ mdb_cursor_put(MDB_cursor *mc, MDB_val *key, MDB_val *data,
unsigned int mcount = 0; unsigned int mcount = 0;
size_t nsize; size_t nsize;
int rc, rc2; int rc, rc2;
char pbuf[PAGESIZE]; char pbuf[MDB_PAGESIZE];
char dbuf[MAXKEYSIZE+1]; char dbuf[MAXKEYSIZE+1];
unsigned int nflags; unsigned int nflags;
DKBUF; DKBUF;
@ -4003,7 +4003,15 @@ more:
dkey.mv_size = NODEDSZ(leaf); dkey.mv_size = NODEDSZ(leaf);
dkey.mv_data = NODEDATA(leaf); dkey.mv_data = NODEDATA(leaf);
/* data matches, ignore it */ #if UINT_MAX > SIZE_MAX
if (mc->mc_dbx->md_dcmp == mdb_cmp_int && dkey.mv_size == sizeof(size_t))
#ifdef MISALIGNED_OK
mc->mc_dbx->md_dcmp = mdb_cmp_long;
#else
mc->mc_dbx->md_dcmp = mdb_cmp_cint;
#endif
#endif
/* if data matches, ignore it */
if (!mc->mc_dbx->md_dcmp(data, &dkey)) if (!mc->mc_dbx->md_dcmp(data, &dkey))
return (flags == MDB_NODUPDATA) ? MDB_KEYEXIST : MDB_SUCCESS; return (flags == MDB_NODUPDATA) ? MDB_KEYEXIST : MDB_SUCCESS;
@ -4665,8 +4673,14 @@ mdb_xcursor_init1(MDB_cursor *mc, MDB_node *node)
DB_DIRTY : 0; DB_DIRTY : 0;
mx->mx_dbx.md_name.mv_data = NODEKEY(node); mx->mx_dbx.md_name.mv_data = NODEKEY(node);
mx->mx_dbx.md_name.mv_size = node->mn_ksize; mx->mx_dbx.md_name.mv_size = node->mn_ksize;
#if UINT_MAX > SIZE_MAX
if (mx->mx_dbx.md_cmp == mdb_cmp_int && mx->mx_db.md_pad == sizeof(size_t)) if (mx->mx_dbx.md_cmp == mdb_cmp_int && mx->mx_db.md_pad == sizeof(size_t))
#ifdef MISALIGNED_OK
mx->mx_dbx.md_cmp = mdb_cmp_long; mx->mx_dbx.md_cmp = mdb_cmp_long;
#else
mx->mx_dbx.md_cmp = mdb_cmp_cint;
#endif
#endif
} }
/** Initialize a cursor for a given transaction and database. */ /** Initialize a cursor for a given transaction and database. */