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

metze at samba.org metze at samba.org
Mon Jan 2 18:25:31 GMT 2006


Author: metze
Date: 2006-01-02 18:25:30 +0000 (Mon, 02 Jan 2006)
New Revision: 12679

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

Log:
create a sperate function to create the 'winsOwner' part of the search filter,
this is to handle the special '0.0.0.0' of old or manual added owned records

metze
Modified:
   branches/SAMBA_4_0/source/wrepl_server/wrepl_in_call.c
   branches/SAMBA_4_0/source/wrepl_server/wrepl_scavenging.c


Changeset:
Modified: branches/SAMBA_4_0/source/wrepl_server/wrepl_in_call.c
===================================================================
--- branches/SAMBA_4_0/source/wrepl_server/wrepl_in_call.c	2006-01-02 18:23:49 UTC (rev 12678)
+++ branches/SAMBA_4_0/source/wrepl_server/wrepl_in_call.c	2006-01-02 18:25:30 UTC (rev 12679)
@@ -174,6 +174,7 @@
 	struct wrepl_replication *repl_out = &call->rep_packet.message.replication;
 	struct wrepl_send_reply *reply_out = &call->rep_packet.message.replication.info.reply;
 	struct wreplsrv_owner *owner;
+	const char *owner_filter;
 	const char *filter;
 	struct ldb_result *res = NULL;
 	int ret;
@@ -232,11 +233,13 @@
 		return NT_STATUS_OK;
 	}
 
+	owner_filter = wreplsrv_owner_filter(service, call, owner->owner.address);
+	NT_STATUS_HAVE_NO_MEMORY(owner_filter);
 	filter = talloc_asprintf(call,
-				 "(&(winsOwner=%s)(objectClass=winsRecord)"
+				 "(&%s(objectClass=winsRecord)"
 				 "(|(recordState=%u)(recordState=%u))"
 				 "(versionID>=%llu)(versionID<=%llu))",
-				 owner->owner.address,
+				 owner_filter,
 				 WREPL_STATE_ACTIVE, WREPL_STATE_TOMBSTONE,
 				 (long long)owner_in->min_version, 
 				 (long long)owner_in->max_version);
@@ -244,6 +247,8 @@
 	ret = ldb_search(service->wins_db->ldb, NULL, LDB_SCOPE_SUBTREE, filter, NULL, &res);
 	if (ret != LDB_SUCCESS) return NT_STATUS_INTERNAL_DB_CORRUPTION;
 	talloc_steal(call, res);
