[SCM] Samba Shared Repository - branch master updated

Stefan Metzmacher metze at samba.org
Fri Jul 9 02:30:17 MDT 2010


The branch, master has been updated
       via  9e92899... s4:selftest: run RPC-SAMR-LARGE-DC against the vampire_dc to test the rid alloc code
       via  de632de... selftest/Samba4: set dreplsrv:periodic_startup_interval = 0
       via  538bb9b... s4:dsdb/repl: expose drsuapi_DsExtendedError to the caller (e.g. the ridalloc client)
       via  49deed5... s4:drepl_out_helpers: don't return NT_STATUS_OK, if an extended operation doesn't return success
       via  658a0f9... s4:drepl_ridalloc: only ask the rid master for a new rid pool if we need to.
       via  afba620... s4:dsdb:ridalloc: use ridalloc_ridset_values infrastructure in ridalloc_allocate_rid_pool_fsmo()
       via  cd8d8df... s4:dsdb:ridalloc: use ridalloc_ridset_values infrastructure in ridalloc_allocate_rid()
       via  3b8c927... s4:dsdb:ridalloc: use ridalloc_ridset_values infrastructure in ridalloc_create_rid_set_ntds()
       via  12d26d5... s4:dsdb:ridalloc: add ridalloc_ridset_values infrastructure
       via  bbed1fd... s4:dsdb:ridalloc: use dsdb_module_constrainted_update_uint64() to update rIDAvailablePool
       via  ad17333... s4:dsdb:ridalloc.c: fix C++ warning
       via  217177a... s4:dsdb: add dsdb_module_constrainted_update_uint32/64() wrapper functions
       via  65ca5a3... s4:dsdb: add dsdb_msg_constrainted_update_uint32/64() wrapper functions
       via  1d6f321... s4:dsdb: add dsdb_module_constrainted_update_int32/64() functions
       via  388e955... s4:dsdb: add dsdb_msg_constrainted_update_int32/64() functions
      from  514c596... ldb:common/ldb_dn.c - "ldb_dn_get_parent" - no need to manipulate the real DN

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


- Log -----------------------------------------------------------------
commit 9e928995f0289fcf56bfa60a7541a829e2d67a38
Author: Stefan Metzmacher <metze at samba.org>
Date:   Fri Jul 9 09:24:30 2010 +0200

    s4:selftest: run RPC-SAMR-LARGE-DC against the vampire_dc to test the rid alloc code
    
    metze

commit de632de6ef10cba5fd2591f1d01ab447dae595c8
Author: Stefan Metzmacher <metze at samba.org>
Date:   Fri Jul 9 09:23:04 2010 +0200

    selftest/Samba4: set dreplsrv:periodic_startup_interval = 0
    
    metze

commit 538bb9b3ec2d3250bb97fe6f6f01e6917399fd01
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Jul 8 16:20:11 2010 +0200

    s4:dsdb/repl: expose drsuapi_DsExtendedError to the caller (e.g. the ridalloc client)
    
    metze

commit 49deed5a77af0a774cf186c2332416fbf6bba05b
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Jul 8 16:18:21 2010 +0200

    s4:drepl_out_helpers: don't return NT_STATUS_OK, if an extended operation doesn't return success
    
    metze

commit 658a0f9ef84aa16c270d715283f38b9bb9e683c1
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Jul 8 15:38:16 2010 +0200

    s4:drepl_ridalloc: only ask the rid master for a new rid pool if we need to.
    
    if we are at least half-exhausted then ask for a new pool.
    
    This fixes a bug where we're sending unintialized alloc_pool
    variable as exop->fsmo_info to the rid master and get back
    DRSUAPI_EXOP_ERR_PARAM_ERROR.
    
    metze

commit afba6204a31908396f4bebb7b5885e48670bda73
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Jul 8 15:14:59 2010 +0200

    s4:dsdb:ridalloc: use ridalloc_ridset_values infrastructure in ridalloc_allocate_rid_pool_fsmo()
    
    metze

