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)
committerAndrew Bartlett <abartlet@samba.org>
Wed, 30 May 2018 02:23:27 +0000 (04:23 +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>
lib/ldb/ldb_tdb/ldb_index.c

index 041dbdc4ed6e4a68b0100e2ff70d1d6a64769263..7bd843effbe63bdb6491bcab35867f105418b32c 100644 (file)
@@ -1994,20 +1994,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;