s4-repl: cleanup the extended op calls in repl server
authorAndrew Tridgell <tridge@samba.org>
Wed, 15 Sep 2010 08:59:17 +0000 (18:59 +1000)
committerAndrew Tridgell <tridge@samba.org>
Wed, 15 Sep 2010 21:24:01 +0000 (07:24 +1000)
- use generic parameter names
- trigger a run of pending ops on all extended ops
- don't prevent parallel fsmo transfers
- moved extended op code into drepl_extended

source4/dsdb/repl/drepl_extended.c
source4/dsdb/repl/drepl_fsmo.c
source4/dsdb/repl/drepl_out_pull.c
source4/dsdb/repl/drepl_service.c
source4/dsdb/repl/drepl_service.h

index 41fe38b93740a765b38ee92c2abd75a9b432d0ad..67dbedbb9adce497450b4723751008f00c80acbf 100644 (file)
@@ -113,7 +113,7 @@ static WERROR drepl_create_extended_source_dsa(struct dreplsrv_service *service,
 }
 
 struct extended_op_data {
-       dreplsrv_fsmo_callback_t callback;
+       dreplsrv_extended_callback_t callback;
        void *callback_data;
        struct dreplsrv_partition_source_dsa *sdsa;
 };
@@ -136,18 +136,18 @@ static void extended_op_callback(struct dreplsrv_service *service,
   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,
+                                struct ldb_dn *nc_dn,
+                                struct ldb_dn *source_dsa_dn,
                                 enum drsuapi_DsExtendedOperation extended_op,
                                 uint64_t fsmo_info,
-                                dreplsrv_fsmo_callback_t callback,
+                                dreplsrv_extended_callback_t callback,
                                 void *callback_data)
 {
        WERROR werr;
        struct extended_op_data *data;
        struct dreplsrv_partition_source_dsa *sdsa;
 
-       werr = drepl_create_extended_source_dsa(service, role_owner_dn, fsmo_role_dn, &sdsa);
+       werr = drepl_create_extended_source_dsa(service, nc_dn, source_dsa_dn, &sdsa);
        W_ERROR_NOT_OK_RETURN(werr);
 
        data = talloc(service, struct extended_op_data);
@@ -164,5 +164,8 @@ WERROR drepl_request_extended_op(struct dreplsrv_service *service,
                talloc_free(sdsa);
                talloc_free(data);
        }
+
+       dreplsrv_run_pending_ops(service);
+
        return werr;
 }
index 63b831669a9c02779623f842b9fe6c2acfbaafb2..dc7fe27b01ba9afb653dc34a2f3c056dcf4aa4a4 100644 (file)
@@ -43,7 +43,6 @@ static void drepl_role_callback(struct dreplsrv_service *service,
        } else {
                DEBUG(0,(__location__ ": Successful role transfer\n"));
        }
-       service->role_transfer_in_progress = false;
 }
 
 static bool fsmo_master_cmp(struct ldb_dn *ntds_dn, struct ldb_dn *role_owner_dn)
@@ -69,12 +68,6 @@ WERROR dreplsrv_fsmo_role_check(struct dreplsrv_service *service,
        enum drsuapi_DsExtendedOperation extended_op = DRSUAPI_EXOP_NONE;
        WERROR werr;
 
-       if (service->role_transfer_in_progress) {
-               talloc_free(tmp_ctx);
-               /* should we allow these in parallel? */
-               return WERR_DS_DRA_REPL_PENDING;
-       }
-
        ntds_dn = samdb_ntds_settings_dn(ldb);
        if (!ntds_dn) {
                return WERR_DS_DRA_INTERNAL_ERROR;
index 21f986ad7b41e5d178866a36a2f658b17c040cdb..c13dadc98646775f3101435a0dc7996a4271950b 100644 (file)
@@ -38,7 +38,7 @@ WERROR dreplsrv_schedule_partition_pull_source(struct dreplsrv_service *s,
                                               struct dreplsrv_partition_source_dsa *source,
                                               enum drsuapi_DsExtendedOperation extended_op,
                                               uint64_t fsmo_info,
-                                              dreplsrv_fsmo_callback_t callback,
+                                              dreplsrv_extended_callback_t callback,
                                               void *cb_data)
 {
        struct dreplsrv_out_operation *op;
index 9a353b0c1fc0254b84958ab86c5771a69fd80410..ae765a597998c5cd518df0955d0154368ce1d04a 100644 (file)
@@ -170,7 +170,7 @@ static WERROR _drepl_schedule_replication(struct dreplsrv_service *service,
                                          TALLOC_CTX *mem_ctx)
 {
        WERROR werr;
-       dreplsrv_fsmo_callback_t fn_callback = NULL;
+       dreplsrv_extended_callback_t fn_callback = NULL;
 
        if (data) {
                fn_callback = _drepl_replica_sync_done_cb;
@@ -358,12 +358,19 @@ static NTSTATUS drepl_take_FSMO_role(struct irpc_message *msg,
 static NTSTATUS drepl_trigger_repl_secret(struct irpc_message *msg,
                                          struct drepl_trigger_repl_secret *r)
 {
+       struct dreplsrv_service *service = talloc_get_type(msg->private_data,
+                                                          struct dreplsrv_service);
+
+
+       drepl_repl_secret(service, r->in.user_dn);
+
        /* we are not going to be sending a reply to this request */
        msg->no_reply = true;
-       DEBUG(0,(__location__ ": got drepl_trigger_repl_secret with %s\n", r->in.user_dn));
+
        return NT_STATUS_OK;
 }
 
+
 /*
   startup the dsdb replicator service task
 */
index fac555c2e3e4fe69e51f9c6717405d96d3e759bf..d0b523f25b40b6becee2b0ff9f983d88d67eafc4 100644 (file)
@@ -103,10 +103,10 @@ struct dreplsrv_partition {
        bool incoming_only;
 };
 
-typedef void (*dreplsrv_fsmo_callback_t)(struct dreplsrv_service *,
-                                        WERROR,
-                                        enum drsuapi_DsExtendedError,
-                                        void *cb_data);
+typedef void (*dreplsrv_extended_callback_t)(struct dreplsrv_service *,
+                                            WERROR,
+                                            enum drsuapi_DsExtendedError,
+                                            void *cb_data);
 
 struct dreplsrv_out_operation {
        struct dreplsrv_out_operation *prev, *next;
@@ -118,7 +118,7 @@ struct dreplsrv_out_operation {
        enum drsuapi_DsExtendedOperation extended_op;
        uint64_t fsmo_info;
        enum drsuapi_DsExtendedError extended_ret;
-       dreplsrv_fsmo_callback_t callback;
+       dreplsrv_extended_callback_t callback;
        void *cb_data;
 };
 
@@ -217,7 +217,6 @@ struct dreplsrv_service {
        } ops;
 
        bool rid_alloc_in_progress;
-       bool role_transfer_in_progress;
 
        bool syncall_workaround;
 };