ldb: One-level search was incorrectly falling back to full DB scan
authorAndrew Bartlett <abartlet@samba.org>
Mon, 28 May 2018 22:04:29 +0000 (10:04 +1200)
committerKarolin Seeger <kseeger@samba.org>
Tue, 26 Jun 2018 07:19:16 +0000 (09:19 +0200)
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>
(cherry picked from commit 88ae60ed186c9c479722ad62d65a07d0c2e71469)

lib/ldb/ldb_tdb/ldb_index.c

index 3a1aa23aa7eaa7d7a9b3fd305e4920ab0bd281e0..251f6295f5499de795f19e83bd49638aa38351e3 100644 (file)
@@ -1799,20 +1799,21 @@ int ltdb_search_indexed(struct ltdb_context *ac, uint32_t *match_count)
                        }
                        /*
                         * 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,
                                            idx_one_tree_list);
-                       if (ret != LDB_SUCCESS) {
-                               talloc_free(idx_one_tree_list);
-                               talloc_free(dn_list);
-                               return ret;
-                       }
-
-                       if (!list_intersect(ldb, ltdb,
-                                           dn_list, idx_one_tree_list)) {
-                               talloc_free(idx_one_tree_list);
-                               talloc_free(dn_list);
-                               return LDB_ERR_OPERATIONS_ERROR;
+                       if (ret == LDB_SUCCESS) {
+                               if (!list_intersect(ldb, ltdb,
+                                                   dn_list,
+                                                   idx_one_tree_list)) {
+                                       talloc_free(idx_one_tree_list);
+                                       talloc_free(dn_list);
+                                       return LDB_ERR_OPERATIONS_ERROR;
+                               }
                        }
                }
                break;