commit cd8d8dfe1445879d91d922abef83dbea8f1eed26
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Jul 8 21:38:28 2010 +0200

    s4:dsdb:ridalloc: use ridalloc_ridset_values infrastructure in ridalloc_allocate_rid()
    
    metze

commit 3b8c9276dcfa349013450c18d09bfd1b78e6224e
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Jul 8 15:10:07 2010 +0200

    s4:dsdb:ridalloc: use ridalloc_ridset_values infrastructure in ridalloc_create_rid_set_ntds()
    
    metze

commit 12d26d59bddaa7d3469b4e9ecab4146a9ea67180
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Jul 8 12:32:33 2010 +0200

    s4:dsdb:ridalloc: add ridalloc_ridset_values infrastructure
    
    metze

commit bbed1fdfcdcc0d270bb861bf06b509a1655a13a2
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Jul 8 12:34:15 2010 +0200

    s4:dsdb:ridalloc: use dsdb_module_constrainted_update_uint64() to update rIDAvailablePool
    
    metze

commit ad173331148a9fdd793cc5fa4776bdfd53bb4727
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Jul 8 12:06:39 2010 +0200

    s4:dsdb:ridalloc.c: fix C++ warning
    
    metze

commit 217177a4df55439cec1d2563ab1af8fbdfe4a991
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Jul 8 12:02:42 2010 +0200

    s4:dsdb: add dsdb_module_constrainted_update_uint32/64() wrapper functions
    
    metze

commit 65ca5a3542cb1ccb07da0831c61c043f4632ffa8
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Jul 8 12:01:44 2010 +0200

    s4:dsdb: add dsdb_msg_constrainted_update_uint32/64() wrapper functions
    
    metze

commit 1d6f321a918699906cabbe3ee2970bd0a635180b
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Jul 8 11:32:59 2010 +0200

    s4:dsdb: add dsdb_module_constrainted_update_int32/64() functions
    
    metze

commit 388e955f28a578e5421182c0aa3afe9da27a6c34
Author: Stefan Metzmacher <metze at samba.org>
Date:   Thu Jul 8 11:32:26 2010 +0200

    s4:dsdb: add dsdb_msg_constrainted_update_int32/64() functions
    
    metze

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

Summary of changes:
 selftest/target/Samba4.pm                 |    1 +
 source4/dsdb/repl/drepl_out_helpers.c     |   17 +-
 source4/dsdb/repl/drepl_out_pull.c        |    4 +-
 source4/dsdb/repl/drepl_ridalloc.c        |   55 +++-
 source4/dsdb/repl/drepl_service.h         |    5 +-
 source4/dsdb/samdb/ldb_modules/ridalloc.c |  435 +++++++++++++++++------------
 source4/dsdb/samdb/ldb_modules/util.c     |  198 +++++++++++++
 source4/selftest/tests.sh                 |    5 +
 8 files changed, 528 insertions(+), 192 deletions(-)


Changeset truncated at 500 lines:

diff --git a/selftest/target/Samba4.pm b/selftest/target/Samba4.pm
index b574623..f0da581 100644
--- a/selftest/target/Samba4.pm
+++ b/selftest/target/Samba4.pm
@@ -589,6 +589,7 @@ sub provision_raw_step1($$)
         dns update command = $ENV{SRCDIR_ABS}/scripting/bin/samba_dnsupdate --all-interfaces --use-file=$ctx->{dns_host_file}
         spn update command = $ENV{SRCDIR_ABS}/scripting/bin/samba_spnupdate
         resolv:host file = $ctx->{dns_host_file}
