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

metze at samba.org metze at samba.org
Tue Jan 3 20:19:40 GMT 2006


Author: metze
Date: 2006-01-03 20:19:39 +0000 (Tue, 03 Jan 2006)
New Revision: 12702

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

Log:
- reload the partner configuration, when the sequenceNumber of the wins_config.ldb
  changes
- use a periodic run interval of 15 secs per default, as we no longer 
  send push notifies with each run
  
metze
Modified:
   branches/SAMBA_4_0/source/wrepl_server/wrepl_periodic.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_periodic.c
===================================================================
--- branches/SAMBA_4_0/source/wrepl_server/wrepl_periodic.c	2006-01-03 20:07:34 UTC (rev 12701)
+++ branches/SAMBA_4_0/source/wrepl_server/wrepl_periodic.c	2006-01-03 20:19:39 UTC (rev 12702)
@@ -30,6 +30,9 @@
 {
 	NTSTATUS status;
 
+	status = wreplsrv_load_partners(service);
+	NT_STATUS_NOT_OK_RETURN(status);
+
 	status = wreplsrv_scavenging_run(service);
 	NT_STATUS_NOT_OK_RETURN(status);
 
@@ -92,7 +95,7 @@
 	NT_STATUS_HAVE_NO_MEMORY(new_te);
 
 	tmp_mem = talloc_new(service);
-	DEBUG(4,("wreplsrv_periodic_schedule(%u) %sscheduled for: %s\n",
+	DEBUG(6,("wreplsrv_periodic_schedule(%u) %sscheduled for: %s\n",
 		next_interval,
 		(service->periodic.te?"re":""),
 		nt_time_string(tmp_mem, timeval_to_nttime(&next_time))));

Modified: branches/SAMBA_4_0/source/wrepl_server/wrepl_server.c
===================================================================
--- branches/SAMBA_4_0/source/wrepl_server/wrepl_server.c	2006-01-03 20:07:34 UTC (rev 12701)
+++ branches/SAMBA_4_0/source/wrepl_server/wrepl_server.c	2006-01-03 20:19:39 UTC (rev 12702)
@@ -37,6 +37,33 @@
 				system_session(mem_ctx), NULL, 0, NULL);
 }
 
+static uint64_t wins_config_db_get_seqnumber(struct ldb_context *ldb)
+{
+	int ret;
+	struct ldb_dn *dn;
+	struct ldb_result *res = NULL;
+	TALLOC_CTX *tmp_ctx = talloc_new(ldb);
+	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;
+}
+
 /*
   open winsdb
 */
@@ -72,7 +99,7 @@
 							service->config.renew_interval/2);
 
 	/* the maximun interval to the next periodic processing event */
-	service->config.periodic_interval = lp_parm_int(-1,"wreplsrv","periodic_interval", 60);
+	service->config.periodic_interval = lp_parm_int(-1,"wreplsrv","periodic_interval", 15);
 
 	return NT_STATUS_OK;
 }
@@ -93,52 +120,86 @@
 /*
   load our replication partners
 */
