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()
                 */

Reply via email to