[SCM] Samba Shared Repository - branch master updated

Kamen Mazdrashki kamenim at samba.org
Sun Jun 27 21:03:04 MDT 2010


The branch, master has been updated
       via  a0bb31d... s4/test: Run DrsDeleteObjectTestCase as part of S4 testing
       via  431386f... s4/drs: re-implement 'renaming' object replication
       via  4655643... s4/drs-test: Add few comments in DrsDeleteObjectTestCase test
      from  6f6365d... s4:rpc_server/srvsvc/dcesrv_srvsvc.c - remove unreachable code

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit a0bb31df5d48ddd346728971ff4e0506b8304d9a
Author: Kamen Mazdrashki <kamenim at samba.org>
Date:   Mon Jun 28 04:37:37 2010 +0300

    s4/test: Run DrsDeleteObjectTestCase as part of S4 testing
    
    I put this test in the end of the list of tests as it
    runs with 'vampire_dc' environment running.
    
    Currently there are tests that are failing when we have
    2 DCs constantly replicating in the test environment
    (this, of course, should be fixed in the near future)

commit 431386f3278bfa6fa9b74db9a8a40fd300621c2b
Author: Kamen Mazdrashki <kamenim at samba.org>
Date:   Mon Jun 28 04:33:40 2010 +0300

    s4/drs: re-implement 'renaming' object replication
    
    We should rename objects only after we make sure, that
    changes on the partner DC are newer than what we have.
    This fixes a bug, when we have following situation with 2 DCs:
    - we have an object O on the two DCs
    - we rename (delete) object O on DC1
    - DC1 replicates from DC2
    In the above scenario, object O will be renamed back
    to its original name (i.e. it will be restored).
    
    Now, we check that DC2 state is older than what we have,
    so nothing happens with object's DN.

commit 46556432c067bfd651e79ecd370ff3d18ae83bd7
Author: Kamen Mazdrashki <kamenim at samba.org>
Date:   Mon Jun 28 04:27:27 2010 +0300

    s4/drs-test: Add few comments in DrsDeleteObjectTestCase test
    
    Also remove unused code

-----------------------------------------------------------------------

Summary of changes:
 source4/dsdb/samdb/ldb_modules/repl_meta_data.c |   71 +++++++++++++++++------
 source4/selftest/tests.sh                       |    3 +
 source4/torture/drs/python/delete_object.py     |   13 +++-
 3 files changed, 66 insertions(+), 21 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source4/dsdb/samdb/ldb_modules/repl_meta_data.c b/source4/dsdb/samdb/ldb_modules/repl_meta_data.c
index 8994ee4..0a5655a 100644
--- a/source4/dsdb/samdb/ldb_modules/repl_meta_data.c
+++ b/source4/dsdb/samdb/ldb_modules/repl_meta_data.c
@@ -2827,6 +2827,21 @@ static bool replmd_replPropertyMetaData1_is_newer(struct replPropertyMetaData1 *
 				      new_m->originating_change_time);
 }
 
+static struct replPropertyMetaData1 *
+replmd_replPropertyMetaData1_find_attid(struct replPropertyMetaDataBlob *md_blob,
+                                        enum drsuapi_DsAttributeId attid)
+{
+	int i;
+	struct replPropertyMetaDataCtr1 *rpmd_ctr = &md_blob->ctr.ctr1;
+
+	for (i = 0; i < rpmd_ctr->count; i++) {
+		if (rpmd_ctr->array[i].attid == attid) {
+			return &rpmd_ctr->array[i];
+		}
+	}
+	return NULL;
+}
+
 static int replmd_replicated_apply_merge(struct replmd_replicated_request *ar)
 {
 	struct ldb_context *ldb;
@@ -2838,6 +2853,8 @@ static int replmd_replicated_apply_merge(struct replmd_replicated_request *ar)
 	const struct ldb_val *omd_value;
 	struct replPropertyMetaDataBlob nmd;
 	struct ldb_val nmd_value;
+	struct replPropertyMetaData1 *md_remote;
+	struct replPropertyMetaData1 *md_local;
 	unsigned int i;
 	uint32_t j,ni=0;
 	unsigned int removed_attrs = 0;
@@ -2849,24 +2866,6 @@ static int replmd_replicated_apply_merge(struct replmd_replicated_request *ar)
 	ZERO_STRUCT(omd);
 	omd.version = 1;
 
-	/*
-	 * TODO: check repl data is correct after a rename
-	 */
-	if (ldb_dn_compare(msg->dn, ar->search_msg->dn) != 0) {
-		ldb_debug(ldb, LDB_DEBUG_TRACE, "replmd_replicated_request rename %s => %s\n",
-			  ldb_dn_get_linearized(ar->search_msg->dn),
-			  ldb_dn_get_linearized(msg->dn));
-		if (dsdb_module_rename(ar->module,
-				       ar->search_msg->dn, msg->dn,
-				       DSDB_FLAG_OWN_MODULE) != LDB_SUCCESS) {
-			ldb_debug(ldb, LDB_DEBUG_FATAL, "replmd_replicated_request rename %s => %s failed - %s\n",
-				  ldb_dn_get_linearized(ar->search_msg->dn),
-				  ldb_dn_get_linearized(msg->dn),
-				  ldb_errstring(ldb));
-			return replmd_replicated_request_werror(ar, WERR_DS_DRA_DB_ERROR);
-		}
-	}
-
 	/* find existing meta data */
 	omd_value = ldb_msg_find_ldb_val(ar->search_msg, "replPropertyMetaData");
 	if (omd_value) {
@@ -2882,6 +2881,42 @@ static int replmd_replicated_apply_merge(struct replmd_replicated_request *ar)
 		}
 	}
 
