From 0819e79c4fdbd937e4b9516a1ff2ed8439cc8830 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Sat, 12 Sep 2009 12:08:34 +1000 Subject: s4-drs: spelling fix, and simpler search expression uSNChanged>=N is good enough, and offers a possibility of a simple optimisation where the partition module could look for that expression and check the partitions sequence number, then avoid searching a partition that doesn't have any records with a larger uSN. --- source4/rpc_server/drsuapi/getncchanges.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'source4/rpc_server') diff --git a/source4/rpc_server/drsuapi/getncchanges.c b/source4/rpc_server/drsuapi/getncchanges.c index 725a380f89..7183b2f45b 100644 --- a/source4/rpc_server/drsuapi/getncchanges.c +++ b/source4/rpc_server/drsuapi/getncchanges.c @@ -315,7 +315,7 @@ WERROR dcesrv_drsuapi_DsGetNCChanges(struct dcesrv_call_state *dce_call, TALLOC_ ncRoot_dn = ldb_dn_new(mem_ctx, sam_ctx, ncRoot->dn); ret = drsuapi_search_with_extended_dn(sam_ctx, mem_ctx, &site_res, ncRoot_dn, LDB_SCOPE_SUBTREE, attrs, - "(&(uSNChanged>=%llu)(objectClass=*))", + "uSNChanged>=%llu", (unsigned long long)r->in.req->req8.highwatermark.highest_usn); if (ret != LDB_SUCCESS) { return WERR_DS_DRA_INTERNAL_ERROR; @@ -390,7 +390,7 @@ WERROR dcesrv_drsuapi_DsGetNCChanges(struct dcesrv_call_state *dce_call, TALLOC_ } - DEBUG(4,("DsGetNSChanges with uSNChanged >= %llu on %s gave %u objects\n", + DEBUG(4,("DsGetNCChanges with uSNChanged >= %llu on %s gave %u objects\n", (unsigned long long)r->in.req->req8.highwatermark.highest_usn, ncRoot->dn, r->out.ctr->ctr6.object_count)); -- cgit From 493166b0094b973f7ed6fa98ed66eb0ffebc1447 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Sat, 12 Sep 2009 12:42:40 +1000 Subject: s4-drs: return objects with uSN > highest_usn When the client tells us the highest_usn they have is N, then we want to send them objects with usn>N, not>=N, as otherwise we end up sending them the same object (the one with the highest uSN) again and again. --- source4/rpc_server/drsuapi/getncchanges.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'source4/rpc_server') diff --git a/source4/rpc_server/drsuapi/getncchanges.c b/source4/rpc_server/drsuapi/getncchanges.c index 7183b2f45b..4cd71addf0 100644 --- a/source4/rpc_server/drsuapi/getncchanges.c +++ b/source4/rpc_server/drsuapi/getncchanges.c @@ -316,7 +316,7 @@ WERROR dcesrv_drsuapi_DsGetNCChanges(struct dcesrv_call_state *dce_call, TALLOC_ ret = drsuapi_search_with_extended_dn(sam_ctx, mem_ctx, &site_res, ncRoot_dn, LDB_SCOPE_SUBTREE, attrs, "uSNChanged>=%llu", - (unsigned long long)r->in.req->req8.highwatermark.highest_usn); + (unsigned long long)(r->in.req->req8.highwatermark.highest_usn+1)); if (ret != LDB_SUCCESS) { return WERR_DS_DRA_INTERNAL_ERROR; } @@ -391,8 +391,12 @@ WERROR dcesrv_drsuapi_DsGetNCChanges(struct dcesrv_call_state *dce_call, TALLOC_ DEBUG(4,("DsGetNCChanges with uSNChanged >= %llu on %s gave %u objects\n", - (unsigned long long)r->in.req->req8.highwatermark.highest_usn, + (unsigned long long)(r->in.req->req8.highwatermark.highest_usn+1), ncRoot->dn, r->out.ctr->ctr6.object_count)); + if (r->out.ctr->ctr6.object_count <= 10 && DEBUGLVL(6)) { + NDR_PRINT_FUNCTION_DEBUG(drsuapi_DsGetNCChanges, NDR_IN|NDR_OUT, r); + } + return WERR_OK; } -- cgit From a8ab1e2570ac2a2e772295cd0cc46b7e60398043 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Sat, 12 Sep 2009 13:06:32 +1000 Subject: s4-drs: also fill in tmp_highest_usn Without this the client will not update its repsFrom highest_usn values --- source4/rpc_server/drsuapi/getncchanges.c | 1 + 1 file changed, 1 insertion(+) (limited to 'source4/rpc_server') diff --git a/source4/rpc_server/drsuapi/getncchanges.c b/source4/rpc_server/drsuapi/getncchanges.c index 4cd71addf0..4dce07e24a 100644 --- a/source4/rpc_server/drsuapi/getncchanges.c +++ b/source4/rpc_server/drsuapi/getncchanges.c @@ -363,6 +363,7 @@ WERROR dcesrv_drsuapi_DsGetNCChanges(struct dcesrv_call_state *dce_call, TALLOC_ uSN = ldb_msg_find_attr_as_int(site_res->msgs[i], "uSNChanged", -1); if (uSN > r->out.ctr->ctr6.new_highwatermark.highest_usn) { + r->out.ctr->ctr6.new_highwatermark.tmp_highest_usn = uSN; r->out.ctr->ctr6.new_highwatermark.highest_usn = uSN; } -- cgit