+	DEBUG(10,("WINSREPL: filter '%s' count %d\n", filter, res->count));
+
 	if (res->count == 0) {
 		DEBUG(2,("WINSREPL:reply [%u] records owner[%s] min[%llu] max[%llu] to partner[%s]\n",
 			res->count, owner_in->address, 

Modified: branches/SAMBA_4_0/source/wrepl_server/wrepl_scavenging.c
===================================================================
--- branches/SAMBA_4_0/source/wrepl_server/wrepl_scavenging.c	2006-01-02 18:23:49 UTC (rev 12678)
+++ branches/SAMBA_4_0/source/wrepl_server/wrepl_scavenging.c	2006-01-02 18:25:30 UTC (rev 12679)
@@ -28,11 +28,25 @@
 #include "ldb/include/ldb_errors.h"
 #include "system/time.h"
 
+const char *wreplsrv_owner_filter(struct wreplsrv_service *service,
+				  TALLOC_CTX *mem_ctx,
+				  const char *wins_owner)
+{
+	if (strcmp(wins_owner, service->wins_db->local_owner) == 0) {
+		return talloc_asprintf(mem_ctx, "(|(winsOwner=%s)(winsOwner=0.0.0.0))",
+				       wins_owner);
+	}
+
+	return talloc_asprintf(mem_ctx, "(&(winsOwner=%s)(!(winsOwner=0.0.0.0)))",
+			       wins_owner);
+}
+
 static NTSTATUS wreplsrv_scavenging_owned_records(struct wreplsrv_service *service, TALLOC_CTX *tmp_mem)
 {
 	NTSTATUS status;
 	struct winsdb_record *rec = NULL;
 	struct ldb_result *res = NULL;
+	const char *owner_filter;
 	const char *filter;
 	uint32_t i;
 	int ret;
@@ -48,14 +62,18 @@
 
 	now_timestr = ldb_timestring(tmp_mem, now);
 	NT_STATUS_HAVE_NO_MEMORY(now_timestr);
+	owner_filter = wreplsrv_owner_filter(service, tmp_mem,
+					     service->wins_db->local_owner);
+	NT_STATUS_HAVE_NO_MEMORY(owner_filter);
 	filter = talloc_asprintf(tmp_mem,
-				 "(&(winsOwner=%s)(objectClass=winsRecord)"
+				 "(&%s(objectClass=winsRecord)"
 				 "(expireTime<=%s)(!(isStatic=1)))",
-				 service->wins_db->local_owner, now_timestr);
+				 owner_filter, now_timestr);
 	NT_STATUS_HAVE_NO_MEMORY(filter);
 	ret = ldb_search(service->wins_db->ldb, NULL, LDB_SCOPE_SUBTREE, filter, NULL, &res);
 	if (ret != LDB_SUCCESS) return NT_STATUS_INTERNAL_DB_CORRUPTION;
 	talloc_steal(tmp_mem, res);
+	DEBUG(10,("WINS scavenging: filter '%s' count %d\n", filter, res->count));
 
 	tombstone_extra_time = timeval_add(&service->startup_time,
 					   service->config.tombstone_extra_timeout,
@@ -141,6 +159,7 @@
 	NTSTATUS status;
 	struct winsdb_record *rec = NULL;
 	struct ldb_result *res = NULL;
+	const char *owner_filter;
 	const char *filter;
 	uint32_t i;
 	int ret;
@@ -156,14 +175,18 @@
 
 	now_timestr = ldb_timestring(tmp_mem, now);
 	NT_STATUS_HAVE_NO_MEMORY(now_timestr);
+	owner_filter = wreplsrv_owner_filter(service, tmp_mem,
+					     service->wins_db->local_owner);
+	NT_STATUS_HAVE_NO_MEMORY(owner_filter);
 	filter = talloc_asprintf(tmp_mem,
-				 "(&(!(winsOwner=%s))(objectClass=winsRecord)"
+				 "(&(!%s)(objectClass=winsRecord)"
 				 "(!(recordState=%u))(expireTime<=%s)(!(isStatic=1)))",
-				 service->wins_db->local_owner, WREPL_STATE_ACTIVE, now_timestr);
+				 owner_filter, WREPL_STATE_ACTIVE, now_timestr);
 	NT_STATUS_HAVE_NO_MEMORY(filter);
 	ret = ldb_search(service->wins_db->ldb, NULL, LDB_SCOPE_SUBTREE, filter, NULL, &res);
 	if (ret != LDB_SUCCESS) return NT_STATUS_INTERNAL_DB_CORRUPTION;
 	talloc_steal(tmp_mem, res);
+	DEBUG(10,("WINS scavenging: filter '%s' count %d\n", filter, res->count));
 
 	tombstone_extra_time = timeval_add(&service->startup_time,
 					   service->config.tombstone_extra_timeout,
@@ -246,6 +269,7 @@
 	NTSTATUS status;
 	struct winsdb_record *rec = NULL;
 	struct ldb_result *res = NULL;
+	const char *owner_filter;
 	const char *filter;
 	uint32_t i;
 	int ret;
@@ -259,14 +283,18 @@
 
 	now_timestr = ldb_timestring(tmp_mem, now);
 	NT_STATUS_HAVE_NO_MEMORY(now_timestr);
+	owner_filter = wreplsrv_owner_filter(service, tmp_mem,
+					     service->wins_db->local_owner);
+	NT_STATUS_HAVE_NO_MEMORY(owner_filter);
 	filter = talloc_asprintf(tmp_mem,
-				 "(&(!(winsOwner=%s))(objectClass=winsRecord)"
+				 "(&(!%s)(objectClass=winsRecord)"
 				 "(recordState=%u)(expireTime<=%s)(!(isStatic=1)))",
-				 service->wins_db->local_owner, WREPL_STATE_ACTIVE, now_timestr);
+				 owner_filter, WREPL_STATE_ACTIVE, now_timestr);
 	NT_STATUS_HAVE_NO_MEMORY(filter);
 	ret = ldb_search(service->wins_db->ldb, NULL, LDB_SCOPE_SUBTREE, filter, NULL, &res);
 	if (ret != LDB_SUCCESS) return NT_STATUS_INTERNAL_DB_CORRUPTION;
 	talloc_steal(tmp_mem, res);
+	DEBUG(10,("WINS scavenging: filter '%s' count %d\n", filter, res->count));
 
 	for (i=0; i < res->count; i++) {
 		status = winsdb_record(service->wins_db, res->msgs[i], tmp_mem, &rec);



More information about the samba-cvs mailing list