Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
HAMANO Tsukasa
OpenLDAP
Commits
36b08835
Commit
36b08835
authored
Aug 08, 2011
by
Howard Chu
Browse files
Additional debug, fixes
Fixed order of mdb_del0 operations Drop in-memory free list from env on txn_abort
parent
4ba37eed
Changes
1
Hide whitespace changes
Inline
Side-by-side
libraries/libmdb/mdb.c
View file @
36b08835
...
...
@@ -433,6 +433,16 @@ mdb_alloc_page(MDB_txn *txn, MDB_page *parent, unsigned int parent_idx, int num)
txn
->
mt_env
->
me_pghead
=
mop
;
memcpy
(
mop
->
mo_pages
,
idl
,
MDB_IDL_SIZEOF
(
idl
));
#if DEBUG > 1
{
unsigned
int
i
;
DPRINTF
(
"IDL read txn %lu root %lu num %lu"
,
mop
->
mo_txnid
,
txn
->
mt_dbs
[
FREE_DBI
].
md_root
,
idl
[
0
]);
for
(
i
=
0
;
i
<
idl
[
0
];
i
++
)
{
DPRINTF
(
"IDL %lu"
,
idl
[
i
+
1
]);
}
}
#endif
/* drop this IDL from the DB */
mpp
.
mp_parent
=
NULL
;
mpp
.
mp_pi
=
0
;
...
...
@@ -640,6 +650,7 @@ mdb_txn_abort(MDB_txn *txn)
if
(
F_ISSET
(
txn
->
mt_flags
,
MDB_TXN_RDONLY
))
{
txn
->
mt_u
.
reader
->
mr_txnid
=
0
;
}
else
{
MDB_oldpages
*
mop
;
/* Discard all dirty pages. */
while
(
!
STAILQ_EMPTY
(
txn
->
mt_u
.
dirty_queue
))
{
dp
=
STAILQ_FIRST
(
txn
->
mt_u
.
dirty_queue
);
...
...
@@ -648,6 +659,12 @@ mdb_txn_abort(MDB_txn *txn)
}
free
(
txn
->
mt_free_pgs
);
free
(
txn
->
mt_u
.
dirty_queue
);
while
((
mop
=
txn
->
mt_env
->
me_pghead
))
{
txn
->
mt_env
->
me_pghead
=
mop
->
mo_next
;
free
(
mop
);
}
env
->
me_txn
=
NULL
;
env
->
me_txns
->
mt_txnid
--
;
pthread_mutex_unlock
(
&
env
->
me_txns
->
mt_wmutex
);
...
...
@@ -723,6 +740,17 @@ mdb_txn_commit(MDB_txn *txn)
mpp
.
mp_pi
=
0
;
mdb_search_page
(
txn
,
FREE_DBI
,
&
key
,
NULL
,
1
,
&
mpp
);
#if DEBUG > 1
{
unsigned
int
i
;
ULONG
*
idl
=
txn
->
mt_free_pgs
;
DPRINTF
(
"IDL write txn %lu root %lu num %lu"
,
txn
->
mt_txnid
,
txn
->
mt_dbs
[
FREE_DBI
].
md_root
,
idl
[
0
]);
for
(
i
=
0
;
i
<
idl
[
0
];
i
++
)
{
DPRINTF
(
"IDL %lu"
,
idl
[
i
+
1
]);
}
}
#endif
/* write to last page of freeDB */
key
.
mv_size
=
sizeof
(
pgno_t
);
key
.
mv_data
=
(
char
*
)
&
txn
->
mt_txnid
;
...
...
@@ -2335,7 +2363,6 @@ mdb_del0(MDB_txn *txn, MDB_dbi dbi, unsigned int ki, MDB_pageparent *mpp, MDB_no
{
int
rc
;
mdb_del_node
(
mpp
->
mp_page
,
ki
);
/* add overflow pages to free list */
if
(
F_ISSET
(
leaf
->
mn_flags
,
F_BIGDATA
))
{
int
i
,
ovpages
;
...
...
@@ -2344,10 +2371,12 @@ mdb_del0(MDB_txn *txn, MDB_dbi dbi, unsigned int ki, MDB_pageparent *mpp, MDB_no
memcpy
(
&
pg
,
NODEDATA
(
leaf
),
sizeof
(
pg
));
ovpages
=
OVPAGES
(
NODEDSZ
(
leaf
),
txn
->
mt_env
->
me_psize
);
for
(
i
=
0
;
i
<
ovpages
;
i
++
)
{
DPRINTF
(
"freed ov page %lu"
,
pg
);
mdb_idl_insert
(
txn
->
mt_free_pgs
,
pg
);
pg
++
;
}
}
mdb_del_node
(
mpp
->
mp_page
,
ki
);
txn
->
mt_dbs
[
dbi
].
md_entries
--
;
rc
=
mdb_rebalance
(
txn
,
dbi
,
mpp
);
if
(
rc
!=
MDB_SUCCESS
)
...
...
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