+	dreplsrv:periodic_startup_interval = 0
 ";
 
 	if (defined($ctx->{sid_generator}) && $ctx->{sid_generator} ne "internal") {
diff --git a/source4/dsdb/repl/drepl_out_helpers.c b/source4/dsdb/repl/drepl_out_helpers.c
index 56e1257..2411052 100644
--- a/source4/dsdb/repl/drepl_out_helpers.c
+++ b/source4/dsdb/repl/drepl_out_helpers.c
@@ -365,7 +365,7 @@ static void dreplsrv_op_pull_source_get_changes_done(struct tevent_req *subreq)
 	uint32_t ctr_level = 0;
 	struct drsuapi_DsGetNCChangesCtr1 *ctr1 = NULL;
 	struct drsuapi_DsGetNCChangesCtr6 *ctr6 = NULL;
-
+	enum drsuapi_DsExtendedError extended_ret;
 	state->ndr_struct_ptr = NULL;
 
 	status = dcerpc_drsuapi_DsGetNCChanges_r_recv(subreq, r);
@@ -420,6 +420,21 @@ static void dreplsrv_op_pull_source_get_changes_done(struct tevent_req *subreq)
 			tevent_req_nterror(req, status);
 			return;
 		}
+		extended_ret = ctr6->extended_ret;
+	}
+
+	if (ctr_level == 1) {
+		extended_ret = ctr1->extended_ret;
+	}
+
+	if (state->op->extended_op != DRSUAPI_EXOP_NONE) {
+		state->op->extended_ret = extended_ret;
+
+		if (extended_ret != DRSUAPI_EXOP_ERR_SUCCESS) {
+			status = NT_STATUS_UNSUCCESSFUL;
+			tevent_req_nterror(req, status);
+			return;
+		}
 	}
 
 	dreplsrv_op_pull_source_apply_changes_trigger(req, r, ctr_level, ctr1, ctr6);
diff --git a/source4/dsdb/repl/drepl_out_pull.c b/source4/dsdb/repl/drepl_out_pull.c
index c82b48d..e9b57a1 100644
--- a/source4/dsdb/repl/drepl_out_pull.c
+++ b/source4/dsdb/repl/drepl_out_pull.c
@@ -154,13 +154,13 @@ static void dreplsrv_pending_op_callback(struct tevent_req *subreq)
 
 	DEBUG(1,("dreplsrv_op_pull_source(%s/%s) for %s failures[%u]\n",
 		 win_errstr(rf->result_last_attempt),
-		 win_errstr(rf->result_last_attempt),
+		 nt_errstr(werror_to_ntstatus(rf->result_last_attempt)),
 		 ldb_dn_get_linearized(op->source_dsa->partition->dn),
 		 rf->consecutive_sync_failures));
 
 done:
 	if (op->callback) {
-		op->callback(s, rf->result_last_attempt);
+		op->callback(s, rf->result_last_attempt, op->extended_ret);
 	}
 	talloc_free(op);
 	s->ops.current = NULL;
