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);
|
||||
}
|
||||
}
|
||||
|
||||
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
|
||||
* replication as soon as possible
|
||||
*/
|
||||
dreplsrv_periodic_schedule(service, 0);
|
||||
dreplsrv_pendingops_schedule(service, 0);
|
||||
|
||||
done:
|
||||
return NT_STATUS_OK;
|
||||
|
@ -187,6 +187,23 @@ struct dreplsrv_service {
|
||||
struct tevent_timer *te;
|
||||
} 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 */
|
||||
struct {
|
||||
/*
|
||||
|
Loading…
Reference in New Issue
Block a user