s4-drs: Refactored drepl_service and send_ridalloc_request so that the structures...
authorNadezhda Ivanova <nivanova@samba.org>
Tue, 24 Aug 2010 20:01:43 +0000 (23:01 +0300)
committerKamen Mazdrashki <kamenim@samba.org>
Fri, 10 Sep 2010 10:08:16 +0000 (13:08 +0300)
source4/dsdb/repl/drepl_ridalloc.c
source4/dsdb/repl/drepl_service.h

index 6d4b0da04be0b416b9b4ac1bd9bd13355783a100..d5db29b0025afda716e45e45136e2abfc76f5ca6 100644 (file)
@@ -34,8 +34,9 @@
 /*
   create the RID manager source dsa structure
  */
-static WERROR drepl_create_rid_manager_source_dsa(struct dreplsrv_service *service,
-                                                 struct ldb_dn *rid_manager_dn, struct ldb_dn *fsmo_role_dn)
+
+WERROR drepl_create_role_owner_source_dsa(struct dreplsrv_service *service,
+                                         struct ldb_dn *role_owner_dn, struct ldb_dn *fsmo_role_dn)
 {
        struct dreplsrv_partition_source_dsa *sdsa;
        struct ldb_context *ldb = service->samdb;
@@ -52,11 +53,11 @@ static WERROR drepl_create_rid_manager_source_dsa(struct dreplsrv_service *servi
        }
 
        sdsa->partition->dn = ldb_get_default_basedn(ldb);
-       sdsa->partition->nc.dn = ldb_dn_alloc_linearized(sdsa->partition, rid_manager_dn);
-       ret = dsdb_find_guid_by_dn(ldb, rid_manager_dn, &sdsa->partition->nc.guid);
+       sdsa->partition->nc.dn = ldb_dn_alloc_linearized(sdsa->partition, role_owner_dn);
+       ret = dsdb_find_guid_by_dn(ldb, role_owner_dn, &sdsa->partition->nc.guid);
        if (ret != LDB_SUCCESS) {
                DEBUG(0,(__location__ ": Failed to find GUID for %s\n",
-                        ldb_dn_get_linearized(rid_manager_dn)));
+                        ldb_dn_get_linearized(role_owner_dn)));
                talloc_free(sdsa);
                return WERR_DS_DRA_INTERNAL_ERROR;
        }
@@ -88,15 +89,43 @@ static WERROR drepl_create_rid_manager_source_dsa(struct dreplsrv_service *servi
 
        werr = dreplsrv_out_connection_attach(service, sdsa->repsFrom1, &sdsa->conn);
        if (!W_ERROR_IS_OK(werr)) {
-               DEBUG(0,(__location__ ": Failed to attach to RID manager connection\n"));
+               DEBUG(0,(__location__ ": Failed to attach connection to %s\n",
+                        ldb_dn_get_linearized(role_owner_dn)));
                talloc_free(sdsa);
                return werr;
        }
 
-       service->ridalloc.rid_manager_source_dsa = sdsa;
+       service->ncchanges_extended.role_owner_source_dsa = sdsa;
        return WERR_OK;
 }
 
+/*
+  schedule a getncchanges request to the role owner for an extended operation
+ */
+WERROR drepl_request_extended_op(struct dreplsrv_service *service,
+                                struct ldb_dn *role_owner_dn,
+                                struct ldb_dn *fsmo_role_dn,
+                                enum drsuapi_DsExtendedOperation extended_op,
+                                uint64_t alloc_pool,
+                                dreplsrv_fsmo_callback_t callback)
+{
+       WERROR werr;
+
+       if (service->ncchanges_extended.role_owner_source_dsa == NULL) {
+               /* we need to establish a connection to the RID
+                  Manager */
+               werr = drepl_create_role_owner_source_dsa(service, role_owner_dn, fsmo_role_dn);
+               W_ERROR_NOT_OK_RETURN(werr);
+       }
+
+       service->ncchanges_extended.in_progress = true;
+
+       werr = dreplsrv_schedule_partition_pull_source(service, service->ncchanges_extended.role_owner_source_dsa,
+                                                      extended_op, alloc_pool,
+                                                      callback);
+       return werr;
+}
+
 /*
   called when a rid allocation request has completed
  */
@@ -113,10 +142,10 @@ static void drepl_new_rid_pool_callback(struct dreplsrv_service *service,
        }
 
        /* don't keep the connection open to the RID Manager */
-       talloc_free(service->ridalloc.rid_manager_source_dsa);
-       service->ridalloc.rid_manager_source_dsa = NULL;
+       talloc_free(service->ncchanges_extended.role_owner_source_dsa);
+       service->ncchanges_extended.role_owner_source_dsa = NULL;
 
-       service->ridalloc.in_progress = false;
+       service->ncchanges_extended.in_progress = false;
 }
 
 /*
@@ -127,20 +156,12 @@ static WERROR drepl_request_new_rid_pool(struct dreplsrv_service *service,
                                         struct ldb_dn *rid_manager_dn, struct ldb_dn *fsmo_role_dn,
                                         uint64_t alloc_pool)
 {
-       WERROR werr;
-
-       if (service->ridalloc.rid_manager_source_dsa == NULL) {
-               /* we need to establish a connection to the RID
-                  Manager */
-               werr = drepl_create_rid_manager_source_dsa(service, rid_manager_dn, fsmo_role_dn);
-               W_ERROR_NOT_OK_RETURN(werr);
-       }
-
-       service->ridalloc.in_progress = true;
-
-       werr = dreplsrv_schedule_partition_pull_source(service, service->ridalloc.rid_manager_source_dsa,
-                                                      DRSUAPI_EXOP_FSMO_RID_ALLOC, alloc_pool,
-                                                      drepl_new_rid_pool_callback, NULL);
+       WERROR werr = drepl_request_extended_op(service,
+                                               rid_manager_dn,
+                                               fsmo_role_dn,
+                                               DRSUAPI_EXOP_FSMO_RID_ALLOC,
+                                               alloc_pool,
+                                               drepl_new_rid_pool_callback, NULL);
        return werr;
 }
 
@@ -244,7 +265,7 @@ WERROR dreplsrv_ridalloc_check_rid_pool(struct dreplsrv_service *service)
        int ret;
        uint64_t alloc_pool;
 
-       if (service->ridalloc.in_progress) {
+       if (service->ncchanges_extended.in_progress) {
                talloc_free(tmp_ctx);
                return WERR_OK;
        }
index 00fd3bfbd8d1b45916f31bd893b3fadb1ba01108..dba9a37baebca7becfdf7e2e2879824649c4d00b 100644 (file)
@@ -218,8 +218,8 @@ struct dreplsrv_service {
 
        struct {
                bool in_progress;
-               struct dreplsrv_partition_source_dsa *rid_manager_source_dsa;
-       } ridalloc;
+               struct dreplsrv_partition_source_dsa *role_owner_source_dsa;
+       } ncchanges_extended;
 
        bool syncall_workaround;
 };