diff --git a/source4/dsdb/repl/drepl_ridalloc.c b/source4/dsdb/repl/drepl_ridalloc.c
index 7b225d5..eaff581 100644
--- a/source4/dsdb/repl/drepl_ridalloc.c
+++ b/source4/dsdb/repl/drepl_ridalloc.c
@@ -100,11 +100,13 @@ static WERROR drepl_create_rid_manager_source_dsa(struct dreplsrv_service *servi
 /*
   called when a rid allocation request has completed
  */
-static void drepl_new_rid_pool_callback(struct dreplsrv_service *service, WERROR werr)
+static void drepl_new_rid_pool_callback(struct dreplsrv_service *service,
+					WERROR werr,
+					enum drsuapi_DsExtendedError ext_err)
 {
 	if (!W_ERROR_IS_OK(werr)) {
-		DEBUG(0,(__location__ ": RID Manager failed RID allocation - %s\n",
-			 win_errstr(werr)));
+		DEBUG(0,(__location__ ": RID Manager failed RID allocation - %s - extended_ret[0x%X]\n",
+			 win_errstr(werr), ext_err));
 	} else {
 		DEBUG(3,(__location__ ": RID Manager completed RID allocation OK\n"));
 	}
@@ -145,15 +147,28 @@ static WERROR drepl_request_new_rid_pool(struct dreplsrv_service *service,
 /*
   see if we are on the last pool we have
  */
-static int drepl_ridalloc_pool_exhausted(struct ldb_context *ldb, bool *exhausted, uint64_t *alloc_pool)
+static int drepl_ridalloc_pool_exhausted(struct ldb_context *ldb,
+					 bool *exhausted,
+					 uint64_t *_alloc_pool)
 {
 	struct ldb_dn *server_dn, *machine_dn, *rid_set_dn;
 	TALLOC_CTX *tmp_ctx = talloc_new(ldb);
-	uint64_t prev_alloc_pool;
-	const char *attrs[] = { "rIDPreviousAllocationPool", "rIDAllocationPool", NULL };
+	uint64_t alloc_pool;
+	uint64_t prev_pool;
+	uint32_t prev_pool_lo, prev_pool_hi;
+	uint32_t next_rid;
+	static const char * const attrs[] = {
+		"rIDAllocationPool",
+		"rIDPreviousAllocationPool",
+		"rIDNextRid",
+		NULL
+	};
 	int ret;
 	struct ldb_result *res;
 
+	*exhausted = false;
+	*_alloc_pool = UINT64_MAX;
+
 	server_dn = ldb_dn_get_parent(tmp_ctx, samdb_ntds_settings_dn(ldb));
 	if (!server_dn) {
 		talloc_free(tmp_ctx);
@@ -171,6 +186,7 @@ static int drepl_ridalloc_pool_exhausted(struct ldb_context *ldb, bool *exhauste
 	ret = samdb_reference_dn(ldb, tmp_ctx, machine_dn, "rIDSetReferences", &rid_set_dn);
 	if (ret == LDB_ERR_NO_SUCH_ATTRIBUTE) {
 		*exhausted = true;
+		*_alloc_pool = 0;
 		talloc_free(tmp_ctx);
 		return LDB_SUCCESS;
 	}
@@ -189,15 +205,24 @@ static int drepl_ridalloc_pool_exhausted(struct ldb_context *ldb, bool *exhauste
 		return ret;
 	}
 
-	*alloc_pool = ldb_msg_find_attr_as_uint64(res->msgs[0], "rIDAllocationPool", 0);
-	prev_alloc_pool = ldb_msg_find_attr_as_uint64(res->msgs[0], "rIDPreviousAllocationPool", 0);
+	alloc_pool = ldb_msg_find_attr_as_uint64(res->msgs[0], "rIDAllocationPool", 0);
+	prev_pool = ldb_msg_find_attr_as_uint64(res->msgs[0], "rIDPreviousAllocationPool", 0);
+	prev_pool_lo = prev_pool & 0xFFFFFFFF;
+	prev_pool_hi = prev_pool >> 32;
+	next_rid = ldb_msg_find_attr_as_uint(res->msgs[0], "rIDNextRid", 0);
 
-	if (*alloc_pool != prev_alloc_pool) {
-		*exhausted = false;
-	} else {
-		*exhausted = true;
+	if (alloc_pool != prev_pool) {
+		talloc_free(tmp_ctx);
+		return LDB_SUCCESS;
+	}
+
+	if (next_rid < (prev_pool_hi + prev_pool_lo)/2) {
+		talloc_free(tmp_ctx);
+		return LDB_SUCCESS;
 	}
 
+	*exhausted = true;
+	*_alloc_pool = alloc_pool;
 	talloc_free(tmp_ctx);
 	return LDB_SUCCESS;
 }
@@ -265,6 +290,12 @@ WERROR dreplsrv_ridalloc_check_rid_pool(struct dreplsrv_service *service)
 		return WERR_DS_DRA_INTERNAL_ERROR;
 	}
 
+	if (!exhausted) {
+		/* don't need a new pool */
+		talloc_free(tmp_ctx);
+		return WERR_OK;
+	}
+
 	DEBUG(2,(__location__ ": Requesting more RIDs from RID Manager\n"));
 
 	werr = drepl_request_new_rid_pool(service, rid_manager_dn, fsmo_role_dn, alloc_pool);
diff --git a/source4/dsdb/repl/drepl_service.h b/source4/dsdb/repl/drepl_service.h
index 88be769..eefd4da 100644
--- a/source4/dsdb/repl/drepl_service.h
+++ b/source4/dsdb/repl/drepl_service.h
@@ -101,7 +101,9 @@ struct dreplsrv_partition {
 	struct dreplsrv_partition_source_dsa *sources;
 };
 
-typedef void (*dreplsrv_fsmo_callback_t)(struct dreplsrv_service *, WERROR );
+typedef void (*dreplsrv_fsmo_callback_t)(struct dreplsrv_service *,
+					 WERROR,
+					 enum drsuapi_DsExtendedError);
 
 struct dreplsrv_out_operation {
 	struct dreplsrv_out_operation *prev, *next;
@@ -113,6 +115,7 @@ struct dreplsrv_out_operation {
 	enum drsuapi_DsExtendedOperation extended_op;
 	uint64_t fsmo_info;
 	dreplsrv_fsmo_callback_t callback;
+	enum drsuapi_DsExtendedError extended_ret;
 };
 
 struct dreplsrv_notify_operation {
diff --git a/source4/dsdb/samdb/ldb_modules/ridalloc.c b/source4/dsdb/samdb/ldb_modules/ridalloc.c
index 91d48ba..2b0c4b9 100644
--- a/source4/dsdb/samdb/ldb_modules/ridalloc.c
+++ b/source4/dsdb/samdb/ldb_modules/ridalloc.c
@@ -68,7 +68,8 @@ static void ridalloc_poke_rid_manager(struct ldb_module *module)
 	struct messaging_context *msg;
 	struct server_id *server;
 	struct ldb_context *ldb = ldb_module_get_ctx(module);
-	struct loadparm_context *lp_ctx = ldb_get_opaque(ldb, "loadparm");
+	struct loadparm_context *lp_ctx =
+		(struct loadparm_context *)ldb_get_opaque(ldb, "loadparm");
 	TALLOC_CTX *tmp_ctx = talloc_new(module);
 
 	msg = messaging_client_init(tmp_ctx, lp_messaging_path(tmp_ctx, lp_ctx),
@@ -93,6 +94,89 @@ static void ridalloc_poke_rid_manager(struct ldb_module *module)
 }
 
 
+static const char * const ridalloc_ridset_attrs[] = {
+	"rIDAllocationPool",
+	"rIDPreviousAllocationPool",
+	"rIDNextRID",
+	"rIDUsedPool",
+	NULL
+};
+
+struct ridalloc_ridset_values {
+	uint64_t alloc_pool;
+	uint64_t prev_pool;
+	uint32_t next_rid;
+	uint32_t used_pool;
+};
+
+static void ridalloc_get_ridset_values(struct ldb_message *msg, struct ridalloc_ridset_values *v)
+{
+	v->alloc_pool = ldb_msg_find_attr_as_uint64(msg, "rIDAllocationPool", UINT64_MAX);
+	v->prev_pool = ldb_msg_find_attr_as_uint64(msg, "rIDPreviousAllocationPool", UINT64_MAX);
+	v->next_rid = ldb_msg_find_attr_as_uint(msg, "rIDNextRID", UINT32_MAX);
+	v->used_pool = ldb_msg_find_attr_as_uint(msg, "rIDUsedPool", UINT32_MAX);
+}
+
+static int ridalloc_set_ridset_values(struct ldb_module *module,
+				      struct ldb_message *msg,
+				      const struct ridalloc_ridset_values *o,
+				      const struct ridalloc_ridset_values *n)
+{
+	const uint32_t *o32, *n32;
+	const uint64_t *o64, *n64;
+	int ret;
+
+#define SETUP_PTRS(field, optr, nptr, max) do { \
+	optr = &o->field; \
+	nptr = &n->field; \
+	if (o->field == max) { \
+		optr = NULL; \
+	} \
+	if (n->field == max) { \
+		nptr = NULL; \
+	} \
+	if (o->field == n->field) { \
+		optr = NULL; \
+		nptr = NULL; \
+	} \
+} while(0)
+
+	SETUP_PTRS(alloc_pool, o64, n64, UINT64_MAX);
+	ret = dsdb_msg_constrainted_update_uint64(module, msg,
+						  "rIDAllocationPool",
+						  o64, n64);
+	if (ret != LDB_SUCCESS) {
+		return ret;
+	}
+
+	SETUP_PTRS(prev_pool, o64, n64, UINT64_MAX);
+	ret = dsdb_msg_constrainted_update_uint64(module, msg,
+						  "rIDPreviousAllocationPool",
+						  o64, n64);
+	if (ret != LDB_SUCCESS) {
+		return ret;
+	}
+
+	SETUP_PTRS(next_rid, o32, n32, UINT32_MAX);
+	ret = dsdb_msg_constrainted_update_uint32(module, msg,
+						  "rIDNextRID",
+						  o32, n32);
+	if (ret != LDB_SUCCESS) {
+		return ret;
+	}
+
+	SETUP_PTRS(used_pool, o32, n32, UINT32_MAX);
+	ret = dsdb_msg_constrainted_update_uint32(module, msg,
+						  "rIDUsedPool",
+						  o32, n32);
+	if (ret != LDB_SUCCESS) {
+		return ret;
+	}
+#undef SETUP_PTRS
+
+	return LDB_SUCCESS;
+}
+
 /*
   allocate a new range of RIDs in the RID Manager object
  */
@@ -138,8 +222,8 @@ static int ridalloc_rid_manager_allocate(struct ldb_module *module, struct ldb_d
 	/* and new rIDAvailablePool value */
 	new_rid_pool = rid_pool_lo | (((uint64_t)rid_pool_hi)<<32);
 
-	ret = dsdb_module_constrainted_update_integer(module, rid_manager_dn, "rIDAvailablePool",
-						      rid_pool, new_rid_pool);
+	ret = dsdb_module_constrainted_update_uint64(module, rid_manager_dn, "rIDAvailablePool",
+						     &rid_pool, &new_rid_pool);
 	if (ret != LDB_SUCCESS) {
 		ldb_asprintf_errstring(ldb, "Failed to update rIDAvailablePool - %s",
 				       ldb_errstring(ldb));
@@ -162,9 +246,20 @@ static int ridalloc_create_rid_set_ntds(struct ldb_module *module, TALLOC_CTX *m
 	TALLOC_CTX *tmp_ctx = talloc_new(mem_ctx);
 	struct ldb_dn *server_dn, *machine_dn, *rid_set_dn;
 	int ret;
-	uint64_t dc_pool;
 	struct ldb_message *msg;
 	struct ldb_context *ldb = ldb_module_get_ctx(module);
+	static const struct ridalloc_ridset_values o = {
+		.alloc_pool	= UINT64_MAX,
+		.prev_pool	= UINT64_MAX,
+		.next_rid	= UINT32_MAX,
+		.used_pool	= UINT32_MAX,
+	};
+	struct ridalloc_ridset_values n = {
+		.alloc_pool	= 0,
+		.prev_pool	= 0,
+		.next_rid	= 0,
+		.used_pool	= 0,
+	};
 
 	/*
 	  steps:
@@ -203,7 +298,7 @@ static int ridalloc_create_rid_set_ntds(struct ldb_module *module, TALLOC_CTX *m
 	}
 
 	/* grab a pool from the RID Manager object */
-	ret = ridalloc_rid_manager_allocate(module, rid_manager_dn, &dc_pool);
+	ret = ridalloc_rid_manager_allocate(module, rid_manager_dn, &n.alloc_pool);
 	if (ret != LDB_SUCCESS) {
 		talloc_free(tmp_ctx);
 		return ret;
@@ -218,24 +313,8 @@ static int ridalloc_create_rid_set_ntds(struct ldb_module *module, TALLOC_CTX *m
 		talloc_free(tmp_ctx);
 		return ret;
 	}
-	ret = ldb_msg_add_fmt(msg, "rIDAllocationPool", "%llu", (unsigned long long)dc_pool);
-	if (ret != LDB_SUCCESS) {
-		talloc_free(tmp_ctx);
-		return ret;
-	}
 
-	/* w2k8-r2 sets these to zero when first created */
-	ret = ldb_msg_add_fmt(msg, "rIDPreviousAllocationPool", "0");
-	if (ret != LDB_SUCCESS) {
-		talloc_free(tmp_ctx);
-		return ret;
-	}
-	ret = ldb_msg_add_fmt(msg, "rIDUsedPool", "0");
-	if (ret != LDB_SUCCESS) {
-		talloc_free(tmp_ctx);
-		return ret;
-	}
-	ret = ldb_msg_add_fmt(msg, "rIDNextRID", "0");
+	ret = ridalloc_set_ridset_values(module, msg, &o, &n);
 	if (ret != LDB_SUCCESS) {
 		talloc_free(tmp_ctx);
 		return ret;
@@ -322,65 +401,10 @@ static int ridalloc_create_own_rid_set(struct ldb_module *module, TALLOC_CTX *me
 }
 
 /*
-  refresh a RID Set object for the specified DC
-  also returns the first RID for the new pool
- */
-static int ridalloc_refresh_rid_set_ntds(struct ldb_module *module,
-					 struct ldb_dn *rid_manager_dn,
-					 struct ldb_dn *ntds_dn, uint64_t *new_pool)
-{
-	TALLOC_CTX *tmp_ctx = talloc_new(module);
-	struct ldb_dn *server_dn, *machine_dn, *rid_set_dn;
-	struct ldb_context *ldb = ldb_module_get_ctx(module);
-	int ret;
-
-	/* grab a pool from the RID Manager object */
-	ret = ridalloc_rid_manager_allocate(module, rid_manager_dn, new_pool);
-	if (ret != LDB_SUCCESS) {
-		talloc_free(tmp_ctx);
-		return ret;
-	}
-
-	server_dn = ldb_dn_get_parent(tmp_ctx, ntds_dn);
-	if (!server_dn) {
-		talloc_free(tmp_ctx);
-		return ldb_module_oom(module);
-	}
-
-	ret = dsdb_module_reference_dn(module, tmp_ctx, server_dn, "serverReference", &machine_dn);
-	if (ret != LDB_SUCCESS) {
-		ldb_asprintf_errstring(ldb, "Failed to find serverReference in %s - %s",
-				       ldb_dn_get_linearized(server_dn), ldb_errstring(ldb));
-		talloc_free(tmp_ctx);
-		return ret;
-	}
-
-	ret = dsdb_module_reference_dn(module, tmp_ctx, machine_dn, "rIDSetReferences", &rid_set_dn);
-	if (ret != LDB_SUCCESS) {
-		ldb_asprintf_errstring(ldb, "Failed to find rIDSetReferences in %s - %s",
-				       ldb_dn_get_linearized(machine_dn), ldb_errstring(ldb));
-		talloc_free(tmp_ctx);
-		return ret;
-	}
-
-	ret = dsdb_module_set_integer(module, rid_set_dn, "rIDAllocationPool", *new_pool);
-	if (ret != LDB_SUCCESS) {
-		ldb_asprintf_errstring(ldb, "Failed to modify RID Set object %s - %s",
-				       ldb_dn_get_linearized(rid_set_dn), ldb_errstring(ldb));
-		talloc_free(tmp_ctx);
-		return ret;
-	}
-
-	talloc_free(tmp_ctx);
-	return LDB_SUCCESS;
-}
-
-
-/*
   get a new RID pool for ourselves
   also returns the first rid for the new pool
  */
-static int ridalloc_refresh_own_pool(struct ldb_module *module, uint64_t *new_pool)
+static int ridalloc_new_own_pool(struct ldb_module *module, uint64_t *new_pool)
 {
 	TALLOC_CTX *tmp_ctx = talloc_new(module);
 	struct ldb_dn *rid_manager_dn, *fsmo_role_dn;
@@ -412,7 +436,13 @@ static int ridalloc_refresh_own_pool(struct ldb_module *module, uint64_t *new_po
 		return LDB_ERR_UNWILLING_TO_PERFORM;
 	}
 
-	ret = ridalloc_refresh_rid_set_ntds(module, rid_manager_dn, fsmo_role_dn, new_pool);
+	/* grab a pool from the RID Manager object */
+	ret = ridalloc_rid_manager_allocate(module, rid_manager_dn, new_pool);
+	if (ret != LDB_SUCCESS) {
+		talloc_free(tmp_ctx);
+		return ret;
+	}
+
 	talloc_free(tmp_ctx);
 	return ret;
 }
@@ -425,15 +455,13 @@ static int ridalloc_refresh_own_pool(struct ldb_module *module, uint64_t *new_po
 int ridalloc_allocate_rid(struct ldb_module *module, uint32_t *rid)
 {
 	struct ldb_context *ldb;
-	static const char * const attrs[] = { "rIDAllocationPool", "rIDPreviousAllocationPool",
-					      "rIDNextRID" , "rIDUsedPool", NULL };
 	int ret;
 	struct ldb_dn *rid_set_dn;
 	struct ldb_result *res;
-	uint64_t alloc_pool, prev_alloc_pool;
-	uint32_t prev_alloc_pool_lo, prev_alloc_pool_hi;
-	uint32_t rid_used_pool;
-	int prev_rid;
+	struct ldb_message *msg;
+	struct ridalloc_ridset_values oridset;
+	struct ridalloc_ridset_values nridset;
+	uint32_t prev_pool_lo, prev_pool_hi;
 	TALLOC_CTX *tmp_ctx = talloc_new(module);
 
 	(*rid) = 0;
@@ -451,7 +479,7 @@ int ridalloc_allocate_rid(struct ldb_module *module, uint32_t *rid)
 	}
 
 	ret = dsdb_module_search_dn(module, tmp_ctx, &res, rid_set_dn,
-	                            attrs, DSDB_FLAG_NEXT_MODULE);
+				    ridalloc_ridset_attrs, DSDB_FLAG_NEXT_MODULE);
 	if (ret != LDB_SUCCESS) {
 		ldb_asprintf_errstring(ldb, __location__ ": No RID Set %s",
 				       ldb_dn_get_linearized(rid_set_dn));
@@ -459,107 +487,125 @@ int ridalloc_allocate_rid(struct ldb_module *module, uint32_t *rid)
 		return ret;
 	}
 
-	prev_alloc_pool = ldb_msg_find_attr_as_uint64(res->msgs[0], "rIDPreviousAllocationPool", 0);
-	alloc_pool = ldb_msg_find_attr_as_uint64(res->msgs[0], "rIDAllocationPool", 0);
-	prev_rid = ldb_msg_find_attr_as_int(res->msgs[0], "rIDNextRID", 0);
-	rid_used_pool = ldb_msg_find_attr_as_int(res->msgs[0], "rIDUsedPool", 0);
-	if (alloc_pool == 0) {
+	ridalloc_get_ridset_values(res->msgs[0], &oridset);
+	if (oridset.alloc_pool == UINT64_MAX) {
 		ldb_asprintf_errstring(ldb, __location__ ": Bad RID Set %s",
 				       ldb_dn_get_linearized(rid_set_dn));
 		talloc_free(tmp_ctx);
 		return LDB_ERR_OPERATIONS_ERROR;
 	}
 
-	prev_alloc_pool_lo = prev_alloc_pool & 0xFFFFFFFF;
-	prev_alloc_pool_hi = prev_alloc_pool >> 32;
-	if (prev_rid >= prev_alloc_pool_hi) {
-		if (prev_alloc_pool == 0) {
-			ret = dsdb_module_set_integer(module, rid_set_dn, "rIDPreviousAllocationPool", alloc_pool);


-- 
Samba Shared Repository


More information about the samba-cvs mailing list