diff options
author | Andrew Tridgell <tridge@samba.org> | 2010-09-20 20:36:36 -0700 |
---|---|---|
committer | Andrew Tridgell <tridge@samba.org> | 2010-09-20 21:51:08 -0700 |
commit | 7ffcf90bb9b7214e30b82a0e8e371207409052eb (patch) | |
tree | ee10ed693cc34fc6df64809e65d0471057b13555 /source4/dsdb/repl/drepl_out_helpers.c | |
parent | 6f47a24bc55be0ea907594a748774675a105b5e3 (diff) | |
download | samba-7ffcf90bb9b7214e30b82a0e8e371207409052eb.tar.gz samba-7ffcf90bb9b7214e30b82a0e8e371207409052eb.tar.bz2 samba-7ffcf90bb9b7214e30b82a0e8e371207409052eb.zip |
s4-drepl: use the partition UDV and hwm for extended getncchanges ops
we find the NC root then load the uptodateness vector and highwater
mark, if available, from there
Diffstat (limited to 'source4/dsdb/repl/drepl_out_helpers.c')
-rw-r--r-- | source4/dsdb/repl/drepl_out_helpers.c | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/source4/dsdb/repl/drepl_out_helpers.c b/source4/dsdb/repl/drepl_out_helpers.c index 60c4a66345..4f578282ff 100644 --- a/source4/dsdb/repl/drepl_out_helpers.c +++ b/source4/dsdb/repl/drepl_out_helpers.c @@ -297,6 +297,31 @@ static NTSTATUS dreplsrv_get_rodc_partial_attribute_set(struct dreplsrv_service return NT_STATUS_OK; } +/* + convert from one udv format to the other + */ +static WERROR udv_convert(TALLOC_CTX *mem_ctx, + const struct replUpToDateVectorCtr2 *udv, + struct drsuapi_DsReplicaCursorCtrEx *udv_ex) +{ + uint32_t i; + + udv_ex->version = 2; + udv_ex->reserved1 = 0; + udv_ex->reserved2 = 0; + udv_ex->count = udv->count; + udv_ex->cursors = talloc_array(mem_ctx, struct drsuapi_DsReplicaCursor, udv->count); + W_ERROR_HAVE_NO_MEMORY(udv_ex->cursors); + + for (i=0; i<udv->count; i++) { + udv_ex->cursors[i].source_dsa_invocation_id = udv->cursors[i].source_dsa_invocation_id; + udv_ex->cursors[i].highest_usn = udv->cursors[i].highest_usn; + } + + return WERR_OK; +} + + static void dreplsrv_op_pull_source_get_changes_trigger(struct tevent_req *req) { struct dreplsrv_op_pull_source_state *state = tevent_req_data(req, @@ -335,6 +360,16 @@ static void dreplsrv_op_pull_source_get_changes_trigger(struct tevent_req *req) return; } + if (partition->uptodatevector.count != 0 && + partition->uptodatevector_ex.count == 0) { + WERROR werr; + werr = udv_convert(partition, &partition->uptodatevector, &partition->uptodatevector_ex); + if (!W_ERROR_IS_OK(werr)) { + DEBUG(0,(__location__ ": Failed to convert UDV for %s : %s\n", + ldb_dn_get_linearized(partition->dn), nt_errstr(status))); + } + } + if (partition->uptodatevector_ex.count == 0) { uptodateness_vector = NULL; } else { |