+	/* check if remote 'name' has change,
+	 * which indicates a rename operation */
+	md_remote = replmd_replPropertyMetaData1_find_attid(rmd, DRSUAPI_ATTRIBUTE_name);
+	if (md_remote) {
+		md_local = replmd_replPropertyMetaData1_find_attid(&omd, DRSUAPI_ATTRIBUTE_name);
+		SMB_ASSERT(md_local);
+		if (replmd_replPropertyMetaData1_is_newer(md_local, md_remote)) {
+			SMB_ASSERT(ldb_dn_compare(msg->dn, ar->search_msg->dn) != 0);
+			/* TODO: Find appropriate local name (dn) for the object
+			 *       and modify msg->dn appropriately */
+
+			DEBUG(4,("replmd_replicated_request rename %s => %s\n",
+				  ldb_dn_get_linearized(ar->search_msg->dn),
+				  ldb_dn_get_linearized(msg->dn)));
+/*
+			ldb_debug(ldb, LDB_DEBUG_TRACE,
+				  "replmd_replicated_request rename %s => %s\n",
+				  ldb_dn_get_linearized(ar->search_msg->dn),
+				  ldb_dn_get_linearized(msg->dn));
+*/
+			/* pass rename to the next module
+			 * so it doesn't appear as an originating update */
+			ret = dsdb_module_rename(ar->module,
+			                         ar->search_msg->dn, msg->dn,
+			                         0);
+			if (ret != LDB_SUCCESS) {
+				ldb_debug(ldb, LDB_DEBUG_FATAL,
+				          "replmd_replicated_request rename %s => %s failed - %s\n",
+					  ldb_dn_get_linearized(ar->search_msg->dn),
+					  ldb_dn_get_linearized(msg->dn),
+					  ldb_errstring(ldb));
+				return replmd_replicated_request_werror(ar, WERR_DS_DRA_DB_ERROR);
+			}
+		}
+	}
+
 	ZERO_STRUCT(nmd);
 	nmd.version = 1;
 	nmd.ctr.ctr1.count = omd.ctr.ctr1.count + rmd->ctr.ctr1.count;
diff --git a/source4/selftest/tests.sh b/source4/selftest/tests.sh
index 4181d83..767d908 100755
--- a/source4/selftest/tests.sh
+++ b/source4/selftest/tests.sh
@@ -518,3 +518,6 @@ plantestsuite "blackbox.setpassword.py" none PYTHON="$PYTHON" $samba4srcdir/setu
 plantestsuite "blackbox.newuser.py" none PYTHON="$PYTHON" $samba4srcdir/setup/tests/blackbox_newuser.sh "$PREFIX/provision"
 plantestsuite "blackbox.group.py" none PYTHON="$PYTHON" $samba4srcdir/setup/tests/blackbox_group.sh "$PREFIX/provision"
 plantestsuite_loadlist "blaat" none PYTHON="$PYTHON" "$samba4srcdir/record.py"
+
+# DRS python tests
+plantestsuite "drs_delete_object.python" vampire_dc PYTHONPATH="$PYTHONPATH:$samba4srcdir/torture/drs/python" DC1=\$DC_SERVER DC2=\$VAMPIRE_DC_SERVER $SUBUNITRUN delete_object -U"\$DOMAIN/\$DC_USERNAME"%"\$DC_PASSWORD"
diff --git a/source4/torture/drs/python/delete_object.py b/source4/torture/drs/python/delete_object.py
index 29c7565..ee17c91 100644
--- a/source4/torture/drs/python/delete_object.py
+++ b/source4/torture/drs/python/delete_object.py
@@ -82,9 +82,6 @@ class DrsDeleteObjectTestCase(samba.tests.TestCase):
         self.dnsname_dc2 = self.info_dc2["dnsHostName"][0]
         pass
 
-    def test_noop(self):
-        pass
-
     def tearDown(self):
         super(DrsDeleteObjectTestCase, self).tearDown()
 
@@ -146,6 +143,9 @@ class DrsDeleteObjectTestCase(samba.tests.TestCase):
 
 
     def test_NetReplicateCmd(self):
+        """Triggers replication from DC1 to DC2
+           and vice versa so both DCs are synchronized
+           before test_ReplicateDeteleteObject test"""
         # replicate Domain NC on DC2 from DC1
         self._net_drs_replicate(DC=self.dc2, fromDC=self.dc1)
         # replicate Domain NC on DC1 from DC2
@@ -153,6 +153,13 @@ class DrsDeleteObjectTestCase(samba.tests.TestCase):
         pass
 
     def test_ReplicateDeteleteObject(self):
+        """Verifies how a deleted-object is replicated between two DCs.
+           This test should verify that:
+            - deleted-object is replicated properly
+           TODO: We should verify that after replication,
+                 object's state to conform to a deleted-object state
+                 or tombstone -object, depending on DC's features
+                 It will also be great if check replPropertyMetaData."""
         # work-out unique username to test with
         username = self._make_username()
 


-- 
Samba Shared Repository


More information about the samba-cvs mailing list