svn commit: samba r10774 - in branches/tmp/samba4-winsrepl/source/wrepl_server: .

metze at samba.org metze at samba.org
Thu Oct 6 15:23:46 GMT 2005


Author: metze
Date: 2005-10-06 15:23:46 +0000 (Thu, 06 Oct 2005)
New Revision: 10774

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=10774

Log:
- use periodic push notifycation, this is just for now
  as it needs to be configurable and and be triggered when the local database
  has changes since the last notify
- I also need to work out how to decide if the partner supports
  persistent connections and WREPL_REPL_INFORM* messages

metze
Modified:
   branches/tmp/samba4-winsrepl/source/wrepl_server/wrepl_out_connection.c


Changeset:
Modified: branches/tmp/samba4-winsrepl/source/wrepl_server/wrepl_out_connection.c
===================================================================
--- branches/tmp/samba4-winsrepl/source/wrepl_server/wrepl_out_connection.c	2005-10-06 15:18:49 UTC (rev 10773)
+++ branches/tmp/samba4-winsrepl/source/wrepl_server/wrepl_out_connection.c	2005-10-06 15:23:46 UTC (rev 10774)
@@ -158,6 +158,79 @@
 	return NT_STATUS_OK;
 }
 
+static void wreplsrv_push_handler_te(struct event_context *ev, struct timed_event *te,
+				     struct timeval t, void *ptr);
+
+static void wreplsrv_push_handler_creq(struct composite_context *creq)
+{
+	struct wreplsrv_partner *partner = talloc_get_type(creq->async.private_data, struct wreplsrv_partner);
+	uint32_t interval;
+
+	partner->push.last_status = wreplsrv_push_notify_recv(partner->push.creq);
+	partner->push.creq = NULL;
+	talloc_free(partner->push.notify_io);
+	partner->push.notify_io = NULL;
+
+	if (!NT_STATUS_IS_OK(partner->push.last_status)) {
+		interval = 15;
+
+		DEBUG(1,("wreplsrv_push_notify(%s): %s: next: %us\n",
+			 partner->address, nt_errstr(partner->push.last_status),
+			 interval));
+	} else {
+		interval = 100;
+
+		DEBUG(2,("wreplsrv_push_notify(%s): %s: next: %us\n",
+			 partner->address, nt_errstr(partner->push.last_status),
+			 interval));
+	}
+
+	partner->push.te = event_add_timed(partner->service->task->event_ctx, partner,
+					   timeval_current_ofs(interval, 0),
+					   wreplsrv_push_handler_te, partner);
+	if (!partner->push.te) {
+		DEBUG(0,("wreplsrv_push_handler_creq: event_add_timed() failed! no memory!\n"));
+	}
+}
+
+static void wreplsrv_push_handler_te(struct event_context *ev, struct timed_event *te,
+				     struct timeval t, void *ptr)
+{
+	struct wreplsrv_partner *partner = talloc_get_type(ptr, struct wreplsrv_partner);
+
+	partner->push.te = NULL;
+
+	partner->push.notify_io = talloc(partner, struct wreplsrv_push_notify_io);
+	if (!partner->push.notify_io) {
+		goto requeue;
+	}
+
+	partner->push.notify_io->in.partner	= partner;
+	partner->push.notify_io->in.inform	= False;
+	partner->push.notify_io->in.propagate	= False;
+	partner->push.creq = wreplsrv_push_notify_send(partner->push.notify_io, partner->push.notify_io);
+	if (!partner->push.creq) {
+		DEBUG(1,("wreplsrv_push_notify_send(%s) failed\n",
+			 partner->address));
+		goto requeue;
+	}
+
+	partner->push.creq->async.fn		= wreplsrv_push_handler_creq;
+	partner->push.creq->async.private_data	= partner;
+
+	return;
+requeue:
+	talloc_free(partner->push.notify_io);
+	partner->push.notify_io = NULL;
+	/* retry later */
+	partner->push.te = event_add_timed(partner->service->task->event_ctx, partner,
+					   timeval_add(&t, 5, 0),
+					   wreplsrv_push_handler_te, partner);
+	if (!partner->push.te) {
+		DEBUG(0,("wreplsrv_push_handler_te: event_add_timed() failed! no memory!\n"));
+	}
+}
+
 NTSTATUS wreplsrv_setup_out_connections(struct wreplsrv_service *service)
 {
 	struct wreplsrv_partner *cur;
@@ -168,6 +241,11 @@
 						       timeval_zero(), wreplsrv_pull_handler_te, cur);
 			NT_STATUS_HAVE_NO_MEMORY(cur->pull.te);
 		}
+		if (cur->type & WINSREPL_PARTNER_PUSH) {
+			cur->push.te = event_add_timed(service->task->event_ctx, cur,
+						       timeval_zero(), wreplsrv_push_handler_te, cur);
+			NT_STATUS_HAVE_NO_MEMORY(cur->push.te);
+		}
 	}
 
 	return NT_STATUS_OK;



More information about the samba-cvs mailing list