mirror of
https://github.com/samba-team/samba.git
synced 2024-12-25 23:21:54 +03:00
r19402: - use the new tdb_lockall_read() to make ldb_search() more efficient,
by avoiding chain locks on each tdb_fetch() within the search
- use the tdb_get_seqnum() call to avoid re-reading the @BASEINFO
record when it hasn't changed.
These speed up the LOCAL-DBSPEED test for ldb from 7k ops/sec to a bit
over 11k ops/sec
(This used to be commit 1347ad254e
)
This commit is contained in:
parent
cba142f1ae
commit
4b9eee02c4
@ -316,6 +316,12 @@ int ltdb_cache_load(struct ldb_module *module)
|
||||
uint64_t seq;
|
||||
struct ldb_message *baseinfo;
|
||||
|
||||
/* a very fast check to avoid extra database reads */
|
||||
if (ltdb->cache != NULL &&
|
||||
tdb_get_seqnum(ltdb->tdb) == ltdb->tdb_seqnum) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (ltdb->cache == NULL) {
|
||||
ltdb->cache = talloc_zero(ltdb, struct ltdb_cache);
|
||||
if (ltdb->cache == NULL) goto failed;
|
||||
@ -349,6 +355,8 @@ int ltdb_cache_load(struct ldb_module *module)
|
||||
}
|
||||
}
|
||||
|
||||
ltdb->tdb_seqnum = tdb_get_seqnum(ltdb->tdb);
|
||||
|
||||
/* if the current internal sequence number is the same as the one
|
||||
in the database then assume the rest of the cache is OK */
|
||||
seq = ldb_msg_find_attr_as_uint64(baseinfo, LTDB_SEQUENCE_NUMBER, 0);
|
||||
|
@ -248,25 +248,13 @@ int ltdb_search_dn1(struct ldb_module *module, const struct ldb_dn *dn, struct l
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* the lock key for search locking. Note that this is not a DN, its
|
||||
just an arbitrary key to give to tdb. Also note that as we and
|
||||
using transactions for all write operations and transactions take
|
||||
care of their own locks, we don't need to do any locking anywhere
|
||||
other than in ldb_search() */
|
||||
#define LDBLOCK "INT_LDBLOCK"
|
||||
|
||||
/*
|
||||
lock the database for read - use by ltdb_search
|
||||
*/
|
||||
static int ltdb_lock_read(struct ldb_module *module)
|
||||
{
|
||||
struct ltdb_private *ltdb = module->private_data;
|
||||
TDB_DATA key;
|
||||
|
||||
key.dptr = discard_const(LDBLOCK);
|
||||
key.dsize = strlen(LDBLOCK);
|
||||
|
||||
return tdb_chainlock_read(ltdb->tdb, key);
|
||||
return tdb_lockall_read(ltdb->tdb);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -275,12 +263,7 @@ static int ltdb_lock_read(struct ldb_module *module)
|
||||
static int ltdb_unlock_read(struct ldb_module *module)
|
||||
{
|
||||
struct ltdb_private *ltdb = module->private_data;
|
||||
TDB_DATA key;
|
||||
|
||||
key.dptr = discard_const(LDBLOCK);
|
||||
key.dsize = strlen(LDBLOCK);
|
||||
|
||||
return tdb_chainunlock_read(ltdb->tdb, key);
|
||||
return tdb_unlockall_read(ltdb->tdb);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -1021,7 +1021,7 @@ static int ltdb_connect(struct ldb_context *ldb, const char *url,
|
||||
path = url;
|
||||
}
|
||||
|
||||
tdb_flags = TDB_DEFAULT;
|
||||
tdb_flags = TDB_DEFAULT | TDB_SEQNUM;
|
||||
|
||||
/* check for the 'nosync' option */
|
||||
if (flags & LDB_FLG_NOSYNC) {
|
||||
|
@ -21,6 +21,10 @@ struct ltdb_private {
|
||||
handling. It has plenty of digits of precision */
|
||||
unsigned long long sequence_number;
|
||||
|
||||
/* the low level tdb seqnum - used to avoid loading BASEINFO when
|
||||
possible */
|
||||
int tdb_seqnum;
|
||||
|
||||
struct ltdb_cache {
|
||||
struct ldb_message *indexlist;
|
||||
struct ldb_message *attributes;
|
||||
|
Loading…
Reference in New Issue
Block a user