replmd: Avoid redundant dsdb_get_deleted_objects_dn() checks
authorTim Beale <timbeale@catalyst.net.nz>
Mon, 12 Nov 2018 02:49:28 +0000 (15:49 +1300)
committerTim Beale <timbeale@samba.org>
Wed, 21 Nov 2018 00:51:11 +0000 (01:51 +0100)
Quite a bit of time was spent in dsdb_get_deleted_objects_dn()
processing during either a join (~9%) or a full-sync (~28%).

The problem is we're *always* doing the dsdb_get_deleted_objects_dn()
call for each object, regardless of whether it's actually deleted or
not. i.e. we were doing an expensive query and a lot of the time just
ignoring the query result.

If it's not a deleted object we're dealing with, we can just return
early and skip the unnecessary processing.

Signed-off-by: Tim Beale <timbeale@catalyst.net.nz>
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
source4/dsdb/samdb/ldb_modules/repl_meta_data.c

index 433f8f7d6caf65b228edda6627378cc8770bf526..b88aaf251e7604e4b52b65286e3661ac34470063 100644 (file)
@@ -6807,9 +6807,18 @@ static int replmd_replicated_apply_isDeleted(struct replmd_replicated_request *a
 {
        struct ldb_dn *deleted_objects_dn;
        struct ldb_message *msg = ar->objs->objects[ar->index_current].msg;
-       int ret = dsdb_get_deleted_objects_dn(ldb_module_get_ctx(ar->module), msg, msg->dn,
-                                             &deleted_objects_dn);
-       if (ar->isDeleted && (ret != LDB_SUCCESS || ldb_dn_compare(msg->dn, deleted_objects_dn) != 0)) {
+       int ret;
+
+       if (!ar->isDeleted) {
+
+               /* not a deleted object, so nothing to do */
+               ar->index_current++;
+               return replmd_replicated_apply_next(ar);
+       }
+
+       ret = dsdb_get_deleted_objects_dn(ldb_module_get_ctx(ar->module), msg,
+                                         msg->dn, &deleted_objects_dn);
+       if (ret != LDB_SUCCESS || ldb_dn_compare(msg->dn, deleted_objects_dn) != 0) {
                /*
                 * Do a delete here again, so that if there is
                 * anything local that conflicts with this