svn commit: samba r12372 - in branches/SAMBA_4_0/source/wrepl_server: .

metze at samba.org metze at samba.org
Mon Dec 19 21:52:38 GMT 2005


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



More information about the samba-cvs mailing list