-static NTSTATUS wreplsrv_load_partners(struct wreplsrv_service *service)
+NTSTATUS wreplsrv_load_partners(struct wreplsrv_service *service)
 {
+	struct wreplsrv_partner *partner;
 	struct ldb_result *res = NULL;
 	int ret;
 	TALLOC_CTX *tmp_ctx = talloc_new(service);
 	int i;
+	uint64_t new_seqnumber;
 
+	new_seqnumber = wins_config_db_get_seqnumber(service->config.ldb);
+
+	/* if it's not the first run and nothing changed we're done */
+	if (service->config.seqnumber != 0 && service->config.seqnumber == new_seqnumber) {
+		return NT_STATUS_OK;
+	}
+
+	service->config.seqnumber = new_seqnumber;
+
 	/* find the record in the WINS database */
 	ret = ldb_search(service->config.ldb, ldb_dn_explode(tmp_ctx, "CN=PARTNERS"), LDB_SCOPE_SUBTREE,
 			 "(objectClass=wreplPartner)", NULL, &res);
 	if (ret != LDB_SUCCESS) goto failed;
 	talloc_steal(tmp_ctx, res);
-	if (res->count == 0) goto done;
 
+	/* first disable all existing partners */
+	for (partner=service->partners; partner; partner = partner->next) {
+		partner->type = WINSREPL_PARTNER_NONE;
+	}
+
 	for (i=0; i < res->count; i++) {
-		struct wreplsrv_partner *partner;
+		const char *address;
 
-		partner = talloc_zero(service, struct wreplsrv_partner);
-		if (partner == NULL) goto failed;
+		address	= ldb_msg_find_string(res->msgs[i], "address", NULL);
+		if (!address) {
+			goto failed;
+		}
 
-		partner->service		= service;
-		partner->address		= ldb_msg_find_string(res->msgs[i], "address", NULL);
-		if (!partner->address) goto failed;
+		partner = wreplsrv_find_partner(service, address);
+		if (partner) {
+			if (partner->name != partner->address) {
+				talloc_free(discard_const(partner->name));
+			}
+			partner->name = NULL;
+			talloc_free(discard_const(partner->our_address));
+			partner->our_address = NULL;
+
+			/* force rescheduling of pulling */
+			partner->pull.next_run = timeval_zero();
+		} else {
+			partner = talloc_zero(service, struct wreplsrv_partner);
+			if (partner == NULL) goto failed;
+
+			partner->service = service;
+			partner->address = address;
+			talloc_steal(partner, partner->address);
+
+			DLIST_ADD_END(service->partners, partner, struct wreplsrv_partner *);
+		}
+
 		partner->name			= ldb_msg_find_string(res->msgs[i], "name", partner->address);
+		talloc_steal(partner, partner->name);
+		partner->our_address		= ldb_msg_find_string(res->msgs[i], "ourAddress", NULL);
+		talloc_steal(partner, partner->our_address);
+
 		partner->type			= ldb_msg_find_uint(res->msgs[i], "type", WINSREPL_PARTNER_BOTH);
 		partner->pull.interval		= ldb_msg_find_uint(res->msgs[i], "pullInterval",
 								    WINSREPL_DEFAULT_PULL_INTERVAL);
 		partner->pull.retry_interval	= ldb_msg_find_uint(res->msgs[i], "pullRetryInterval",
 								    WINSREPL_DEFAULT_PULL_RETRY_INTERVAL);
-		partner->our_address		= ldb_msg_find_string(res->msgs[i], "ourAddress", NULL);
 		partner->push.change_count	= ldb_msg_find_uint(res->msgs[i], "pushChangeCount",
 								    WINSREPL_DEFAULT_PUSH_CHANGE_COUNT);
 		partner->push.use_inform	= ldb_msg_find_uint(res->msgs[i], "pushUseInform", False);
 
-		talloc_steal(partner, partner->address);
-		talloc_steal(partner, partner->name);
-		talloc_steal(partner, partner->our_address);
-
-		DLIST_ADD(service->partners, partner);
-
 		DEBUG(3,("wreplsrv_load_partners: found partner: %s type: 0x%X\n",
 			partner->address, partner->type));
 	}
-done:
-	DEBUG(1,("wreplsrv_load_partners: %u partners found\n", res->count));
 
+	DEBUG(2,("wreplsrv_load_partners: %u partners found: wins_config_db seqnumber %llu\n",
+		res->count, service->config.seqnumber));
+
 	talloc_free(tmp_ctx);
 	return NT_STATUS_OK;
 failed:
@@ -308,7 +369,6 @@
 	status = NT_STATUS_INTERNAL_DB_CORRUPTION;
 	if (ret != LDB_SUCCESS) goto failed;
 	talloc_steal(tmp_ctx, res);
-	if (res->count == 0) goto done;
 
 	for (i=0; i < res->count; i++) {
 		wins_owner     = ldb_msg_find_string(res->msgs[i], "winsOwner", NULL);
@@ -320,7 +380,7 @@
 		if (!NT_STATUS_IS_OK(status)) goto failed;
 		talloc_free(res->msgs[i]);
 	}
-done:
+
 	/*
 	 * this makes sure we call wreplsrv_local_max_version() before returning in
 	 * wreplsrv_find_owner()

Modified: branches/SAMBA_4_0/source/wrepl_server/wrepl_server.h
===================================================================
--- branches/SAMBA_4_0/source/wrepl_server/wrepl_server.h	2006-01-03 20:07:34 UTC (rev 12701)
+++ branches/SAMBA_4_0/source/wrepl_server/wrepl_server.h	2006-01-03 20:19:39 UTC (rev 12702)
@@ -223,6 +223,9 @@
 		/* the wins config db handle */
 		struct ldb_context *ldb;
 
+		/* the last wins config db seqnumber we know about */
+		uint64_t seqnumber;
+
 		/* 
 		 * the interval (in secs) till an active record will be marked as RELEASED 
 		 */



More information about the samba-cvs mailing list