[SCM] Samba Shared Repository - branch master updated

Kamen Mazdrashki kamenim at samba.org
Fri Dec 17 21:54:01 MST 2010


The branch, master has been updated
       via  7157221 s4-drepl: During Schema replication, we need to save updated prefixMap if everything is OK
       via  5bc0848 s4-dsdb_schema: Copy info needed for Schema refresh in dsdb_schema_copy_shallow
       via  214b129 s4-devel/pfm_verify: Extend the tool to verify schemaInfo attribute value
       via  bd6f9ef s4-drepl: Make refreshed schema a global one
      from  09a2f14 pyrpc: Add prototype for init function.

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


- Log -----------------------------------------------------------------
commit 7157221da5bc6787b08ab26c9e83c08208b41d8a
Author: Kamen Mazdrashki <kamenim at samba.org>
Date:   Sat Dec 18 05:30:08 2010 +0200

    s4-drepl: During Schema replication, we need to save updated prefixMap if everything is OK
    
    Autobuild-User: Kamen Mazdrashki <kamenim at samba.org>
    Autobuild-Date: Sat Dec 18 05:53:48 CET 2010 on sn-devel-104

commit 5bc0848fc73f96879fdb5d398272ead7fee39157
Author: Kamen Mazdrashki <kamenim at samba.org>
Date:   Sat Dec 18 05:29:20 2010 +0200

    s4-dsdb_schema: Copy info needed for Schema refresh in dsdb_schema_copy_shallow
    
    Just 'refresh_fn' and 'loaded_from_module' are copied.
    I left 'reload_seq_number' set to 0 intentionally, so that
    this Schema cache will looks like a very old one to ,refresh_fn'.
    This way, if this shallow copy is attached to LDB, it will be
    refreshed as soon as possible by 'refresh_fn'.

commit 214b12973d71fc9c2b6221fe9f41d1e725e96612
Author: Kamen Mazdrashki <kamenim at samba.org>
Date:   Sat Dec 18 05:21:09 2010 +0200

    s4-devel/pfm_verify: Extend the tool to verify schemaInfo attribute value

commit bd6f9efc1e993d41d14da3ac56307ed424745153
Author: Kamen Mazdrashki <kamenim at samba.org>
Date:   Thu Dec 16 22:31:28 2010 +0200

    s4-drepl: Make refreshed schema a global one
    
    We need to do this as dsdb_reference_schema() function
    clears "use_global_schema" ldb flag.
    
    Basically what is going to happen is that after dsdb_reference_schema()
    global_schema pointer will continue to point at old schema cache,
    while "dsdb_schema" for LDB will point at the working_schema.
    
    After replication is done, we reset "dsdb_schema" for the ldb
    with an updated Schema cache, but this leaves global_schema pointer
    with its old value, which is not up to date.
    So we need to call dsdb_make_schema_global() again so that global_schema
    points to a valid Schema cache.

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

Summary of changes:
 source4/dsdb/repl/replicated_objects.c |   25 ++++++++++++++++
 source4/dsdb/schema/schema_init.c      |    4 ++
 source4/scripting/devel/pfm_verify.py  |   49 ++++++++++++++++++++++++++++----
 3 files changed, 72 insertions(+), 6 deletions(-)


Changeset truncated at 500 lines:

diff --git a/source4/dsdb/repl/replicated_objects.c b/source4/dsdb/repl/replicated_objects.c
index d01d3c1..0def815 100644
--- a/source4/dsdb/repl/replicated_objects.c
+++ b/source4/dsdb/repl/replicated_objects.c
@@ -445,6 +445,7 @@ WERROR dsdb_replicated_objects_commit(struct ldb_context *ldb,
 				      struct dsdb_extended_replicated_objects *objects,
 				      uint64_t *notify_uSN)
 {
+	WERROR werr;
 	struct ldb_result *ext_res;
 	struct dsdb_schema *cur_schema = NULL;
 	int ret;
@@ -493,6 +494,7 @@ WERROR dsdb_replicated_objects_commit(struct ldb_context *ldb,
 		/* restore previous schema */
 		if (cur_schema ) {
 			dsdb_reference_schema(ldb, cur_schema, false);
+			dsdb_make_schema_global(ldb, cur_schema);
 		}
 
 		DEBUG(0,("Failed to apply records: %s: %s\n",
@@ -502,11 +504,29 @@ WERROR dsdb_replicated_objects_commit(struct ldb_context *ldb,
 	}
 	talloc_free(ext_res);
 
+	/* Save our updated prefixMap */
+	if (working_schema) {
+		werr = dsdb_write_prefixes_from_schema_to_ldb(working_schema,
+							      ldb,
+							      working_schema);
+		if (!W_ERROR_IS_OK(werr)) {
+			/* restore previous schema */
+			if (cur_schema ) {
+				dsdb_reference_schema(ldb, cur_schema, false);
+				dsdb_make_schema_global(ldb, cur_schema);
+			}
+			DEBUG(0,("Failed to save updated prefixMap: %s\n",
+				 win_errstr(werr)));
+			return werr;
+		}
+	}
+
 	ret = ldb_transaction_prepare_commit(ldb);
 	if (ret != LDB_SUCCESS) {
 		/* restore previous schema */
 		if (cur_schema ) {
 			dsdb_reference_schema(ldb, cur_schema, false);
+			dsdb_make_schema_global(ldb, cur_schema);
 		}
 		DEBUG(0,(__location__ " Failed to prepare commit of transaction: %s\n",
 			 ldb_errstring(ldb)));
@@ -518,6 +538,7 @@ WERROR dsdb_replicated_objects_commit(struct ldb_context *ldb,
 		/* restore previous schema */
 		if (cur_schema ) {
 			dsdb_reference_schema(ldb, cur_schema, false);
+			dsdb_make_schema_global(ldb, cur_schema);
 		}
 		DEBUG(0,(__location__ " Failed to load partition uSN\n"));
 		ldb_transaction_cancel(ldb);
@@ -536,6 +557,7 @@ WERROR dsdb_replicated_objects_commit(struct ldb_context *ldb,
 		/* restore previous schema */
 		if (cur_schema ) {
 			dsdb_reference_schema(ldb, cur_schema, false);
+			dsdb_make_schema_global(ldb, cur_schema);
 		}
 		DEBUG(0,(__location__ " Failed to commit transaction\n"));
 		return WERR_FOOBAR;
@@ -549,6 +571,9 @@ WERROR dsdb_replicated_objects_commit(struct ldb_context *ldb,
 		cur_schema = dsdb_get_schema(ldb, NULL);
 		/* TODO: What we do in case dsdb_get_schema() fail?
 		 *       We can't fallback at this point anymore */
+		if (cur_schema) {
+			dsdb_make_schema_global(ldb, cur_schema);
+		}
 	}
 
 	DEBUG(2,("Replicated %u objects (%u linked attributes) for %s\n",
diff --git a/source4/dsdb/schema/schema_init.c b/source4/dsdb/schema/schema_init.c
index 00170a2..62111c5 100644
--- a/source4/dsdb/schema/schema_init.c
+++ b/source4/dsdb/schema/schema_init.c
@@ -99,6 +99,10 @@ struct dsdb_schema *dsdb_schema_copy_shallow(TALLOC_CTX *mem_ctx,
 		goto failed;
 	}
 
+	/* leave reload_seq_number = 0 so it will be refresh ASAP */
+	schema_copy->refresh_fn = schema->refresh_fn;
+	schema_copy->loaded_from_module = schema->loaded_from_module;
+
 	return schema_copy;
 
 failed:
diff --git a/source4/scripting/devel/pfm_verify.py b/source4/scripting/devel/pfm_verify.py
index a7314d9..300fd05 100755
--- a/source4/scripting/devel/pfm_verify.py
+++ b/source4/scripting/devel/pfm_verify.py
@@ -42,7 +42,14 @@ def _samdb_fetch_pfm(samdb):
     assert len(res) == 1
     pfm = ndr_unpack(drsblobs.prefixMapBlob,
                      str(res[0]['prefixMap']))
-    return pfm.ctr
+    pfm_schi = None
+    if 'schemaInfo' in res[0]:
+        pfm_schi = pfm_schi = ndr_unpack(drsblobs.schemaInfoBlob,
+                                         str(res[0]['schemaInfo']))
+    else:
+        pfm_schi = drsblobs.schemaInfoBlob()
+        pfm_schi.marker = 0xFF;
+    return (pfm.ctr, pfm_schi)
 
 def _drs_fetch_pfm(server, samdb, creds, lp):
     """Fetch prefixMap using DRS interface"""
@@ -82,10 +89,14 @@ def _drs_fetch_pfm(server, samdb, creds, lp):
     pfm_it = pfm.mappings[-1]
     assert pfm_it.id_prefix == 0
     assert pfm_it.oid.length == 21
-    assert pfm_it.oid.binary_oid[0] == 255
+    s = ''
+    for x in pfm_it.oid.binary_oid:
+        s += chr(x)
+    pfm_schi = ndr_unpack(drsblobs.schemaInfoBlob, s)
+    assert pfm_schi.marker == 0xFF
     # remove schemaInfo element
     pfm.num_mappings -= 1
-    return pfm
+    return (pfm, pfm_schi)
 
 def _pfm_verify(drs_pfm, ldb_pfm):
     errors = []
@@ -107,6 +118,21 @@ def _pfm_verify(drs_pfm, ldb_pfm):
             errors.append("[%2d] differences in (%s)" % (i, it_err))
     return errors
 
+def _pfm_schi_verify(drs_schi, ldb_schi):
+    errors = []
+    print drs_schi.revision
+    print drs_schi.invocation_id
+    if drs_schi.marker != ldb_schi.marker:
+        errors.append("Different marker in schemaInfo: drs = %d, ldb = %d"
+                      % (drs_schi.marker, ldb_schi.marker))
+    if drs_schi.revision != ldb_schi.revision:
+        errors.append("Different revision in schemaInfo: drs = %d, ldb = %d"
+                      % (drs_schi.revision, ldb_schi.revision))
+    if drs_schi.invocation_id != ldb_schi.invocation_id:
+        errors.append("Different invocation_id in schemaInfo: drs = %s, ldb = %s"
+                      % (drs_schi.invocation_id, ldb_schi.invocation_id))
+    return errors
+
 ########### main code ###########
 if __name__ == "__main__":
     # command line parsing
@@ -137,10 +163,21 @@ if __name__ == "__main__":
                   session_info=system_session(lp),
                   credentials=creds, lp=lp)
 
-    drs_pfm = _drs_fetch_pfm(server, samdb, creds, lp)
-    ldb_pfm = _samdb_fetch_pfm(samdb)
+    exit_code = 0
+    (drs_pfm, drs_schi) = _drs_fetch_pfm(server, samdb, creds, lp)
+    (ldb_pfm, ldb_schi) = _samdb_fetch_pfm(samdb)
+    # verify prefixMaps
     errors = _pfm_verify(drs_pfm, ldb_pfm)
     if len(errors):
         print "prefixMap verification errors:"
         print "%s" % errors
-        sys.exit(1)
+        exit_code = 1
+    # verify schemaInfos
+    errors = _pfm_schi_verify(drs_schi, ldb_schi)
+    if len(errors):
+        print "schemaInfo verification errors:"
+        print "%s" % errors
+        exit_code = 2
+
+    if exit_code != 0:
+        sys.exit(exit_code)


-- 
Samba Shared Repository


More information about the samba-cvs mailing list