Author: metze Date: 2005-12-19 21:52:37 +0000 (Mon, 19 Dec 2005) New Revision: 12372
WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=12372 Log: - make the periodic scheduling a bit easier, instead of passing an uint32_t next_interval everywhere, we now call wreplsrv_periodic_schedule() if we want to schedule an event - also prevent us from looping with a 0 interval, by using 1s as minimum interval metze Modified: branches/SAMBA_4_0/source/wrepl_server/wrepl_out_push.c branches/SAMBA_4_0/source/wrepl_server/wrepl_periodic.c branches/SAMBA_4_0/source/wrepl_server/wrepl_server.h Changeset: Modified: branches/SAMBA_4_0/source/wrepl_server/wrepl_out_push.c =================================================================== --- branches/SAMBA_4_0/source/wrepl_server/wrepl_out_push.c 2005-12-19 21:21:42 UTC (rev 12371) +++ branches/SAMBA_4_0/source/wrepl_server/wrepl_out_push.c 2005-12-19 21:52:37 UTC (rev 12372) @@ -44,7 +44,6 @@ partner->push.last_status = wreplsrv_push_notify_recv(partner->push.creq); partner->push.creq = NULL; - partner->push.last_run = timeval_current(); old_notify_io = partner->push.notify_io; partner->push.notify_io = NULL; @@ -112,7 +111,7 @@ return (uint32_t)-1; } -uint32_t wreplsrv_out_push_run(struct wreplsrv_service *service, uint32_t next_interval) +NTSTATUS wreplsrv_out_push_run(struct wreplsrv_service *service) { struct wreplsrv_partner *partner; uint32_t change_count; @@ -133,5 +132,5 @@ wreplsrv_out_partner_push(partner, False); } - return next_interval; + return NT_STATUS_OK; } Modified: branches/SAMBA_4_0/source/wrepl_server/wrepl_periodic.c =================================================================== --- branches/SAMBA_4_0/source/wrepl_server/wrepl_periodic.c 2005-12-19 21:21:42 UTC (rev 12371) +++ branches/SAMBA_4_0/source/wrepl_server/wrepl_periodic.c 2005-12-19 21:52:37 UTC (rev 12372) @@ -35,35 +35,78 @@ #include "libcli/wrepl/winsrepl.h" #include "wrepl_server/wrepl_out_helpers.h" -static uint32_t wreplsrv_periodic_run(struct wreplsrv_service *service, uint32_t next_interval) +static NTSTATUS wreplsrv_periodic_run(struct wreplsrv_service *service) { - next_interval = wreplsrv_out_push_run(service, next_interval); + NTSTATUS status; - DEBUG(2,("wreplsrv_periodic_run: next in %u secs\n", next_interval)); - return next_interval; + status = wreplsrv_out_push_run(service); + NT_STATUS_NOT_OK_RETURN(status); + + return NT_STATUS_OK; } static void wreplsrv_periodic_handler_te(struct event_context *ev, struct timed_event *te, struct timeval t, void *ptr) { struct wreplsrv_service *service = talloc_get_type(ptr, struct wreplsrv_service); - uint32_t next_interval; + NTSTATUS status; service->periodic.te = NULL; - service->periodic.current_event = t; - next_interval = wreplsrv_periodic_run(service, service->config.periodic_interval); - - service->periodic.next_event = timeval_current_ofs(next_interval, 0); - service->periodic.te = event_add_timed(service->task->event_ctx, service, - service->periodic.next_event, - wreplsrv_periodic_handler_te, service); - if (!service->periodic.te) { - task_server_terminate(service->task,"event_add_timed() failed! no memory!\n"); + status = wreplsrv_periodic_schedule(service, service->config.periodic_interval); + if (!NT_STATUS_IS_OK(status)) { + task_server_terminate(service->task, nt_errstr(status)); return; } + + status = wreplsrv_periodic_run(service); + if (!NT_STATUS_IS_OK(status)) { + DEBUG(0,("wresrv_periodic_run() failed: %s\n", nt_errstr(status))); + } } +NTSTATUS wreplsrv_periodic_schedule(struct wreplsrv_service *service, uint32_t next_interval) +{ + TALLOC_CTX *tmp_mem; + struct timed_event *new_te; + struct timeval next_time; + + /* prevent looping */ + if (next_interval == 0) next_interval = 1; + + next_time = timeval_current_ofs(next_interval, 0); + + if (service->periodic.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->periodic.next_event) > 0) { + return NT_STATUS_OK; + } + } + + /* reset the next scheduled timestamp */ + service->periodic.next_event = next_time; + + new_te = event_add_timed(service->task->event_ctx, service, + service->periodic.next_event, + wreplsrv_periodic_handler_te, service); + NT_STATUS_HAVE_NO_MEMORY(new_te); + + tmp_mem = talloc_new(service); + DEBUG(4,("wreplsrv_periodic_schedule(%u) %sscheduled for: %s\n", + next_interval, + (service->periodic.te?"re":""), + nt_time_string(tmp_mem, timeval_to_nttime(&next_time)))); + talloc_free(tmp_mem); + + talloc_free(service->periodic.te); + service->periodic.te = new_te; + + return NT_STATUS_OK; +} + NTSTATUS wreplsrv_setup_periodic(struct wreplsrv_service *service) { NTSTATUS status; @@ -75,11 +118,8 @@ status = wreplsrv_setup_out_connections(service); NT_STATUS_NOT_OK_RETURN(status); - service->periodic.next_event = timeval_current(); - service->periodic.te = event_add_timed(service->task->event_ctx, service, - service->periodic.next_event, - wreplsrv_periodic_handler_te, service); - NT_STATUS_HAVE_NO_MEMORY(service->periodic.te); + status = wreplsrv_periodic_schedule(service, 0); + NT_STATUS_NOT_OK_RETURN(status); return NT_STATUS_OK; } Modified: branches/SAMBA_4_0/source/wrepl_server/wrepl_server.h =================================================================== --- branches/SAMBA_4_0/source/wrepl_server/wrepl_server.h 2005-12-19 21:21:42 UTC (rev 12371) +++ branches/SAMBA_4_0/source/wrepl_server/wrepl_server.h 2005-12-19 21:52:37 UTC (rev 12372) @@ -178,9 +178,6 @@ /* the status of the last push cycle */ NTSTATUS last_status; - /* the timestamp of the last run */ - struct timeval last_run; - /* the outgoing connection to the partner */ struct wreplsrv_out_connection *wreplconn; @@ -261,11 +258,6 @@ /* some stuff for periodic processing */ struct { /* - * the timestamp for the current event, - */ - struct timeval current_event; - - /* * the timestamp for the next event, * this is the timstamp passed to event_add_timed() */
