mirror of
https://github.com/samba-team/samba.git
synced 2025-09-11 09:44:19 +03:00
ldb: One-level search was incorrectly falling back to full DB scan
When no search filter is specified, the code falls back to using '(|(objectClass=*)(distinguishedName=*)'. ltdb_index_dn() then failed because matching against '*' is not indexed. The error return then caused the code to fallback to a full-scan of the DB, which could have a considerable performance hit. Instead, we want to continue on and do the ltdb_index_filter() over the indexed results that were returned. BUG: https://bugzilla.samba.org/show_bug.cgi?id=13448 Signed-off-by: Tim Beale <timbeale@catalyst.net.nz> Signed-off-by: Andrew Bartlett <abartlet@samba.org> Reviewed-by: Garming Sam <garming@catalyst.net.nz>
This commit is contained in:
@@ -1994,20 +1994,21 @@ int ltdb_search_indexed(struct ltdb_context *ac, uint32_t *match_count)
|
|||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
* Here we load the index for the tree.
|
* Here we load the index for the tree.
|
||||||
|
*
|
||||||
|
* We only care if this is successful, if the
|
||||||
|
* index can't trim the result list down then
|
||||||
|
* the ONELEVEL index is still good enough.
|
||||||
*/
|
*/
|
||||||
ret = ltdb_index_dn(ac->module, ltdb, ac->tree,
|
ret = ltdb_index_dn(ac->module, ltdb, ac->tree,
|
||||||
idx_one_tree_list);
|
idx_one_tree_list);
|
||||||
if (ret != LDB_SUCCESS) {
|
if (ret == LDB_SUCCESS) {
|
||||||
talloc_free(idx_one_tree_list);
|
if (!list_intersect(ldb, ltdb,
|
||||||
talloc_free(dn_list);
|
dn_list,
|
||||||
return ret;
|
idx_one_tree_list)) {
|
||||||
}
|
talloc_free(idx_one_tree_list);
|
||||||
|
talloc_free(dn_list);
|
||||||
if (!list_intersect(ldb, ltdb,
|
return LDB_ERR_OPERATIONS_ERROR;
|
||||||
dn_list, idx_one_tree_list)) {
|
}
|
||||||
talloc_free(idx_one_tree_list);
|
|
||||||
talloc_free(dn_list);
|
|
||||||
return LDB_ERR_OPERATIONS_ERROR;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
Reference in New Issue
Block a user