[SCM] Samba Shared Repository - branch master updated

Andrew Tridgell tridge at samba.org
Mon Apr 26 18:40:47 MDT 2010


The branch, master has been updated
       via  b0aa476... s4-drs: add entries to repsTo based on calculated repsFrom
       via  3119296... s4-drepl: don't setup a repsFrom from a DC that isn't a master for a NC
       via  c375b90... s4-getncchanges: honor DRSUAPI_DRS_REF_GCSPN
       via  5b81962... s4-repl: these messages are common, and don't deserve debug level 1
       via  8aa30f9... s4-repl: on a failed request, clear the current ptr
       via  9b18b33... s4-repl: end repl request when not doing an UpdateRefs
       via  5fb60bc... s4-repl: don't delete repsTo entry on DsReplicaSync
      from  f8fc7fc... s3-build: Remove --enable-merged support.

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


- Log -----------------------------------------------------------------
commit b0aa4769483a1d2084191b70b2ffa3b0c65696ff
Author: Andrew Tridgell <tridge at samba.org>
Date:   Mon Apr 26 23:21:10 2010 +1000

    s4-drs: add entries to repsTo based on calculated repsFrom
    
    This is based on the documentation: "the KCC will automatically create
    the Reps-To attributes on destination DSAs based on other DSAs
    Reps-From entries."

commit 3119296e425a4c640fe9bd2bb97f09bab8a9ccf0
Author: Andrew Tridgell <tridge at samba.org>
Date:   Mon Apr 26 22:51:11 2010 +1000

    s4-drepl: don't setup a repsFrom from a DC that isn't a master for a NC
    
    use hasMasterNCs to see what NCs we should be pulling from each DC

commit c375b90f5d1b1cbef2896f9a9d5964126ce82022
Author: Andrew Tridgell <tridge at samba.org>
Date:   Mon Apr 26 21:49:37 2010 +1000

    s4-getncchanges: honor DRSUAPI_DRS_REF_GCSPN
    
    this is an alternative way of establishing repsTo

commit 5b81962ed1c5b0c92e735ae12b853a63a9513a3a
Author: Andrew Tridgell <tridge at samba.org>
Date:   Mon Apr 26 21:49:06 2010 +1000

    s4-repl: these messages are common, and don't deserve debug level 1
    
    getting older attributes is quite common

commit 8aa30f958073203588a4faa75b963bad83a0db41
Author: Andrew Tridgell <tridge at samba.org>
Date:   Mon Apr 26 21:48:29 2010 +1000

    s4-repl: on a failed request, clear the current ptr
    
    this prevents the queue being stuck on failure

commit 9b18b339c00953490158b40d291032b14e6fc645
Author: Andrew Tridgell <tridge at samba.org>
Date:   Mon Apr 26 21:48:06 2010 +1000

    s4-repl: end repl request when not doing an UpdateRefs
    
    otherwise the queue is stuck forever

commit 5fb60bc311dde5642b022d28a9d7af8cf6f4a5f7
Author: Andrew Tridgell <tridge at samba.org>
Date:   Mon Apr 26 21:47:29 2010 +1000

    s4-repl: don't delete repsTo entry on DsReplicaSync
    
    we rely on the highestUSN counters instead. W2K8 does not resend
    DsUpdateRefs each time, and the WSPP docs do not indicate that repsTo
    should be deleted

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

Summary of changes:
 source4/dsdb/kcc/kcc_periodic.c                 |   87 +++++++++++++++++++++--
 source4/dsdb/repl/drepl_notify.c                |   58 +++------------
 source4/dsdb/repl/drepl_out_helpers.c           |    2 +
 source4/dsdb/repl/drepl_out_pull.c              |    1 +
 source4/dsdb/samdb/ldb_modules/repl_meta_data.c |    4 +-
 source4/rpc_server/drsuapi/getncchanges.c       |    4 +-
 6 files changed, 100 insertions(+), 56 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source4/dsdb/kcc/kcc_periodic.c b/source4/dsdb/kcc/kcc_periodic.c
index 14e15e8..6dab6b5 100644
--- a/source4/dsdb/kcc/kcc_periodic.c
+++ b/source4/dsdb/kcc/kcc_periodic.c
@@ -52,19 +52,62 @@ static bool reps_in_list(struct repsFromToBlob *r, struct repsFromToBlob *reps,
 	return false;
 }
 
+/*
+  make sure we only add repsFrom entries for DCs who are masters for
+  the partition
+ */
+static bool check_MasterNC(struct kccsrv_partition *p, struct repsFromToBlob *r,
+			   struct ldb_result *res)
+{
+	struct repsFromTo1 *r1;
+	r1 = &r->ctr.ctr1;
+	struct GUID invocation_id = r1->source_dsa_invocation_id;
+	int i, j;
+
+	for (i=0; i<res->count; i++) {
+		struct ldb_message *msg = res->msgs[i];
+		struct ldb_message_element *el;
+		struct ldb_dn *dn;
+
+		struct GUID id2 = samdb_result_guid(msg, "invocationID");
+		if (!GUID_equal(&invocation_id, &id2)) {
+			continue;
+		}
+
+		el = ldb_msg_find_element(msg, "hasMasterNCs");
+		if (!el || el->num_values == 0) {
+			continue;
+		}
+		for (j=0; j<el->num_values; j++) {
+			dn = ldb_dn_from_ldb_val(p, p->service->samdb, &el->values[j]);
+			if (!ldb_dn_validate(dn)) {
+				talloc_free(dn);
+				continue;
+			}
+			if (ldb_dn_compare(dn, p->dn) == 0) {
+				talloc_free(dn);
+				return true;
+			}
+			talloc_free(dn);
+		}
+	}
+	return false;
+}
+
 
 /*
  * add any missing repsFrom structures to our partitions
  */
 static NTSTATUS kccsrv_add_repsFrom(struct kccsrv_service *s, TALLOC_CTX *mem_ctx,
-				    struct repsFromToBlob *reps, uint32_t count)
+				    struct repsFromToBlob *reps, uint32_t count,
+				    struct ldb_result *res)
 {
 	struct kccsrv_partition *p;
 
 	/* update the repsFrom on all partitions */
 	for (p=s->partitions; p; p=p->next) {
-		struct repsFromToBlob *old_reps;
-		uint32_t old_count;
+		struct repsFromToBlob *old_reps, *reps_to;
+		uint32_t old_count, to_count;
 		WERROR werr;
 		uint32_t i;
 		bool modified = false;
@@ -78,7 +121,8 @@ static NTSTATUS kccsrv_add_repsFrom(struct kccsrv_service *s, TALLOC_CTX *mem_ct
 
 		/* add any new ones */
 		for (i=0; i<count; i++) {
-			if (!reps_in_list(&reps[i], old_reps, old_count)) {
+			if (!reps_in_list(&reps[i], old_reps, old_count) &&
+			    check_MasterNC(p, &reps[i], res)) {
 				old_reps = talloc_realloc(mem_ctx, old_reps, struct repsFromToBlob, old_count+1);
 				NT_STATUS_HAVE_NO_MEMORY(old_reps);
 				old_reps[old_count] = reps[i];
@@ -89,7 +133,8 @@ static NTSTATUS kccsrv_add_repsFrom(struct kccsrv_service *s, TALLOC_CTX *mem_ct
 
 		/* remove any stale ones */
 		for (i=0; i<old_count; i++) {
-			if (!reps_in_list(&old_reps[i], reps, count)) {
+			if (!reps_in_list(&old_reps[i], reps, count) ||
+			    !check_MasterNC(p, &old_reps[i], res)) {
 				memmove(&old_reps[i], &old_reps[i+1], (old_count-(i+1))*sizeof(old_reps[0]));
 				old_count--;
 				i--;
@@ -105,6 +150,34 @@ static NTSTATUS kccsrv_add_repsFrom(struct kccsrv_service *s, TALLOC_CTX *mem_ct
 				return NT_STATUS_INTERNAL_DB_CORRUPTION;
 			}
 		}
+
+		werr = dsdb_loadreps(s->samdb, mem_ctx, p->dn, "repsTo", &reps_to, &to_count);
+		if (!W_ERROR_IS_OK(werr)) {
+			DEBUG(0,(__location__ ": Failed to load repsTo from %s - %s\n",
+				 ldb_dn_get_linearized(p->dn), ldb_errstring(s->samdb)));
+			return NT_STATUS_INTERNAL_DB_CORRUPTION;
+		}
+
+		modified = false;
+		/* add any new ones */
+		for (i=0; i<old_count; i++) {
+			if (!reps_in_list(&old_reps[i], reps_to, to_count)) {
+				reps_to = talloc_realloc(mem_ctx, reps_to, struct repsFromToBlob, to_count+1);
+				NT_STATUS_HAVE_NO_MEMORY(reps_to);
+				reps_to[to_count] = old_reps[i];
+				to_count++;
+				modified = true;
+			}
+		}
+
+		if (modified) {
+			werr = dsdb_savereps(s->samdb, mem_ctx, p->dn, "repsTo", reps_to, to_count);
+			if (!W_ERROR_IS_OK(werr)) {
+				DEBUG(0,(__location__ ": Failed to save repsTo to %s - %s\n",
+					 ldb_dn_get_linearized(p->dn), ldb_errstring(s->samdb)));
+				return NT_STATUS_INTERNAL_DB_CORRUPTION;
+			}
+		}
 	}
 
 	return NT_STATUS_OK;
@@ -121,7 +194,7 @@ NTSTATUS kccsrv_simple_update(struct kccsrv_service *s, TALLOC_CTX *mem_ctx)
 	struct ldb_result *res;
 	unsigned int i;
 	int ret;
-	const char *attrs[] = { "objectGUID", "invocationID", NULL };
+	const char *attrs[] = { "objectGUID", "invocationID", "hasMasterNCs", NULL };
 	struct repsFromToBlob *reps = NULL;
 	uint32_t count = 0;
 	struct kcc_connection_list *ntds_conn, *dsa_conn;
@@ -181,7 +254,7 @@ NTSTATUS kccsrv_simple_update(struct kccsrv_service *s, TALLOC_CTX *mem_ctx)
 
 	kccsrv_apply_connections(s, ntds_conn, dsa_conn);
 
-	return kccsrv_add_repsFrom(s, mem_ctx, reps, count);
+	return kccsrv_add_repsFrom(s, mem_ctx, reps, count, res);
 }
 
 
diff --git a/source4/dsdb/repl/drepl_notify.c b/source4/dsdb/repl/drepl_notify.c
index 7ae4af7..00075e8 100644
--- a/source4/dsdb/repl/drepl_notify.c
+++ b/source4/dsdb/repl/drepl_notify.c
@@ -171,38 +171,6 @@ static NTSTATUS dreplsrv_op_notify_recv(struct tevent_req *req)
 	return tevent_req_simple_recv_ntstatus(req);
 }
 
-static void dreplsrv_notify_del_repsTo(struct dreplsrv_notify_operation *op)
-{
-	uint32_t count;
-	struct repsFromToBlob *reps;
-	WERROR werr;
-	struct dreplsrv_service *s = op->service;
-	uint32_t i;
-
-	werr = dsdb_loadreps(s->samdb, op, op->source_dsa->partition->dn, "repsTo", &reps, &count);
-	if (!W_ERROR_IS_OK(werr)) {
-		DEBUG(0,(__location__ ": Failed to load repsTo for %s\n",
-			 ldb_dn_get_linearized(op->source_dsa->partition->dn)));
-		return;
-	}
-
-	for (i=0; i<count; i++) {
-		if (GUID_compare(&reps[i].ctr.ctr1.source_dsa_obj_guid, 
-				 &op->source_dsa->repsFrom1->source_dsa_obj_guid) == 0) {
-			memmove(&reps[i], &reps[i+1],
-				sizeof(reps[i])*(count-(i+1)));
-			count--;
-		}
-	}
-
-	werr = dsdb_savereps(s->samdb, op, op->source_dsa->partition->dn, "repsTo", reps, count);
-	if (!W_ERROR_IS_OK(werr)) {
-		DEBUG(0,(__location__ ": Failed to save repsTo for %s\n",
-			 ldb_dn_get_linearized(op->source_dsa->partition->dn)));
-		return;
-	}
-}
-
 /*
   called when a notify operation has completed
  */
@@ -225,9 +193,6 @@ static void dreplsrv_notify_op_callback(struct tevent_req *subreq)
 		DEBUG(2,("dreplsrv_notify: DsReplicaSync OK for %s\n",
 			 op->source_dsa->repsFrom1->other_info->dns_name));
 		op->source_dsa->notify_uSN = op->uSN;
-		/* delete the repsTo for this replication partner in the
-		   partition, as we have successfully told him to sync */
-		dreplsrv_notify_del_repsTo(op);
 	}
 
 	talloc_free(op);
@@ -265,6 +230,9 @@ void dreplsrv_notify_run_ops(struct dreplsrv_service *s)
 		return;
 	}
 	tevent_req_set_callback(subreq, dreplsrv_notify_op_callback, op);
+	DEBUG(4,("started DsReplicaSync for %s to %s\n",
+		 ldb_dn_get_linearized(op->source_dsa->partition->dn),
+		 op->source_dsa->repsFrom1->other_info->dns_name));
 }
 
 
@@ -335,9 +303,6 @@ static WERROR dreplsrv_notify_check(struct dreplsrv_service *s,
 	int ret;
 
 	werr = dsdb_loadreps(s->samdb, mem_ctx, p->dn, "repsTo", &reps, &count);
-	if (count == 0) {
-		werr = dsdb_loadreps(s->samdb, mem_ctx, p->dn, "repsFrom", &reps, &count);
-	}
 	if (!W_ERROR_IS_OK(werr)) {
 		DEBUG(0,(__location__ ": Failed to load repsTo for %s\n",
 			 ldb_dn_get_linearized(p->dn)));
@@ -359,22 +324,23 @@ static WERROR dreplsrv_notify_check(struct dreplsrv_service *s,
 		if (sdsa->notify_uSN < uSNHighest) {
 			/* we need to tell this partner to replicate
 			   with us */
+			bool is_urgent = sdsa->notify_uSN < uSNUrgent;
 
 			/* check if urgent replication is needed */
-			if (sdsa->notify_uSN < uSNUrgent) {
-				werr = dreplsrv_schedule_notify_sync(s, p, &reps[i], mem_ctx,
-									uSNHighest, true);
-			} else {
-				werr = dreplsrv_schedule_notify_sync(s, p, &reps[i], mem_ctx,
-									uSNHighest, false);
-			}
-
+			werr = dreplsrv_schedule_notify_sync(s, p, &reps[i], mem_ctx,
+							     uSNHighest, is_urgent);
 			if (!W_ERROR_IS_OK(werr)) {
 				DEBUG(0,(__location__ ": Failed to setup notify to %s for %s\n",
 					 reps[i].ctr.ctr1.other_info->dns_name,
 					 ldb_dn_get_linearized(p->dn)));
 				return werr;
 			}
+			DEBUG(4,("queued DsReplicaSync for %s to %s (urgent=%s) uSN=%llu:%llu\n",
+				 ldb_dn_get_linearized(p->dn),
+				 reps[i].ctr.ctr1.other_info->dns_name,
+				 is_urgent?"true":"false",
+				 (unsigned long long)sdsa->notify_uSN,
+				 (unsigned long long)uSNHighest));
 		}
 	}
 
diff --git a/source4/dsdb/repl/drepl_out_helpers.c b/source4/dsdb/repl/drepl_out_helpers.c
index 52b519c..56e1257 100644
--- a/source4/dsdb/repl/drepl_out_helpers.c
+++ b/source4/dsdb/repl/drepl_out_helpers.c
@@ -530,6 +530,8 @@ static void dreplsrv_op_pull_source_apply_changes_trigger(struct tevent_req *req
 	*/
 	if (state->op->extended_op == DRSUAPI_EXOP_NONE) {
 		dreplsrv_update_refs_trigger(req);
+	} else {
+		tevent_req_done(req);
 	}
 }
 
diff --git a/source4/dsdb/repl/drepl_out_pull.c b/source4/dsdb/repl/drepl_out_pull.c
index 1012146..329b298 100644
--- a/source4/dsdb/repl/drepl_out_pull.c
+++ b/source4/dsdb/repl/drepl_out_pull.c
@@ -171,6 +171,7 @@ void dreplsrv_run_pending_ops(struct dreplsrv_service *s)
 
 		rf->result_last_attempt = WERR_NOMEM;
 		rf->consecutive_sync_failures++;
+		s->ops.current = NULL;
 
 		DEBUG(1,("dreplsrv_op_pull_source(%s/%s) failures[%u]\n",
 			win_errstr(rf->result_last_attempt),
diff --git a/source4/dsdb/samdb/ldb_modules/repl_meta_data.c b/source4/dsdb/samdb/ldb_modules/repl_meta_data.c
index 9dcf24a..1814b70 100644
--- a/source4/dsdb/samdb/ldb_modules/repl_meta_data.c
+++ b/source4/dsdb/samdb/ldb_modules/repl_meta_data.c
@@ -2875,7 +2875,7 @@ static int replmd_replicated_apply_merge(struct replmd_replicated_request *ar)
 			}
 
 			if (rmd->ctr.ctr1.array[i].attid != DRSUAPI_ATTRIBUTE_instanceType) {
-				DEBUG(1,("Discarding older DRS attribute update to %s on %s from %s\n",
+				DEBUG(3,("Discarding older DRS attribute update to %s on %s from %s\n",
 					 msg->elements[i-removed_attrs].name,
 					 ldb_dn_get_linearized(msg->dn),
 					 GUID_string(ar, &rmd->ctr.ctr1.array[i].originating_invocation_id)));
@@ -3743,7 +3743,7 @@ linked_attributes[0]:
 					    la->meta_data.version,
 					    change_time,
 					    la->meta_data.originating_change_time)) {
-			DEBUG(1,("Discarding older DRS linked attribute update to %s on %s from %s\n",
+			DEBUG(3,("Discarding older DRS linked attribute update to %s on %s from %s\n",
 				 old_el->name, ldb_dn_get_linearized(msg->dn),
 				 GUID_string(tmp_ctx, &la->meta_data.originating_invocation_id)));
 			talloc_free(tmp_ctx);
diff --git a/source4/rpc_server/drsuapi/getncchanges.c b/source4/rpc_server/drsuapi/getncchanges.c
index 90407a3..df8305e 100644
--- a/source4/rpc_server/drsuapi/getncchanges.c
+++ b/source4/rpc_server/drsuapi/getncchanges.c
@@ -1005,9 +1005,11 @@ WERROR dcesrv_drsuapi_DsGetNCChanges(struct dcesrv_call_state *dce_call, TALLOC_
 
 	/* the client can us to call UpdateRefs on its behalf to
 	   re-establish monitoring of the NC */
-	if ((req8->replica_flags & DRSUAPI_DRS_ADD_REF) && 
+	if ((req8->replica_flags & (DRSUAPI_DRS_ADD_REF | DRSUAPI_DRS_REF_GCSPN)) &&
 	    !GUID_all_zero(&req8->destination_dsa_guid)) {
 		struct drsuapi_DsReplicaUpdateRefsRequest1 ureq;
+		DEBUG(3,("UpdateRefs on getncchanges for %s\n",
+			 GUID_string(mem_ctx, &req8->destination_dsa_guid)));
 		ureq.naming_context = ncRoot;
 		ureq.dest_dsa_dns_name = talloc_asprintf(mem_ctx, "%s._msdcs.%s",
 							 GUID_string(mem_ctx, &req8->destination_dsa_guid),


-- 
Samba Shared Repository


More information about the samba-cvs mailing list