From 7c7bdf3669f55b7bd3e2ff138af8f57bcc6596ee Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Wed, 26 Mar 2008 19:33:15 +0100 Subject: wreplserver: add "wreplsrv:propagate name releases = yes" for replicated sgroup merges metze (from samba4wins tree 80cbe665e561182d28acc6ad474243b83f3e4d28) --- source4/wrepl_server/wrepl_apply_records.c | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) (limited to 'source4') diff --git a/source4/wrepl_server/wrepl_apply_records.c b/source4/wrepl_server/wrepl_apply_records.c index 6db093b619..96a6033b1e 100644 --- a/source4/wrepl_server/wrepl_apply_records.c +++ b/source4/wrepl_server/wrepl_apply_records.c @@ -29,6 +29,7 @@ #include "libcli/wrepl/winsrepl.h" #include "system/time.h" #include "librpc/gen_ndr/ndr_nbt.h" +#include "param/param.h" enum _R_ACTION { R_INVALID, @@ -1190,7 +1191,9 @@ static NTSTATUS r_do_sgroup_merge(struct wreplsrv_partner *partner, uint8_t ret; size_t len; bool changed_old_addrs = false; + bool skip_replica_owned_by_us = false; bool become_owner = true; + bool propagate = lp_parm_bool(partner->service->task->lp_ctx, NULL, "wreplsrv", "propagate name releases", false); const char *local_owner = partner->service->wins_db->local_owner; merge = talloc(mem_ctx, struct winsdb_record); @@ -1251,6 +1254,23 @@ static NTSTATUS r_do_sgroup_merge(struct wreplsrv_partner *partner, } for (i=0; i < replica->num_addresses; i++) { + if (propagate && + strcmp(replica->addresses[i].owner, local_owner) == 0) { + const struct winsdb_addr *a; + + /* + * NOTE: this is different to the windows behavior + * and off by default, but it better propagated + * name releases + */ + a = winsdb_addr_list_check(merge->addresses, + replica->addresses[i].address); + if (!a) { + /* don't add addresses owned by us */ + skip_replica_owned_by_us = true; + } + continue; + } merge->addresses = winsdb_addr_list_add(partner->service->wins_db, merge, merge->addresses, replica->addresses[i].address, @@ -1265,6 +1285,15 @@ static NTSTATUS r_do_sgroup_merge(struct wreplsrv_partner *partner, become_owner = false; } + /* + * when we notice another server believes an address + * is owned by us and that's not the case + * we propagate the result + */ + if (skip_replica_owned_by_us) { + become_owner = true; + } + /* if we're the owner of the old record, we'll be the owner of the new one too */ if (strcmp(rec->wins_owner, local_owner)==0) { become_owner = true; -- cgit