mirror of
https://git.openldap.org/openldap/openldap.git
synced 2025-01-06 10:46:21 +08:00
Guarantee nodes are 2-byte aligned
Also fix xcursor_init1 md_dirty flag Also another mdb_cmp refactoring fix
This commit is contained in:
parent
293df78b2b
commit
5e6a864513
@ -2661,7 +2661,7 @@ set3:
|
|||||||
MDB_val d2;
|
MDB_val d2;
|
||||||
if ((rc = mdb_read_data(cursor->mc_txn, leaf, &d2)) != MDB_SUCCESS)
|
if ((rc = mdb_read_data(cursor->mc_txn, leaf, &d2)) != MDB_SUCCESS)
|
||||||
return rc;
|
return rc;
|
||||||
rc = cursor->mc_txn->mt_dbxs[cursor->mc_dbi].md_cmp(data, &d2);
|
rc = cursor->mc_txn->mt_dbxs[cursor->mc_dbi].md_dcmp(data, &d2);
|
||||||
if (rc) {
|
if (rc) {
|
||||||
if (op == MDB_GET_BOTH || rc > 0)
|
if (op == MDB_GET_BOTH || rc > 0)
|
||||||
return MDB_NOTFOUND;
|
return MDB_NOTFOUND;
|
||||||
@ -3125,7 +3125,7 @@ mdb_cursor_del(MDB_cursor *mc, unsigned int flags)
|
|||||||
MDB_pageparent mp2;
|
MDB_pageparent mp2;
|
||||||
|
|
||||||
if (flags != MDB_NODUPDATA) {
|
if (flags != MDB_NODUPDATA) {
|
||||||
/* mdb_xcursor_init2(mc); */
|
mdb_xcursor_init2(mc);
|
||||||
rc = mdb_cursor_del(&mc->mc_xcursor->mx_cursor, 0);
|
rc = mdb_cursor_del(&mc->mc_xcursor->mx_cursor, 0);
|
||||||
mdb_xcursor_fini(mc);
|
mdb_xcursor_fini(mc);
|
||||||
/* If sub-DB still has entries, we're done */
|
/* If sub-DB still has entries, we're done */
|
||||||
@ -3251,6 +3251,7 @@ mdb_leaf_size(MDB_env *env, MDB_val *key, MDB_val *data)
|
|||||||
/* put on overflow page */
|
/* put on overflow page */
|
||||||
sz -= data->mv_size - sizeof(pgno_t);
|
sz -= data->mv_size - sizeof(pgno_t);
|
||||||
}
|
}
|
||||||
|
sz += sz & 1;
|
||||||
|
|
||||||
return sz + sizeof(indx_t);
|
return sz + sizeof(indx_t);
|
||||||
}
|
}
|
||||||
@ -3326,6 +3327,7 @@ mdb_add_node(MDB_txn *txn, MDB_dbi dbi, MDB_page *mp, indx_t indx,
|
|||||||
node_size += data->mv_size;
|
node_size += data->mv_size;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
node_size += node_size & 1;
|
||||||
|
|
||||||
if (node_size + sizeof(indx_t) > SIZELEFT(mp)) {
|
if (node_size + sizeof(indx_t) > SIZELEFT(mp)) {
|
||||||
DPRINTF("not enough room in page %lu, got %u ptrs",
|
DPRINTF("not enough room in page %lu, got %u ptrs",
|
||||||
@ -3408,6 +3410,7 @@ mdb_del_node(MDB_page *mp, indx_t indx, int ksize)
|
|||||||
else
|
else
|
||||||
sz += NODEDSZ(node);
|
sz += NODEDSZ(node);
|
||||||
}
|
}
|
||||||
|
sz += sz & 1;
|
||||||
|
|
||||||
ptr = mp->mp_ptrs[indx];
|
ptr = mp->mp_ptrs[indx];
|
||||||
numkeys = NUMKEYS(mp);
|
numkeys = NUMKEYS(mp);
|
||||||
@ -3465,6 +3468,7 @@ mdb_xcursor_init1(MDB_cursor *mc, MDB_page *mp, MDB_node *node)
|
|||||||
mx->mx_dbs[1] = mc->mc_txn->mt_dbs[1];
|
mx->mx_dbs[1] = mc->mc_txn->mt_dbs[1];
|
||||||
if (mc->mc_dbi > 1) {
|
if (mc->mc_dbi > 1) {
|
||||||
mx->mx_dbs[2] = mc->mc_txn->mt_dbs[mc->mc_dbi];
|
mx->mx_dbs[2] = mc->mc_txn->mt_dbs[mc->mc_dbi];
|
||||||
|
mx->mx_dbxs[2].md_dirty = mc->mc_txn->mt_dbxs[mc->mc_dbi].md_dirty;
|
||||||
dbn = 3;
|
dbn = 3;
|
||||||
} else {
|
} else {
|
||||||
dbn = 2;
|
dbn = 2;
|
||||||
@ -3490,6 +3494,7 @@ mdb_xcursor_init2(MDB_cursor *mc)
|
|||||||
mx->mx_dbs[1] = mc->mc_txn->mt_dbs[1];
|
mx->mx_dbs[1] = mc->mc_txn->mt_dbs[1];
|
||||||
if (mc->mc_dbi > 1) {
|
if (mc->mc_dbi > 1) {
|
||||||
mx->mx_dbs[2] = mc->mc_txn->mt_dbs[mc->mc_dbi];
|
mx->mx_dbs[2] = mc->mc_txn->mt_dbs[mc->mc_dbi];
|
||||||
|
mx->mx_dbxs[2].md_dirty = mc->mc_txn->mt_dbxs[mc->mc_dbi].md_dirty;
|
||||||
dbn = 3;
|
dbn = 3;
|
||||||
} else {
|
} else {
|
||||||
dbn = 2;
|
dbn = 2;
|
||||||
@ -3506,8 +3511,6 @@ mdb_xcursor_fini(MDB_cursor *mc)
|
|||||||
mc->mc_txn->mt_next_pgno = mx->mx_txn.mt_next_pgno;
|
mc->mc_txn->mt_next_pgno = mx->mx_txn.mt_next_pgno;
|
||||||
mc->mc_txn->mt_dbs[0] = mx->mx_dbs[0];
|
mc->mc_txn->mt_dbs[0] = mx->mx_dbs[0];
|
||||||
mc->mc_txn->mt_dbs[1] = mx->mx_dbs[1];
|
mc->mc_txn->mt_dbs[1] = mx->mx_dbs[1];
|
||||||
mc->mc_txn->mt_dbxs[0].md_dirty = mx->mx_dbxs[0].md_dirty;
|
|
||||||
mc->mc_txn->mt_dbxs[1].md_dirty = mx->mx_dbxs[1].md_dirty;
|
|
||||||
if (mc->mc_dbi > 1) {
|
if (mc->mc_dbi > 1) {
|
||||||
mc->mc_txn->mt_dbs[mc->mc_dbi] = mx->mx_dbs[2];
|
mc->mc_txn->mt_dbs[mc->mc_dbi] = mx->mx_dbs[2];
|
||||||
mc->mc_txn->mt_dbxs[mc->mc_dbi].md_dirty = mx->mx_dbxs[2].md_dirty;
|
mc->mc_txn->mt_dbxs[mc->mc_dbi].md_dirty = mx->mx_dbxs[2].md_dirty;
|
||||||
@ -4104,6 +4107,7 @@ mdb_split(MDB_txn *txn, MDB_dbi dbi, MDB_page **mpp, unsigned int *newindxp,
|
|||||||
psize += sizeof(pgno_t);
|
psize += sizeof(pgno_t);
|
||||||
else
|
else
|
||||||
psize += NODEDSZ(node);
|
psize += NODEDSZ(node);
|
||||||
|
psize += psize & 1;
|
||||||
if (psize > pmax) {
|
if (psize > pmax) {
|
||||||
split_indx = i;
|
split_indx = i;
|
||||||
break;
|
break;
|
||||||
@ -4118,6 +4122,7 @@ mdb_split(MDB_txn *txn, MDB_dbi dbi, MDB_page **mpp, unsigned int *newindxp,
|
|||||||
psize += sizeof(pgno_t);
|
psize += sizeof(pgno_t);
|
||||||
else
|
else
|
||||||
psize += NODEDSZ(node);
|
psize += NODEDSZ(node);
|
||||||
|
psize += psize & 1;
|
||||||
if (psize > pmax) {
|
if (psize > pmax) {
|
||||||
split_indx = i+1;
|
split_indx = i+1;
|
||||||
break;
|
break;
|
||||||
|
Loading…
Reference in New Issue
Block a user