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

metze at samba.org metze at samba.org
Sat Dec 31 09:44:04 GMT 2005


Author: metze
Date: 2005-12-31 09:44:04 +0000 (Sat, 31 Dec 2005)
New Revision: 12642

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

Log:
only do push notifications when something changed

metze
Modified:
   branches/SAMBA_4_0/source/wrepl_server/wrepl_out_push.c
   branches/SAMBA_4_0/source/wrepl_server/wrepl_server.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-31 09:08:46 UTC (rev 12641)
+++ branches/SAMBA_4_0/source/wrepl_server/wrepl_out_push.c	2005-12-31 09:44:04 UTC (rev 12642)
@@ -96,17 +96,35 @@
 	return;
 }
 
-static uint32_t wreplsrv_calc_change_count(struct wreplsrv_partner *partner)
+static uint32_t wreplsrv_calc_change_count(struct wreplsrv_partner *partner, uint64_t seqnumber)
 {
-	/* TODO: add a real implementation here */
-	return (uint32_t)-1;
+	uint64_t tmp_diff = UINT32_MAX;
+
+	/* catch an overflow */
+	if (partner->push.seqnumber > seqnumber) {
+		goto done;
+	}
+
+	tmp_diff = seqnumber - partner->push.seqnumber;
+
+	if (tmp_diff > UINT32_MAX) {
+		tmp_diff = UINT32_MAX;
+		goto done;
+	}
+
+done:
+	partner->push.seqnumber = seqnumber;
+	return (uint32_t)(tmp_diff & UINT32_MAX);
 }
 
 NTSTATUS wreplsrv_out_push_run(struct wreplsrv_service *service)
 {
 	struct wreplsrv_partner *partner;
+	uint64_t seqnumber;
 	uint32_t change_count;
 
+	seqnumber = wreplsrv_local_db_seqnumber(service);
+
 	for (partner = service->partners; partner; partner = partner->next) {
 		/* if it's not a push partner, go to the next partner */
 		if (!(partner->type & WINSREPL_PARTNER_PUSH)) continue;
@@ -115,7 +133,7 @@
 		if (partner->push.change_count == 0) continue;
 
 		/* get the actual change count for the partner */
-		change_count = wreplsrv_calc_change_count(partner);
+		change_count = wreplsrv_calc_change_count(partner, seqnumber);
 
 		/* if the configured change count isn't reached, go to the next partner */
 		if (change_count < partner->push.change_count) continue;

Modified: branches/SAMBA_4_0/source/wrepl_server/wrepl_server.c
===================================================================
--- branches/SAMBA_4_0/source/wrepl_server/wrepl_server.c	2005-12-31 09:08:46 UTC (rev 12641)
+++ branches/SAMBA_4_0/source/wrepl_server/wrepl_server.c	2005-12-31 09:44:04 UTC (rev 12642)
@@ -197,6 +197,34 @@
 	return maxVersion;
 }
 
+uint64_t wreplsrv_local_db_seqnumber(struct wreplsrv_service *service)
+{
+	int ret;
+	struct ldb_context *ldb = service->wins_db->ldb;
+	struct ldb_dn *dn;
+	struct ldb_result *res = NULL;
+	TALLOC_CTX *tmp_ctx = talloc_new(service);
+	uint64_t seqnumber = 0;
+
+	dn = ldb_dn_explode(tmp_ctx, "@BASEINFO");
+	if (!dn) goto failed;
+
+	/* find the record in the WINS database */
+	ret = ldb_search(ldb, dn, LDB_SCOPE_BASE, 
+			 NULL, NULL, &res);
+	if (ret != LDB_SUCCESS) goto failed;
+	talloc_steal(tmp_ctx, res);
+	if (res->count > 1) goto failed;
+
+	if (res->count == 1) {
+		seqnumber = ldb_msg_find_uint64(res->msgs[0], "sequenceNumber", 0);
+	}
+
+failed:
+	talloc_free(tmp_ctx);
+	return seqnumber;
+}
+
 NTSTATUS wreplsrv_fill_wrepl_table(struct wreplsrv_service *service,
 				   TALLOC_CTX *mem_ctx,
 				   struct wrepl_table *table_out,

Modified: branches/SAMBA_4_0/source/wrepl_server/wrepl_server.h
===================================================================
--- branches/SAMBA_4_0/source/wrepl_server/wrepl_server.h	2005-12-31 09:08:46 UTC (rev 12641)
+++ branches/SAMBA_4_0/source/wrepl_server/wrepl_server.h	2005-12-31 09:44:04 UTC (rev 12642)
@@ -172,6 +172,9 @@
 		/* change count till push notification */
 		uint32_t change_count;
 
+		/* the last wins db seqnumber we know about */
+		uint64_t seqnumber;
+
 		/* we should use WREPL_REPL_INFORM* messages to this partner */
 		BOOL use_inform;
 



More information about the samba-cvs mailing list