wreplserver: add "wreplsrv:propagate name releases = yes" for replicated sgroup merges
authorStefan Metzmacher <metze@sernet.de>
Wed, 26 Mar 2008 18:33:15 +0000 (19:33 +0100)
committerStefan Metzmacher <metze@samba.org>
Mon, 19 Jan 2009 06:05:52 +0000 (07:05 +0100)
metze
(from samba4wins tree 80cbe665e561182d28acc6ad474243b83f3e4d28)

source4/wrepl_server/wrepl_apply_records.c

index 6db093b619fe7832d2a51ca05eda5df8fa5344c2..96a6033b1e16c618dc84772125c407ced6cb9feb 100644 (file)
@@ -29,6 +29,7 @@
 #include "libcli/wrepl/winsrepl.h"
 #include "system/time.h"
 #include "librpc/gen_ndr/ndr_nbt.h"
 #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,
 
 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;
        uint8_t ret;
        size_t len;
        bool changed_old_addrs = false;
+       bool skip_replica_owned_by_us = false;
        bool become_owner = true;
        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);
        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++) {
        }
 
        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,
                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;
        }
 
                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;
        /* 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;