Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
Joe Martin
OpenLDAP
Commits
c2792e62
Commit
c2792e62
authored
Oct 26, 2020
by
Quanah Gibson-Mount
Browse files
Merge remote-tracking branch 'origin/mdb.RE/0.9' into OPENLDAP_REL_ENG_2_4
parents
5f65cab9
3c9aa9df
Changes
3
Hide whitespace changes
Inline
Side-by-side
libraries/liblmdb/CHANGES
View file @
c2792e62
LMDB 0.9 Change Log
LMDB 0.9.27 Release (2020/10/26)
ITS#9376 fix repeated DUPSORT cursor deletes
LMDB 0.9.26 Release (2020/08/11)
ITS#9278 fix robust mutex cleanup for FreeBSD
...
...
libraries/liblmdb/lmdb.h
View file @
c2792e62
...
...
@@ -200,7 +200,7 @@ typedef int mdb_filehandle_t;
/** Library minor version */
#define MDB_VERSION_MINOR 9
/** Library patch version */
#define MDB_VERSION_PATCH 2
6
#define MDB_VERSION_PATCH 2
7
/** Combine args a,b,c into a single integer for easy version comparisons */
#define MDB_VERINT(a,b,c) (((a) << 24) | ((b) << 16) | (c))
...
...
@@ -210,7 +210,7 @@ typedef int mdb_filehandle_t;
MDB_VERINT(MDB_VERSION_MAJOR,MDB_VERSION_MINOR,MDB_VERSION_PATCH)
/** The release date of this library version */
#define MDB_VERSION_DATE "
August 11
, 2020"
#define MDB_VERSION_DATE "
October 26
, 2020"
/** A stringifier for the version info */
#define MDB_VERSTR(a,b,c,d) "LMDB " #a "." #b "." #c ": (" d ")"
...
...
libraries/liblmdb/mdb.c
View file @
c2792e62
...
...
@@ -5942,16 +5942,12 @@ skip:
if
(
F_ISSET
(
leaf
->
mn_flags
,
F_DUPDATA
))
{
mdb_xcursor_init1
(
mc
,
leaf
);
}
if
(
data
)
{
rc
=
mdb_cursor_first
(
&
mc
->
mc_xcursor
->
mx_cursor
,
data
,
NULL
);
if
(
rc
!=
MDB_SUCCESS
)
return
rc
;
}
else
if
(
data
)
{
if
((
rc
=
mdb_node_read
(
mc
,
leaf
,
data
))
!=
MDB_SUCCESS
)
return
rc
;
if
(
F_ISSET
(
leaf
->
mn_flags
,
F_DUPDATA
))
{
rc
=
mdb_cursor_first
(
&
mc
->
mc_xcursor
->
mx_cursor
,
data
,
NULL
);
if
(
rc
!=
MDB_SUCCESS
)
return
rc
;
}
}
MDB_GET_KEY
(
leaf
,
key
);
...
...
@@ -5975,7 +5971,8 @@ mdb_cursor_prev(MDB_cursor *mc, MDB_val *key, MDB_val *data, MDB_cursor_op op)
mp
=
mc
->
mc_pg
[
mc
->
mc_top
];
if
(
mc
->
mc_db
->
md_flags
&
MDB_DUPSORT
)
{
if
((
mc
->
mc_db
->
md_flags
&
MDB_DUPSORT
)
&&
mc
->
mc_ki
[
mc
->
mc_top
]
<
NUMKEYS
(
mp
))
{
leaf
=
NODEPTR
(
mp
,
mc
->
mc_ki
[
mc
->
mc_top
]);
if
(
F_ISSET
(
leaf
->
mn_flags
,
F_DUPDATA
))
{
if
(
op
==
MDB_PREV
||
op
==
MDB_PREV_DUP
)
{
...
...
@@ -6014,27 +6011,25 @@ mdb_cursor_prev(MDB_cursor *mc, MDB_val *key, MDB_val *data, MDB_cursor_op op)
DPRINTF
((
"==> cursor points to page %"
Z
"u with %u keys, key index %u"
,
mdb_dbg_pgno
(
mp
),
NUMKEYS
(
mp
),
mc
->
mc_ki
[
mc
->
mc_top
]));
if
(
!
IS_LEAF
(
mp
))
return
MDB_CORRUPTED
;
if
(
IS_LEAF2
(
mp
))
{
key
->
mv_size
=
mc
->
mc_db
->
md_pad
;
key
->
mv_data
=
LEAF2KEY
(
mp
,
mc
->
mc_ki
[
mc
->
mc_top
],
key
->
mv_size
);
return
MDB_SUCCESS
;
}
mdb_cassert
(
mc
,
IS_LEAF
(
mp
));
leaf
=
NODEPTR
(
mp
,
mc
->
mc_ki
[
mc
->
mc_top
]);
if
(
F_ISSET
(
leaf
->
mn_flags
,
F_DUPDATA
))
{
mdb_xcursor_init1
(
mc
,
leaf
);
}
if
(
data
)
{
rc
=
mdb_cursor_last
(
&
mc
->
mc_xcursor
->
mx_cursor
,
data
,
NULL
);
if
(
rc
!=
MDB_SUCCESS
)
return
rc
;
}
else
if
(
data
)
{
if
((
rc
=
mdb_node_read
(
mc
,
leaf
,
data
))
!=
MDB_SUCCESS
)
return
rc
;
if
(
F_ISSET
(
leaf
->
mn_flags
,
F_DUPDATA
))
{
rc
=
mdb_cursor_last
(
&
mc
->
mc_xcursor
->
mx_cursor
,
data
,
NULL
);
if
(
rc
!=
MDB_SUCCESS
)
return
rc
;
}
}
MDB_GET_KEY
(
leaf
,
key
);
...
...
@@ -6190,24 +6185,22 @@ set1:
if
(
F_ISSET
(
leaf
->
mn_flags
,
F_DUPDATA
))
{
mdb_xcursor_init1
(
mc
,
leaf
);
}
if
(
data
)
{
if
(
F_ISSET
(
leaf
->
mn_flags
,
F_DUPDATA
))
{
if
(
op
==
MDB_SET
||
op
==
MDB_SET_KEY
||
op
==
MDB_SET_RANGE
)
{
rc
=
mdb_cursor_first
(
&
mc
->
mc_xcursor
->
mx_cursor
,
data
,
NULL
);
if
(
op
==
MDB_SET
||
op
==
MDB_SET_KEY
||
op
==
MDB_SET_RANGE
)
{
rc
=
mdb_cursor_first
(
&
mc
->
mc_xcursor
->
mx_cursor
,
data
,
NULL
);
}
else
{
int
ex2
,
*
ex2p
;
if
(
op
==
MDB_GET_BOTH
)
{
ex2p
=
&
ex2
;
ex2
=
0
;
}
else
{
int
ex2
,
*
ex2p
;
if
(
op
==
MDB_GET_BOTH
)
{
ex2p
=
&
ex2
;
ex2
=
0
;
}
else
{
ex2p
=
NULL
;
}
rc
=
mdb_cursor_set
(
&
mc
->
mc_xcursor
->
mx_cursor
,
data
,
NULL
,
MDB_SET_RANGE
,
ex2p
);
if
(
rc
!=
MDB_SUCCESS
)
return
rc
;
ex2p
=
NULL
;
}
}
else
if
(
op
==
MDB_GET_BOTH
||
op
==
MDB_GET_BOTH_RANGE
)
{
rc
=
mdb_cursor_set
(
&
mc
->
mc_xcursor
->
mx_cursor
,
data
,
NULL
,
MDB_SET_RANGE
,
ex2p
);
if
(
rc
!=
MDB_SUCCESS
)
return
rc
;
}
}
else
if
(
data
)
{
if
(
op
==
MDB_GET_BOTH
||
op
==
MDB_GET_BOTH_RANGE
)
{
MDB_val
olddata
;
MDB_cmp_func
*
dcmp
;
if
((
rc
=
mdb_node_read
(
mc
,
leaf
,
&
olddata
))
!=
MDB_SUCCESS
)
...
...
@@ -6265,22 +6258,23 @@ mdb_cursor_first(MDB_cursor *mc, MDB_val *key, MDB_val *data)
mc
->
mc_ki
[
mc
->
mc_top
]
=
0
;
if
(
IS_LEAF2
(
mc
->
mc_pg
[
mc
->
mc_top
]))
{
key
->
mv_size
=
mc
->
mc_db
->
md_pad
;
key
->
mv_data
=
LEAF2KEY
(
mc
->
mc_pg
[
mc
->
mc_top
],
0
,
key
->
mv_size
);
if
(
key
)
{
key
->
mv_size
=
mc
->
mc_db
->
md_pad
;
key
->
mv_data
=
LEAF2KEY
(
mc
->
mc_pg
[
mc
->
mc_top
],
0
,
key
->
mv_size
);
}
return
MDB_SUCCESS
;
}
if
(
data
)
{
if
(
F_ISSET
(
leaf
->
mn_flags
,
F_DUPDATA
))
{
mdb_xcursor_init1
(
mc
,
leaf
);
rc
=
mdb_cursor_first
(
&
mc
->
mc_xcursor
->
mx_cursor
,
data
,
NULL
);
if
(
rc
)
return
rc
;
}
else
{
if
((
rc
=
mdb_node_read
(
mc
,
leaf
,
data
))
!=
MDB_SUCCESS
)
return
rc
;
}
if
(
F_ISSET
(
leaf
->
mn_flags
,
F_DUPDATA
))
{
mdb_xcursor_init1
(
mc
,
leaf
);
rc
=
mdb_cursor_first
(
&
mc
->
mc_xcursor
->
mx_cursor
,
data
,
NULL
);
if
(
rc
)
return
rc
;
}
else
if
(
data
)
{
if
((
rc
=
mdb_node_read
(
mc
,
leaf
,
data
))
!=
MDB_SUCCESS
)
return
rc
;
}
MDB_GET_KEY
(
leaf
,
key
);
return
MDB_SUCCESS
;
}
...
...
@@ -6307,21 +6301,21 @@ mdb_cursor_last(MDB_cursor *mc, MDB_val *key, MDB_val *data)
leaf
=
NODEPTR
(
mc
->
mc_pg
[
mc
->
mc_top
],
mc
->
mc_ki
[
mc
->
mc_top
]);
if
(
IS_LEAF2
(
mc
->
mc_pg
[
mc
->
mc_top
]))
{
key
->
mv_size
=
mc
->
mc_db
->
md_pad
;
key
->
mv_data
=
LEAF2KEY
(
mc
->
mc_pg
[
mc
->
mc_top
],
mc
->
mc_ki
[
mc
->
mc_top
],
key
->
mv_size
);
if
(
key
)
{
key
->
mv_size
=
mc
->
mc_db
->
md_pad
;
key
->
mv_data
=
LEAF2KEY
(
mc
->
mc_pg
[
mc
->
mc_top
],
mc
->
mc_ki
[
mc
->
mc_top
],
key
->
mv_size
);
}
return
MDB_SUCCESS
;
}
if
(
data
)
{
if
(
F_ISSET
(
leaf
->
mn_flags
,
F_DUPDATA
))
{
mdb_xcursor_init1
(
mc
,
leaf
);
rc
=
mdb_cursor_last
(
&
mc
->
mc_xcursor
->
mx_cursor
,
data
,
NULL
);
if
(
rc
)
return
rc
;
}
else
{
if
((
rc
=
mdb_node_read
(
mc
,
leaf
,
data
))
!=
MDB_SUCCESS
)
return
rc
;
}
if
(
F_ISSET
(
leaf
->
mn_flags
,
F_DUPDATA
))
{
mdb_xcursor_init1
(
mc
,
leaf
);
rc
=
mdb_cursor_last
(
&
mc
->
mc_xcursor
->
mx_cursor
,
data
,
NULL
);
if
(
rc
)
return
rc
;
}
else
if
(
data
)
{
if
((
rc
=
mdb_node_read
(
mc
,
leaf
,
data
))
!=
MDB_SUCCESS
)
return
rc
;
}
MDB_GET_KEY
(
leaf
,
key
);
...
...
@@ -7102,6 +7096,8 @@ mdb_cursor_del(MDB_cursor *mc, unsigned int flags)
return
rc
;
mp
=
mc
->
mc_pg
[
mc
->
mc_top
];
if
(
!
IS_LEAF
(
mp
))
return
MDB_CORRUPTED
;
if
(
IS_LEAF2
(
mp
))
goto
del_key
;
leaf
=
NODEPTR
(
mp
,
mc
->
mc_ki
[
mc
->
mc_top
]);
...
...
@@ -8473,60 +8469,70 @@ mdb_cursor_del0(MDB_cursor *mc)
}
}
rc
=
mdb_rebalance
(
mc
);
if
(
rc
)
goto
fail
;
if
(
rc
==
MDB_SUCCESS
)
{
/* DB is totally empty now, just bail out.
* Other cursors adjustments were already done
* by mdb_rebalance and aren't needed here.
*/
if
(
!
mc
->
mc_snum
)
return
rc
;
/* DB is totally empty now, just bail out.
* Other cursors adjustments were already done
* by mdb_rebalance and aren't needed here.
*/
if
(
!
mc
->
mc_snum
)
{
mc
->
mc_flags
|=
C_EOF
;
return
rc
;
}
mp
=
mc
->
mc_pg
[
mc
->
mc_top
];
nkeys
=
NUMKEYS
(
mp
);
ki
=
mc
->
mc_ki
[
mc
->
mc_top
];
mp
=
mc
->
mc_pg
[
mc
->
mc_top
];
nkeys
=
NUMKEYS
(
mp
);
/* Adjust other cursors pointing to mp */
for
(
m2
=
mc
->
mc_txn
->
mt_cursors
[
dbi
];
!
rc
&&
m2
;
m2
=
m2
->
mc_next
)
{
m3
=
(
mc
->
mc_flags
&
C_SUB
)
?
&
m2
->
mc_xcursor
->
mx_cursor
:
m2
;
if
(
!
(
m2
->
mc_flags
&
m3
->
mc_flags
&
C_INITIALIZED
))
continue
;
if
(
m3
->
mc_snum
<
mc
->
mc_snum
)
continue
;
if
(
m3
->
mc_pg
[
mc
->
mc_top
]
==
mp
)
{
/* if m3 points past last node in page, find next sibling */
if
(
m3
->
mc_ki
[
mc
->
mc_top
]
>=
mc
->
mc_ki
[
mc
->
mc_top
])
{
if
(
m3
->
mc_ki
[
mc
->
mc_top
]
>=
nkeys
)
{
rc
=
mdb_cursor_sibling
(
m3
,
1
);
if
(
rc
==
MDB_NOTFOUND
)
{
m3
->
mc_flags
|=
C_EOF
;
rc
=
MDB_SUCCESS
;
continue
;
}
}
if
(
mc
->
mc_db
->
md_flags
&
MDB_DUPSORT
)
{
MDB_node
*
node
=
NODEPTR
(
m3
->
mc_pg
[
m3
->
mc_top
],
m3
->
mc_ki
[
m3
->
mc_top
]);
/* If this node has dupdata, it may need to be reinited
* because its data has moved.
* If the xcursor was not initd it must be reinited.
* Else if node points to a subDB, nothing is needed.
* Else (xcursor was initd, not a subDB) needs mc_pg[0] reset.
*/
if
(
node
->
mn_flags
&
F_DUPDATA
)
{
if
(
m3
->
mc_xcursor
->
mx_cursor
.
mc_flags
&
C_INITIALIZED
)
{
if
(
!
(
node
->
mn_flags
&
F_SUBDATA
))
m3
->
mc_xcursor
->
mx_cursor
.
mc_pg
[
0
]
=
NODEDATA
(
node
);
}
else
{
mdb_xcursor_init1
(
m3
,
node
);
m3
->
mc_xcursor
->
mx_cursor
.
mc_flags
|=
C_DEL
;
}
/* Adjust other cursors pointing to mp */
for
(
m2
=
mc
->
mc_txn
->
mt_cursors
[
dbi
];
!
rc
&&
m2
;
m2
=
m2
->
mc_next
)
{
m3
=
(
mc
->
mc_flags
&
C_SUB
)
?
&
m2
->
mc_xcursor
->
mx_cursor
:
m2
;
if
(
!
(
m2
->
mc_flags
&
m3
->
mc_flags
&
C_INITIALIZED
))
continue
;
if
(
m3
->
mc_snum
<
mc
->
mc_snum
)
continue
;
if
(
m3
->
mc_pg
[
mc
->
mc_top
]
==
mp
)
{
/* if m3 points past last node in page, find next sibling */
if
(
m3
->
mc_ki
[
mc
->
mc_top
]
>=
nkeys
)
{
rc
=
mdb_cursor_sibling
(
m3
,
1
);
if
(
rc
==
MDB_NOTFOUND
)
{
m3
->
mc_flags
|=
C_EOF
;
rc
=
MDB_SUCCESS
;
continue
;
}
if
(
rc
)
goto
fail
;
}
if
(
m3
->
mc_ki
[
mc
->
mc_top
]
>=
ki
||
/* moved to right sibling */
m3
->
mc_pg
[
mc
->
mc_top
]
!=
mp
)
{
if
(
m3
->
mc_xcursor
&&
!
(
m3
->
mc_flags
&
C_EOF
))
{
MDB_node
*
node
=
NODEPTR
(
m3
->
mc_pg
[
m3
->
mc_top
],
m3
->
mc_ki
[
m3
->
mc_top
]);
/* If this node has dupdata, it may need to be reinited
* because its data has moved.
* If the xcursor was not initd it must be reinited.
* Else if node points to a subDB, nothing is needed.
* Else (xcursor was initd, not a subDB) needs mc_pg[0] reset.
*/
if
(
node
->
mn_flags
&
F_DUPDATA
)
{
if
(
m3
->
mc_xcursor
->
mx_cursor
.
mc_flags
&
C_INITIALIZED
)
{
if
(
!
(
node
->
mn_flags
&
F_SUBDATA
))
m3
->
mc_xcursor
->
mx_cursor
.
mc_pg
[
0
]
=
NODEDATA
(
node
);
}
else
{
mdb_xcursor_init1
(
m3
,
node
);
rc
=
mdb_cursor_first
(
&
m3
->
mc_xcursor
->
mx_cursor
,
NULL
,
NULL
);
if
(
rc
)
goto
fail
;
}
}
m3
->
mc_xcursor
->
mx_cursor
.
mc_flags
|=
C_DEL
;
}
m3
->
mc_flags
|=
C_DEL
;
}
}
mc
->
mc_flags
|=
C_DEL
;
}
fail:
if
(
rc
)
mc
->
mc_txn
->
mt_flags
|=
MDB_TXN_ERROR
;
return
rc
;
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment