[SCM] Samba Shared Repository - branch master updated

Kamen Mazdrashki kamenim at samba.org
Sun Aug 29 07:30:34 MDT 2010


The branch, master has been updated
       via  b5ed9c2 s4-kcc: Notify dreplsrv that Topology has changed
       via  b954834 s4-dreplsrv: Implement irpc stub to be used to force dreplsrv to update internal cache
       via  53551a7 s4-dreplsrv: Move partition cache update before scheduling another set of replications
       via  d15a7d9 s4-testenv: Synchronize DCs after 'net vampire'
       via  a052497 s4-kcc: Assert when unexpected repsFromToBlob version is passed
      from  d1d2997 s3: Remove an unused macro

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


- Log -----------------------------------------------------------------
commit b5ed9c2c4d7cec930a9bb4d1a79561d012879bd1
Author: Kamen Mazdrashki <kamenim at samba.org>
Date:   Sat Aug 28 20:02:13 2010 +0300

    s4-kcc: Notify dreplsrv that Topology has changed

commit b954834ad1a60f006d0d391f17edbcaac9ed48f2
Author: Kamen Mazdrashki <kamenim at samba.org>
Date:   Sat Aug 28 20:00:39 2010 +0300

    s4-dreplsrv: Implement irpc stub to be used to force dreplsrv to update internal cache
    
    This IRPC calls is to be used whenever repsFrom/repsTo are
    changed by administrative tool or KCC (i.e. Topology changes).
    
    At present, only KCC may change topology.

commit 53551a76c5b6bdcbb2e039ee98f4a712fbc6e8cb
Author: Kamen Mazdrashki <kamenim at samba.org>
Date:   Sat Aug 28 02:26:00 2010 +0300

    s4-dreplsrv: Move partition cache update before scheduling another set of replications

commit d15a7d9099f4eef8e1a82d0935cca8cfab542e5c
Author: Kamen Mazdrashki <kamenim at samba.org>
Date:   Sat Aug 28 01:30:09 2010 +0300

    s4-testenv: Synchronize DCs after 'net vampire'
    
    During 'net vampire', vampired DC adds information in its own
    database, se we need to force replicate vampired_dc to the
    first DC to be sure everything is in sync prior starting tests

commit a052497c7427ba7212fbc6a5d0053990dcf0c0dc
Author: Kamen Mazdrashki <kamenim at samba.org>
Date:   Fri Aug 27 17:25:56 2010 +0300

    s4-kcc: Assert when unexpected repsFromToBlob version is passed
    
    At present we only support v1 structures (Win2k3 and earlier),
    so it is good to make it obvious.
    In case we start supporting v2 we will be able to notice this
    function should be refactored right away

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

Summary of changes:
 selftest/target/Samba4.pm          |   24 ++++++++++++++++++++++++
 source4/dsdb/kcc/kcc_periodic.c    |   35 +++++++++++++++++++++++++++++++++--
 source4/dsdb/repl/drepl_periodic.c |   10 +++++++---
 source4/dsdb/repl/drepl_service.c  |   20 ++++++++++++++++++++
 source4/librpc/idl/irpc.idl        |   11 +++++++++++
 5 files changed, 95 insertions(+), 5 deletions(-)


Changeset truncated at 500 lines:

diff --git a/selftest/target/Samba4.pm b/selftest/target/Samba4.pm
index f0da581..4072524 100644
--- a/selftest/target/Samba4.pm
+++ b/selftest/target/Samba4.pm
@@ -1327,6 +1327,30 @@ sub setup_vampire_dc($$$)
 
 	$self->{vars}->{vampire_dc} = $env;
 
+	# force replicated DC to update repsTo/repsFrom
+	# for vampired partitions
+	my $net = $self->bindir_path("net");
+	my $cmd = "";
+	$cmd .= "SOCKET_WRAPPER_DEFAULT_IFACE=\"$env->{SOCKET_WRAPPER_DEFAULT_IFACE}\"";
+	$cmd .= " KRB5_CONFIG=\"$env->{KRB5_CONFIG}\"";
+	$cmd .= " $net drs kcc $env->{DC_SERVER}";
+	$cmd .= " -U$dc_vars->{DC_USERNAME}\%$dc_vars->{DC_PASSWORD}";
+	system($cmd) == 0 or die("Failed to exec kcc\n$cmd");
+
+	# as 'vampired' dc may add data in its local replica
+	# we need to synchronize data between DCs
+	my $base_dn = "DC=".join(",DC=", split(/\./, $dc_vars->{REALM}));
+	$cmd = "SOCKET_WRAPPER_DEFAULT_IFACE=\"$env->{SOCKET_WRAPPER_DEFAULT_IFACE}\"";
+	$cmd .= " KRB5_CONFIG=\"$env->{KRB5_CONFIG}\"";
+	$cmd .= " $net drs replicate $env->{DC_SERVER} $env->{VAMPIRE_DC_SERVER}";
+	$cmd .= " -U$dc_vars->{DC_USERNAME}\%$dc_vars->{DC_PASSWORD}";
+	# replicate Configuration NC
+	my $cmd_repl = "$cmd \"CN=Configuration,$base_dn\"";
+	system($cmd_repl) == 0 or die("Failed to replicate\n$cmd_repl");
+	# replicate Default NC
+	$cmd_repl = "$cmd \"$base_dn\"";
+	system($cmd_repl) == 0 or die("Failed to replicate\n$cmd_repl");
+
 	return $env;
 }
 
diff --git a/source4/dsdb/kcc/kcc_periodic.c b/source4/dsdb/kcc/kcc_periodic.c
index 3f37208..0955c99 100644
--- a/source4/dsdb/kcc/kcc_periodic.c
+++ b/source4/dsdb/kcc/kcc_periodic.c
@@ -33,6 +33,7 @@
 #include "librpc/gen_ndr/ndr_misc.h"
 #include "librpc/gen_ndr/ndr_drsuapi.h"
 #include "librpc/gen_ndr/ndr_drsblobs.h"
+#include "librpc/gen_ndr/ndr_irpc.h"
 #include "param/param.h"
 
 /*
@@ -59,11 +60,13 @@ static bool reps_in_list(struct repsFromToBlob *r, struct repsFromToBlob *reps,
 static bool check_MasterNC(struct kccsrv_partition *p, struct repsFromToBlob *r,
 			   struct ldb_result *res)
 {
-	struct repsFromTo1 *r1;
-	r1 = &r->ctr.ctr1;
+	struct repsFromTo1 *r1 = &r->ctr.ctr1;
 	struct GUID invocation_id = r1->source_dsa_invocation_id;
 	unsigned int i, j;
 
+	/* we are expecting only version 1 */
+	SMB_ASSERT(r->version == 1);
+
 	for (i=0; i<res->count; i++) {
 		struct ldb_message *msg = res->msgs[i];
 		struct ldb_message_element *el;
@@ -95,6 +98,24 @@ static bool check_MasterNC(struct kccsrv_partition *p, struct repsFromToBlob *r,
 }
 
 
+/**
+ * Force dreplsrv to update its state as topology is changed
+ */
+static void kccsrv_notify_drepl_server(struct kccsrv_service *s,
+				       TALLOC_CTX *mem_ctx)
+{
+	struct dreplsrv_refresh r;
+	struct server_id *drepl_srv;
+
+	drepl_srv = irpc_servers_byname(s->task->msg_ctx, mem_ctx, "dreplsrv");
+	if (!drepl_srv) {
+		/* dreplsrv is not running yet */
+		return;
+	}
+
+	IRPC_CALL(s->task->msg_ctx, drepl_srv[0], irpc, DREPLSRV_REFRESH, &r, mem_ctx);
+}
+
 /*
  * add any missing repsFrom structures to our partitions
  */
@@ -103,6 +124,7 @@ static NTSTATUS kccsrv_add_repsFrom(struct kccsrv_service *s, TALLOC_CTX *mem_ct
 				    struct ldb_result *res)
 {
 	struct kccsrv_partition *p;
+	bool notify_dreplsrv = false;
 
 	/* update the repsFrom on all partitions */
 	for (p=s->partitions; p; p=p->next) {
@@ -149,6 +171,8 @@ static NTSTATUS kccsrv_add_repsFrom(struct kccsrv_service *s, TALLOC_CTX *mem_ct
 					 ldb_dn_get_linearized(p->dn), ldb_errstring(s->samdb)));
 				return NT_STATUS_INTERNAL_DB_CORRUPTION;
 			}
+			/* dreplsrv should refresh its state */
+			notify_dreplsrv = true;
 		}
 
 		werr = dsdb_loadreps(s->samdb, mem_ctx, p->dn, "repsTo", &reps_to, &to_count);
@@ -177,9 +201,16 @@ static NTSTATUS kccsrv_add_repsFrom(struct kccsrv_service *s, TALLOC_CTX *mem_ct
 					 ldb_dn_get_linearized(p->dn), ldb_errstring(s->samdb)));
 				return NT_STATUS_INTERNAL_DB_CORRUPTION;
 			}
+			/* dreplsrv should refresh its state */
+			notify_dreplsrv = true;
 		}
 	}
 
+	/* notify dreplsrv toplogy has changed */
+	if (notify_dreplsrv) {
+		kccsrv_notify_drepl_server(s, mem_ctx);
+	}
+
 	return NT_STATUS_OK;
 
 }
diff --git a/source4/dsdb/repl/drepl_periodic.c b/source4/dsdb/repl/drepl_periodic.c
index d2fbe45..9200606 100644
--- a/source4/dsdb/repl/drepl_periodic.c
+++ b/source4/dsdb/repl/drepl_periodic.c
@@ -99,6 +99,13 @@ static void dreplsrv_periodic_run(struct dreplsrv_service *service)
 
 	DEBUG(2,("dreplsrv_periodic_run(): schedule pull replication\n"));
 
+	/*
+	 * KCC or some administrative tool
+	 * might have changed Topology graph
+	 * i.e. repsFrom/repsTo
+	 */
+	dreplsrv_refresh_partitions(service);
+
 	mem_ctx = talloc_new(service);
 	dreplsrv_schedule_pull_replication(service, mem_ctx);
 	talloc_free(mem_ctx);
@@ -106,9 +113,6 @@ static void dreplsrv_periodic_run(struct dreplsrv_service *service)
 	DEBUG(2,("dreplsrv_periodic_run(): run pending_ops memory=%u\n", 
 		 (unsigned)talloc_total_blocks(service)));
 
-	/* the KCC might have changed repsFrom */
-	dreplsrv_refresh_partitions(service);
-
 	dreplsrv_ridalloc_check_rid_pool(service);
 
 	dreplsrv_run_pending_ops(service);
diff --git a/source4/dsdb/repl/drepl_service.c b/source4/dsdb/repl/drepl_service.c
index 652c16f..d118c45 100644
--- a/source4/dsdb/repl/drepl_service.c
+++ b/source4/dsdb/repl/drepl_service.c
@@ -31,6 +31,7 @@
 #include "librpc/gen_ndr/ndr_misc.h"
 #include "librpc/gen_ndr/ndr_drsuapi.h"
 #include "librpc/gen_ndr/ndr_drsblobs.h"
+#include "librpc/gen_ndr/ndr_irpc.h"
 #include "param/param.h"
 
 static WERROR dreplsrv_init_creds(struct dreplsrv_service *service)
@@ -127,6 +128,24 @@ static NTSTATUS drepl_replica_sync(struct irpc_message *msg,
 	return NT_STATUS_OK;
 }
 
+/**
+ * Called when drplsrv should refresh its state.
+ * For example, when KCC change topology, dreplsrv
+ * should update its cache
+ *
+ * @param partition_dn If not empty/NULL, partition to update
+ */
+static NTSTATUS dreplsrv_refresh(struct irpc_message *msg,
+				 struct dreplsrv_refresh *r)
+{
+	struct dreplsrv_service *s = talloc_get_type(msg->private_data,
+						     struct dreplsrv_service);
+
+	r->out.werr = dreplsrv_refresh_partitions(s);
+
+	return NT_STATUS_OK;
+}
+
 /*
   startup the dsdb replicator service task
 */
@@ -214,6 +233,7 @@ static void dreplsrv_task_init(struct task_server *task)
 
 	irpc_add_name(task->msg_ctx, "dreplsrv");
 
+	IRPC_REGISTER(task->msg_ctx, irpc, DREPLSRV_REFRESH, dreplsrv_refresh, service);
 	IRPC_REGISTER(task->msg_ctx, drsuapi, DRSUAPI_DSREPLICASYNC, drepl_replica_sync, service);
 	messaging_register(task->msg_ctx, service, MSG_DREPL_ALLOCATE_RID, dreplsrv_allocate_rid);
 }
diff --git a/source4/librpc/idl/irpc.idl b/source4/librpc/idl/irpc.idl
index 03a9316..220cecf 100644
--- a/source4/librpc/idl/irpc.idl
+++ b/source4/librpc/idl/irpc.idl
@@ -148,4 +148,15 @@ import "misc.idl", "security.idl", "nbt.idl";
 		[in] astring reason
 		);
 
+	/******************************************************
+         management calls for the drepl server
+	******************************************************/
+	/**
+	 * Force dreplsrv to fefresh internal cache.
+	 * @param partition_dn Partition to refresh cacheh for.
+	 *                     If empy/NULL, refresh all partitions.
+	 */
+	void dreplsrv_refresh(
+		[out] WERROR werr
+		);
 }


-- 
Samba Shared Repository


More information about the samba-cvs mailing list