}
struct extended_op_data {
- dreplsrv_fsmo_callback_t callback;
+ dreplsrv_extended_callback_t callback;
void *callback_data;
struct dreplsrv_partition_source_dsa *sdsa;
};
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);
talloc_free(sdsa);
talloc_free(data);
}
+
+ dreplsrv_run_pending_ops(service);
+
return werr;
}
} 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)
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;
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;
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;
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
*/
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;
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;
};
} ops;
bool rid_alloc_in_progress;
- bool role_transfer_in_progress;
bool syncall_workaround;
};