mirror of
https://github.com/samba-team/samba.git
synced 2024-12-22 13:34:15 +03:00
dsdb-drepl: create a new schedulable event for running pending operations
So instead of running dreplsrv_periodic_schedule when receiving a DRS_REPLICA_SYNC request which will force the DC to look for changes with all the DC it usually replicate to, we reduce it to the DC specified in the DRS_REPLICA_SYNC request. It will allow also to do have the correct options as set by the client who send the DRS_REPLICA_SYNC. Signed-off-by: Matthieu Patou <mat@matws.net> Reviewed-by: Stefan Metzmacher <metze@samba.org>
This commit is contained in:
parent
8c3fa009ca
commit
54f4536980
@ -133,3 +133,64 @@ void dreplsrv_run_pending_ops(struct dreplsrv_service *s)
|
|||||||
dreplsrv_notify_run_ops(s);
|
dreplsrv_notify_run_ops(s);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void dreplsrv_pending_run(struct dreplsrv_service *service);
|
||||||
|
|
||||||
|
static void dreplsrv_pending_handler_te(struct tevent_context *ev, struct tevent_timer *te,
|
||||||
|
struct timeval t, void *ptr)
|
||||||
|
{
|
||||||
|
struct dreplsrv_service *service = talloc_get_type(ptr, struct dreplsrv_service);
|
||||||
|
|
||||||
|
service->pending.te = NULL;
|
||||||
|
|
||||||
|
dreplsrv_pending_run(service);
|
||||||
|
}
|
||||||
|
|
||||||
|
WERROR dreplsrv_pendingops_schedule(struct dreplsrv_service *service, uint32_t next_interval)
|
||||||
|
{
|
||||||
|
TALLOC_CTX *tmp_mem;
|
||||||
|
struct tevent_timer *new_te;
|
||||||
|
struct timeval next_time;
|
||||||
|
|
||||||
|
/* prevent looping */
|
||||||
|
if (next_interval == 0) {
|
||||||
|
next_interval = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
next_time = timeval_current_ofs(next_interval, 50);
|
||||||
|
|
||||||
|
if (service->pending.te) {
|
||||||
|
/*
|
||||||
|
* if the timestamp of the new event is higher,
|
||||||
|
* as current next we don't need to reschedule
|
||||||
|
*/
|
||||||
|
if (timeval_compare(&next_time, &service->pending.next_event) > 0) {
|
||||||
|
return WERR_OK;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* reset the next scheduled timestamp */
|
||||||
|
service->pending.next_event = next_time;
|
||||||
|
|
||||||
|
new_te = tevent_add_timer(service->task->event_ctx, service,
|
||||||
|
service->pending.next_event,
|
||||||
|
dreplsrv_pending_handler_te, service);
|
||||||
|
W_ERROR_HAVE_NO_MEMORY(new_te);
|
||||||
|
|
||||||
|
tmp_mem = talloc_new(service);
|
||||||
|
DEBUG(4,("dreplsrv_pending_schedule(%u) %sscheduled for: %s\n",
|
||||||
|
next_interval,
|
||||||
|
(service->pending.te?"re":""),
|
||||||
|
nt_time_string(tmp_mem, timeval_to_nttime(&next_time))));
|
||||||
|
talloc_free(tmp_mem);
|
||||||
|
|
||||||
|
talloc_free(service->pending.te);
|
||||||
|
service->pending.te = new_te;
|
||||||
|
|
||||||
|
return WERR_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void dreplsrv_pending_run(struct dreplsrv_service *service)
|
||||||
|
{
|
||||||
|
dreplsrv_run_pending_ops(service);
|
||||||
|
}
|
||||||
|
@ -338,7 +338,7 @@ static NTSTATUS drepl_replica_sync(struct irpc_message *msg,
|
|||||||
* schedule replication event to force
|
* schedule replication event to force
|
||||||
* replication as soon as possible
|
* replication as soon as possible
|
||||||
*/
|
*/
|
||||||
dreplsrv_periodic_schedule(service, 0);
|
dreplsrv_pendingops_schedule(service, 0);
|
||||||
|
|
||||||
done:
|
done:
|
||||||
return NT_STATUS_OK;
|
return NT_STATUS_OK;
|
||||||
|
@ -187,6 +187,23 @@ struct dreplsrv_service {
|
|||||||
struct tevent_timer *te;
|
struct tevent_timer *te;
|
||||||
} periodic;
|
} periodic;
|
||||||
|
|
||||||
|
/* some stuff for running only the pendings ops */
|
||||||
|
struct {
|
||||||
|
/*
|
||||||
|
* the interval between notify runs
|
||||||
|
*/
|
||||||
|
uint32_t interval;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* the timestamp for the next event,
|
||||||
|
* this is the timstamp passed to event_add_timed()
|
||||||
|
*/
|
||||||
|
struct timeval next_event;
|
||||||
|
|
||||||
|
/* here we have a reference to the timed event the schedules the notifies */
|
||||||
|
struct tevent_timer *te;
|
||||||
|
} pending;
|
||||||
|
|
||||||
/* some stuff for notify processing */
|
/* some stuff for notify processing */
|
||||||
struct {
|
struct {
|
||||||
/*
|
/*
|
||||||
|
Loading…
Reference in New Issue
Block a user