git.samba.org
/
kai
/
samba.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (parent:
e1c968a
)
wreplserver: add "wreplsrv:propagate name releases = yes" for replicated sgroup merges
author
Stefan Metzmacher
<metze@sernet.de>
Wed, 26 Mar 2008 18:33:15 +0000
(19:33 +0100)
committer
Stefan 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
patch
|
blob
|
history
diff --git
a/source4/wrepl_server/wrepl_apply_records.c
b/source4/wrepl_server/wrepl_apply_records.c
index 6db093b619fe7832d2a51ca05eda5df8fa5344c2..96a6033b1e16c618dc84772125c407ced6cb9feb 100644
(file)
--- 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 "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;