The branch, master has been updated
       via  49b77d8df2d ldb_kv: Skip @ records early in a search full scan
      from  56f933fa344 vfs_full_audit: Fix logging of get_real_filename output

https://git.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 49b77d8df2d7113ac7ddb75e78de6628933ff852
Author: Andrew Bartlett <abart...@samba.org>
Date:   Fri Apr 5 10:46:50 2019 +1300

    ldb_kv: Skip @ records early in a search full scan
    
    @ records like @IDXLIST are only available via a base search on the 
specific name
    but the method by which they were excluded was expensive, after the unpack 
the
    DN is exploded and ldb_match_msg_error() would reject it for failing to 
match the
    scope.
    
    This uses the fact that @ records have the DN=@ prefix on their TDB/LMDB key
    to quickly exclude them from consideration.
    
    Based on analysis by Garming Sam.
    
    BUG: https://bugzilla.samba.org/show_bug.cgi?id=13893
    
    Signed-off-by: Andrew Bartlett <abart...@samba.org>
    Reviewed-by: Garming Sam <garm...@catalyst.net.nz>
    
    Autobuild-User(master): Andrew Bartlett <abart...@samba.org>
    Autobuild-Date(master): Wed Apr 10 06:23:39 UTC 2019 on sn-devel-144

-----------------------------------------------------------------------

Summary of changes:
 lib/ldb/ldb_key_value/ldb_kv.c        | 12 +++++++++++-
 lib/ldb/ldb_key_value/ldb_kv.h        |  7 ++++---
 lib/ldb/ldb_key_value/ldb_kv_index.c  | 14 ++------------
 lib/ldb/ldb_key_value/ldb_kv_search.c | 19 ++++++++++++++++++-
 4 files changed, 35 insertions(+), 17 deletions(-)


Changeset truncated at 500 lines:

diff --git a/lib/ldb/ldb_key_value/ldb_kv.c b/lib/ldb/ldb_key_value/ldb_kv.c
index bd35feed14b..2fc3aa7d030 100644
--- a/lib/ldb/ldb_key_value/ldb_kv.c
+++ b/lib/ldb/ldb_key_value/ldb_kv.c
@@ -63,12 +63,22 @@ struct ldb_kv_req_spy {
  * Determine if this key could hold a record.  We allow the new GUID
  * index, the old DN index and a possible future ID=
  */
-bool ldb_kv_key_is_record(struct ldb_val key)
+bool ldb_kv_key_is_normal_record(struct ldb_val key)
 {
        if (key.length < 4) {
                return false;
        }
 
+       /*
+        * @ records are not normal records, we don't want to index
+        * them nor search on them
+        */
+       if (key.length > 4 &&
+           memcmp(key.data, "DN=@", 4) == 0) {
+               return false;
+       }
+
+       /* All other DN= records are however */
        if (memcmp(key.data, "DN=", 3) == 0) {
                return true;
        }
diff --git a/lib/ldb/ldb_key_value/ldb_kv.h b/lib/ldb/ldb_key_value/ldb_kv.h
index 2fa931a0b7a..92106caae85 100644
--- a/lib/ldb/ldb_key_value/ldb_kv.h
+++ b/lib/ldb/ldb_key_value/ldb_kv.h
@@ -253,10 +253,11 @@ int ldb_kv_search(struct ldb_kv_context *ctx);
 /*
  * The following definitions come from lib/ldb/ldb_key_value/ldb_kv.c  */
 /*
- * Determine if this key could hold a record.  We allow the new GUID
- * index, the old DN index and a possible future ID=
+ * Determine if this key could hold a normal record.  We allow the new
+ * GUID index, the old DN index and a possible future ID= but not
+ * DN=@.
  */
-bool ldb_kv_key_is_record(struct ldb_val key);
+bool ldb_kv_key_is_normal_record(struct ldb_val key);
 struct ldb_val ldb_kv_key_dn(struct ldb_module *module,
                             TALLOC_CTX *mem_ctx,
                             struct ldb_dn *dn);
diff --git a/lib/ldb/ldb_key_value/ldb_kv_index.c 
b/lib/ldb/ldb_key_value/ldb_kv_index.c
index 2627d79d5fd..350289a78e3 100644
--- a/lib/ldb/ldb_key_value/ldb_kv_index.c
+++ b/lib/ldb/ldb_key_value/ldb_kv_index.c
@@ -3265,12 +3265,7 @@ static int re_key(struct ldb_kv_private *ldb_kv,
 
        ldb = ldb_module_get_ctx(module);
 
-       if (key.length > 4 &&
-           memcmp(key.data, "DN=@", 4) == 0) {
-               return 0;
-       }
-
-       is_record = ldb_kv_key_is_record(key);
+       is_record = ldb_kv_key_is_normal_record(key);
        if (is_record == false) {
                return 0;
        }
@@ -3352,12 +3347,7 @@ static int re_index(struct ldb_kv_private *ldb_kv,
 
        ldb = ldb_module_get_ctx(module);
 
-       if (key.length > 4 &&
-           memcmp(key.data, "DN=@", 4) == 0) {
-               return 0;
-       }
-
-       is_record = ldb_kv_key_is_record(key);
+       is_record = ldb_kv_key_is_normal_record(key);
        if (is_record == false) {
                return 0;
        }
diff --git a/lib/ldb/ldb_key_value/ldb_kv_search.c 
b/lib/ldb/ldb_key_value/ldb_kv_search.c
index f77e0ca2fdc..aa086a88d9a 100644
--- a/lib/ldb/ldb_key_value/ldb_kv_search.c
+++ b/lib/ldb/ldb_key_value/ldb_kv_search.c
@@ -512,7 +512,24 @@ static int search_func(struct ldb_kv_private *ldb_kv,
        ac = talloc_get_type(state, struct ldb_kv_context);
        ldb = ldb_module_get_ctx(ac->module);
 
-       if (ldb_kv_key_is_record(key) == false) {
+       /*
+        * We want to skip @ records early in a search full scan
+        *
+        * @ records like @IDXLIST are only available via a base
+        * search on the specific name but the method by which they
+        * were excluded was expensive, after the unpack the DN is
+        * exploded and ldb_match_msg_error() would reject it for
+        * failing to match the scope.
+        *
+        * ldb_kv_key_is_normal_record() uses the fact that @ records
+        * have the DN=@ prefix on their TDB/LMDB key to quickly
+        * exclude them from consideration.
+        *
+        * (any other non-records are also excluded by the same key
+        * match)
+        */
+
+       if (ldb_kv_key_is_normal_record(key) == false) {
                return 0;
        }
 


-- 
Samba Shared Repository

Reply via email to