Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
HAMANO Tsukasa
OpenLDAP
Commits
3f025d1d
Commit
3f025d1d
authored
Jul 01, 2011
by
Howard Chu
Browse files
More fixes for seeking
parent
27ab75ef
Changes
1
Hide whitespace changes
Inline
Side-by-side
libraries/libmdb/mdb.c
View file @
3f025d1d
...
...
@@ -24,6 +24,9 @@
#include <pthread.h>
#include "mdb.h"
typedef
ulong
pgno_t
;
#include "idl.h"
#ifndef DEBUG
...
...
@@ -47,7 +50,6 @@
#define F_ISSET(w, f) (((w) & (f)) == (f))
typedef
ulong
pgno_t
;
typedef
uint16_t
indx_t
;
#define DEFAULT_READERS 126
...
...
@@ -206,7 +208,6 @@ typedef struct MDB_node {
struct
MDB_txn
{
pgno_t
mt_root
;
/* current / new root page */
pgno_t
mt_next_pgno
;
/* next unallocated page */
pgno_t
mt_first_pgno
;
ulong
mt_txnid
;
ulong
mt_oldest
;
MDB_env
*
mt_env
;
...
...
@@ -327,9 +328,6 @@ static size_t mdb_leaf_size(MDB_db *bt, MDB_val *key,
MDB_val
*
data
);
static
size_t
mdb_branch_size
(
MDB_db
*
bt
,
MDB_val
*
key
);
static
pgno_t
mdbenv_compact_tree
(
MDB_env
*
env
,
pgno_t
pgno
,
MDB_env
*
envc
);
static
int
memncmp
(
const
void
*
s1
,
size_t
n1
,
const
void
*
s2
,
size_t
n2
);
static
int
memnrcmp
(
const
void
*
s1
,
size_t
n1
,
...
...
@@ -392,7 +390,7 @@ mdb_newpage(MDB_txn *txn, MDB_page *parent, unsigned int parent_idx, int num)
if
(
txn
->
mt_env
->
me_pghead
)
{
ulong
oldest
=
txn
->
mt_txnid
-
2
;
int
i
;
unsigned
int
i
;
for
(
i
=
0
;
i
<
txn
->
mt_env
->
me_txns
->
mt_numreaders
;
i
++
)
{
if
(
txn
->
mt_env
->
me_txns
->
mt_readers
[
i
].
mr_txnid
<
oldest
)
oldest
=
txn
->
mt_env
->
me_txns
->
mt_readers
[
i
].
mr_txnid
;
...
...
@@ -546,7 +544,6 @@ mdb_txn_begin(MDB_env *env, int rdonly, MDB_txn **ret)
}
txn
->
mt_next_pgno
=
env
->
me_meta
.
mm_last_pg
+
1
;
txn
->
mt_first_pgno
=
txn
->
mt_next_pgno
;
txn
->
mt_root
=
env
->
me_meta
.
mm_root
;
DPRINTF
(
"begin transaction %lu on mdbenv %p, root page %lu"
,
txn
->
mt_txnid
,
(
void
*
)
env
,
txn
->
mt_root
);
...
...
@@ -599,6 +596,7 @@ mdb_txn_abort(MDB_txn *txn)
free
(
txn
->
mt_free_pgs
);
free
(
txn
->
mt_u
.
dirty_queue
);
env
->
me_txn
=
NULL
;
env
->
me_txns
->
mt_txnid
--
;
pthread_mutex_unlock
(
&
env
->
me_txns
->
mt_wmutex
);
}
...
...
@@ -654,10 +652,23 @@ mdb_txn_commit(MDB_txn *txn)
size
=
0
;
SIMPLEQ_FOREACH
(
dp
,
txn
->
mt_u
.
dirty_queue
,
h
.
md_next
)
{
if
(
dp
->
p
.
mp_pgno
!=
next
)
{
if
(
n
)
{
DPRINTF
(
"committing %u dirty pages"
,
n
);
rc
=
writev
(
env
->
me_fd
,
iov
,
n
);
if
(
rc
!=
size
)
{
n
=
errno
;
if
(
rc
>
0
)
DPRINTF
(
"short write, filesystem full?"
);
else
DPRINTF
(
"writev: %s"
,
strerror
(
errno
));
mdb_txn_abort
(
txn
);
return
n
;
}
n
=
0
;
size
=
0
;
}
lseek
(
env
->
me_fd
,
dp
->
p
.
mp_pgno
*
env
->
me_meta
.
mm_stat
.
ms_psize
,
SEEK_SET
);
next
=
dp
->
p
.
mp_pgno
;
if
(
n
)
break
;
}
DPRINTF
(
"committing page %lu"
,
dp
->
p
.
mp_pgno
);
iov
[
n
].
iov_len
=
env
->
me_meta
.
mm_stat
.
ms_psize
*
dp
->
h
.
md_num
;
...
...
@@ -687,17 +698,16 @@ mdb_txn_commit(MDB_txn *txn)
return
n
;
}
/* Drop the dirty pages.
*/
while
(
!
SIMPLEQ_EMPTY
(
txn
->
mt_u
.
dirty_queue
))
{
dp
=
SIMPLEQ_FIRST
(
txn
->
mt_u
.
dirty_queue
);
SIMPLEQ_REMOVE_HEAD
(
txn
->
mt_u
.
dirty_queue
,
h
.
md_next
);
free
(
dp
);
if
(
--
n
==
0
)
break
;
}
}
while
(
!
done
);
/* Drop the dirty pages.
*/
while
(
!
SIMPLEQ_EMPTY
(
txn
->
mt_u
.
dirty_queue
))
{
dp
=
SIMPLEQ_FIRST
(
txn
->
mt_u
.
dirty_queue
);
SIMPLEQ_REMOVE_HEAD
(
txn
->
mt_u
.
dirty_queue
,
h
.
md_next
);
free
(
dp
);
}
if
((
n
=
mdbenv_sync
(
env
))
!=
0
||
(
n
=
mdbenv_write_meta
(
txn
))
!=
MDB_SUCCESS
||
(
n
=
mdbenv_sync
(
env
))
!=
0
)
{
...
...
@@ -814,7 +824,7 @@ mdbenv_init_meta(MDB_env *env)
rc
=
write
(
env
->
me_fd
,
p
,
psize
*
2
);
free
(
p
);
return
(
rc
==
psize
*
2
)
?
MDB_SUCCESS
:
errno
;
return
(
rc
==
(
int
)
psize
*
2
)
?
MDB_SUCCESS
:
errno
;
}
static
int
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a 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