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

metze at samba.org metze at samba.org
Sun Jan 8 21:25:39 GMT 2006


Author: metze
Date: 2006-01-08 21:25:38 +0000 (Sun, 08 Jan 2006)
New Revision: 12780

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

Log:
propagate local records, when replicas are rejected on conflicts

metze
Modified:
   branches/SAMBA_4_0/source/wrepl_server/wrepl_apply_records.c


Changeset:
Modified: branches/SAMBA_4_0/source/wrepl_server/wrepl_apply_records.c
===================================================================
--- branches/SAMBA_4_0/source/wrepl_server/wrepl_apply_records.c	2006-01-08 20:57:26 UTC (rev 12779)
+++ branches/SAMBA_4_0/source/wrepl_server/wrepl_apply_records.c	2006-01-08 21:25:38 UTC (rev 12780)
@@ -34,6 +34,7 @@
 	R_INVALID,
 	R_DO_REPLACE,
 	R_NOT_REPLACE,
+	R_DO_PROPAGATE,
 	R_DO_CHALLENGE,
 	R_DO_RELEASE_DEMAND,
 	R_DO_SGROUP_MERGE
@@ -45,6 +46,7 @@
 	case R_INVALID:			return "INVALID";
 	case R_DO_REPLACE:		return "REPLACE";
 	case R_NOT_REPLACE:		return "NOT_REPLACE";
+	case R_DO_PROPAGATE:		return "PROPAGATE";
 	case R_DO_CHALLENGE:		return "CHALLEGNE";
 	case R_DO_RELEASE_DEMAND:	return "RELEASE_DEMAND";
 	case R_DO_SGROUP_MERGE:		return "SGROUP_MERGE";
@@ -737,6 +739,33 @@
 	return NT_STATUS_OK;
 }
 
+static NTSTATUS r_do_propagate(struct wreplsrv_partner *partner,
+			       TALLOC_CTX *mem_ctx,
+			       struct winsdb_record *rec,
+			       struct wrepl_wins_owner *owner,
+			       struct wrepl_name *replica)
+{
+	uint8_t ret;
+	uint32_t modify_flags;
+
+	/*
+	 * allocate a new version id for the record to that it'll be replicated
+	 */
+	modify_flags	= WINSDB_FLAG_ALLOC_VERSION | WINSDB_FLAG_TAKE_OWNERSHIP;
+
+	ret = winsdb_modify(partner->service->wins_db, rec, modify_flags);
+	if (ret != NBT_RCODE_OK) {
+		DEBUG(0,("Failed to replace record %s: %u\n",
+			nbt_name_string(mem_ctx, &replica->name), ret));
+		return NT_STATUS_FOOBAR;
+	}
+
+	DEBUG(4,("propagated record %s\n",
+		 nbt_name_string(mem_ctx, &replica->name)));
+
+	return NT_STATUS_OK;
+}
+
 /* 
 Test Replica vs. owned active: some more MHOMED combinations
 _MA_MA_SP_U<00>: C:MHOMED vs. B:ALL => B:ALL => REPLACE
@@ -1247,8 +1276,22 @@
 	}
 
 	if (rec->is_static && !same_owner) {
-		/* TODO: this is just assumed and needs to be tested more */
 		action = R_NOT_REPLACE;
+
+		/*
+		 * if we own the local record, then propagate it back to
+		 * the other wins servers.
+		 * to prevent ping-pong with other servers, we don't do this
+		 * if the replica is static too.
+		 *
+		 * It seems that w2k3 doesn't do this, but I thing that's a bug
+		 * and doing propagation helps to have consistent data on all servers
+		 */
+		if (local_vs_replica && !replica->is_static) {
+			action = R_DO_PROPAGATE;
+		}
+	} else if (replica->is_static && !rec->is_static && !same_owner) {
+		action = R_DO_REPLACE;
 	} else if (same_owner) {
 		action = replace_same_owner(rec, replica);
 	} else if (replica_vs_replica) {
@@ -1281,6 +1324,15 @@
 			action = replace_mhomed_owned_vs_X_replica(rec, replica);
 			break;
 		}
+
+		/*
+		 * if we own the local record, and it should not be replaced
+		 * then propagate the conflict result back to the other
+		 * wins servers
+		 */
+		if (action == R_NOT_REPLACE) {
+			action = R_DO_PROPAGATE;
+		}
 	}
 
 	DEBUG(4,("apply record %s: %s\n",
@@ -1292,6 +1344,8 @@
 		return r_do_replace(partner, mem_ctx, rec, owner, replica);
 	case R_NOT_REPLACE:
 		return r_not_replace(partner, mem_ctx, rec, owner, replica);
+	case R_DO_PROPAGATE:
+		return r_do_propagate(partner, mem_ctx, rec, owner, replica);
 	case R_DO_CHALLENGE:
 		return r_do_challenge(partner, mem_ctx, rec, owner, replica);
 	case R_DO_RELEASE_DEMAND:



More information about the samba-cvs mailing list