The branch, master has been updated via f827fcd s4-libnet_vampire: Remove unused self_corrected_schema via b44135a s4-libnet_vampire use a linked list to handle schema objects pending conversion via 837af1c s4-vampire: Optimize Schema decoding conversion via 0440741 s4-vampire: Initial implementation for multi-pass schema decoding from DRS data via 20029aa s4-dsdb-repl: Print what the error code for failure is via 81e5e23 s4-dsdb: Make dsdb_setup_sorted_accessors() public from c15e919 wafsamba: Clarify needs_python argument name, use pyembed/pyext where applicable.
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master - Log ----------------------------------------------------------------- commit f827fcd0e0f91b6aca113ec94e09e293f119cba8 Author: Kamen Mazdrashki <kame...@samba.org> Date: Sun Oct 3 04:29:08 2010 +0300 s4-libnet_vampire: Remove unused self_corrected_schema Autobuild-User: Kamen Mazdrashki <kame...@samba.org> Autobuild-Date: Sun Oct 10 10:40:38 UTC 2010 on sn-devel-104 commit b44135ac737499052f54e72b4076ef5561852d35 Author: Andrew Bartlett <abart...@samba.org> Date: Mon Sep 27 08:50:54 2010 +1000 s4-libnet_vampire use a linked list to handle schema objects pending conversion commit 837af1c29ae6ecebf483706e14b3190fdf4988c8 Author: Kamen Mazdrashki <kame...@samba.org> Date: Sat Sep 25 13:26:03 2010 +0300 s4-vampire: Optimize Schema decoding conversion memmove() is removed and I am using the beginning of the list for storage for failed objects commit 0440741473a87d184055942586c5f68de153fa2f Author: Kamen Mazdrashki <kame...@samba.org> Date: Fri Sep 24 22:56:36 2010 +0300 s4-vampire: Initial implementation for multi-pass schema decoding from DRS data We can't decode all schema object in just one (or even two) passes when Schema tree has more levels of inheritance. commit 20029aac31d1952b8307d4f0c3c628f17562af51 Author: Kamen Mazdrashki <kame...@samba.org> Date: Fri Sep 24 00:47:37 2010 +0300 s4-dsdb-repl: Print what the error code for failure is commit 81e5e23683ebbb48bb3a2b2db306f47234cdfe09 Author: Kamen Mazdrashki <kame...@samba.org> Date: Fri Sep 24 00:46:50 2010 +0300 s4-dsdb: Make dsdb_setup_sorted_accessors() public We are going to need it while converting DRS schema. ----------------------------------------------------------------------- Summary of changes: source4/dsdb/repl/replicated_objects.c | 4 +- source4/dsdb/schema/schema_set.c | 4 +- source4/libnet/libnet_vampire.c | 176 +++++++++++++++++-------------- 3 files changed, 101 insertions(+), 83 deletions(-) Changeset truncated at 500 lines: diff --git a/source4/dsdb/repl/replicated_objects.c b/source4/dsdb/repl/replicated_objects.c index 0beb53c..10b13a8 100644 --- a/source4/dsdb/repl/replicated_objects.c +++ b/source4/dsdb/repl/replicated_objects.c @@ -271,7 +271,9 @@ WERROR dsdb_extended_replicated_objects_convert(struct ldb_context *ldb, out->objects, &out->objects[i]); if (!W_ERROR_IS_OK(status)) { talloc_free(out); - DEBUG(0,("Failed to convert object %s\n", cur->object.identifier->dn)); + DEBUG(0,("Failed to convert object %s: %s\n", + cur->object.identifier->dn, + win_errstr(status))); return status; } } diff --git a/source4/dsdb/schema/schema_set.c b/source4/dsdb/schema/schema_set.c index 344e9bb..4a4466a 100644 --- a/source4/dsdb/schema/schema_set.c +++ b/source4/dsdb/schema/schema_set.c @@ -264,8 +264,8 @@ static void dsdb_sorted_accessors_free(struct dsdb_schema *schema) /* create the sorted accessor arrays for the schema */ -static int dsdb_setup_sorted_accessors(struct ldb_context *ldb, - struct dsdb_schema *schema) +int dsdb_setup_sorted_accessors(struct ldb_context *ldb, + struct dsdb_schema *schema) { struct dsdb_class *cur; struct dsdb_attribute *a; diff --git a/source4/libnet/libnet_vampire.c b/source4/libnet/libnet_vampire.c index adcb010..6a94f07 100644 --- a/source4/libnet/libnet_vampire.c +++ b/source4/libnet/libnet_vampire.c @@ -68,9 +68,6 @@ struct libnet_vampire_cb_state { * converted, because we may not know them yet */ struct dsdb_schema *self_made_schema; - /* 2nd pass, with full ID->OID->name table */ - struct dsdb_schema *self_corrected_schema; - /* prefixMap in LDB format, from the remote DRS server */ DATA_BLOB prefixmap_blob; const struct dsdb_schema *schema; @@ -222,9 +219,17 @@ NTSTATUS libnet_vampire_cb_check_options(void *private_data, static NTSTATUS libnet_vampire_cb_apply_schema(struct libnet_vampire_cb_state *s, const struct libnet_BecomeDC_StoreChunk *c) { + struct schema_list { + struct schema_list *next, *prev; + const struct drsuapi_DsReplicaObjectListItemEx *obj; + }; + WERROR status; const struct drsuapi_DsReplicaOIDMapping_Ctr *mapping_ctr; - uint32_t object_count; + struct schema_list *schema_list = NULL, *schema_list_item, *schema_list_next_item; + struct dsdb_schema *working_schema; + struct dsdb_schema *provision_schema; + uint32_t object_count = 0; struct drsuapi_DsReplicaObjectListItemEx *first_object; const struct drsuapi_DsReplicaObjectListItemEx *cur; uint32_t linked_attributes_count; @@ -237,7 +242,7 @@ static NTSTATUS libnet_vampire_cb_apply_schema(struct libnet_vampire_cb_state *s struct ldb_message *msg; struct ldb_message_element *prefixMap_el; uint32_t i; - int ret; + int ret, pass_no; bool ok; uint64_t seq_num; @@ -288,11 +293,12 @@ static NTSTATUS libnet_vampire_cb_apply_schema(struct libnet_vampire_cb_state *s schema_ldb = provision_get_schema(s, s->lp_ctx, &s->prefixmap_blob); if (!schema_ldb) { - DEBUG(0,("Failed to re-load from local provision using remote prefixMap. Will continue with local prefixMap\n")); - s->provision_schema = dsdb_get_schema(s->ldb, s); + DEBUG(0,("Failed to re-load from local provision using remote prefixMap. " + "Will continue with local prefixMap\n")); + provision_schema = dsdb_get_schema(s->ldb, s); } else { - s->provision_schema = dsdb_get_schema(schema_ldb, s); - ret = dsdb_reference_schema(s->ldb, s->provision_schema, false); + provision_schema = dsdb_get_schema(schema_ldb, s); + ret = dsdb_reference_schema(s->ldb, provision_schema, false); if (ret != LDB_SUCCESS) { DEBUG(0,("Failed to attach schema from local provision using remote prefixMap.")); return NT_STATUS_UNSUCCESSFUL; @@ -300,90 +306,107 @@ static NTSTATUS libnet_vampire_cb_apply_schema(struct libnet_vampire_cb_state *s talloc_free(schema_ldb); } - s->provision_schema->relax_OID_conversions = true; + /* create a list of objects yet to be converted */ + for (cur = first_object; cur; cur = cur->next_object) { + schema_list_item = talloc(s, struct schema_list); + schema_list_item->obj = cur; + DLIST_ADD_END(schema_list, schema_list_item, struct schema_list); + } + + /* resolve objects until all are resolved and in local schema */ + pass_no = 1; + working_schema = provision_schema; - /* Now convert the schema elements, using the schema we loaded locally */ - for (i=0, cur = first_object; cur; cur = cur->next_object, i++) { - struct dsdb_extended_replicated_object object; + while (schema_list) { + uint32_t converted_obj_count = 0; + uint32_t failed_obj_count = 0; TALLOC_CTX *tmp_ctx = talloc_new(s); NT_STATUS_HAVE_NO_MEMORY(tmp_ctx); - /* Convert the objects into LDB messages using the - * provision schema, and either the provision or DRS - * prefix map - it should not matter, as these are - * just schema objects, so the critical parts. At - * most we would mix up the mayContain etc for new - * schema classes */ - status = dsdb_convert_object_ex(s->ldb, s->provision_schema, - cur, c->gensec_skey, - tmp_ctx, &object); - if (!W_ERROR_IS_OK(status)) { - DEBUG(1,("Warning: Failed to convert schema object %s into ldb msg\n", cur->object.identifier->dn)); - } else { - /* Convert the schema from ldb_message format - * (OIDs as OID strings) into schema, using - * the remote prefixMap */ - status = dsdb_schema_set_el_from_ldb_msg(s->ldb, s->self_made_schema, object.msg); + for (schema_list_item = schema_list; schema_list_item; schema_list_item=schema_list_next_item) { + struct dsdb_extended_replicated_object object; + + cur = schema_list_item->obj; + + /* Save the next item, now we have saved out + * the current one, so we can DLIST_REMOVE it + * safely */ + schema_list_next_item = schema_list_item->next; + + /* + * Convert the objects into LDB messages using the + * schema we have so far. It's ok if we fail to convert + * an object. We should convert more objects on next pass. + */ + status = dsdb_convert_object_ex(s->ldb, working_schema, + cur, c->gensec_skey, + tmp_ctx, &object); if (!W_ERROR_IS_OK(status)) { - DEBUG(1,("Warning: failed to convert object %s into a schema element: %s\n", - ldb_dn_get_linearized(object.msg->dn), - win_errstr(status))); + DEBUG(1,("Warning: Failed to convert schema object %s into ldb msg\n", + cur->object.identifier->dn)); + + failed_obj_count++; + } else { + /* + * Convert the schema from ldb_message format + * (OIDs as OID strings) into schema, using + * the remote prefixMap + */ + status = dsdb_schema_set_el_from_ldb_msg(s->ldb, + s->self_made_schema, + object.msg); + if (!W_ERROR_IS_OK(status)) { + DEBUG(1,("Warning: failed to convert object %s into a schema element: %s\n", + ldb_dn_get_linearized(object.msg->dn), + win_errstr(status))); + failed_obj_count++; + } else { + DLIST_REMOVE(schema_list, schema_list_item); + converted_obj_count++; + } } } talloc_free(tmp_ctx); - } - /* attach the schema we just brought over DRS to the ldb, so we can use it in dsdb_convert_object_ex below */ - ret = dsdb_set_schema(s->ldb, s->self_made_schema); - if (ret != LDB_SUCCESS) { - DEBUG(0,("Failed to attach 1st pass schema from DRS.\n")); - return NT_STATUS_FOOBAR; - } + DEBUG(4,("Schema load pass %d: %d/%d of %d objects left to be converted.\n", + pass_no, failed_obj_count, converted_obj_count, object_count)); + pass_no++; - /* Now convert the schema elements again, using the schema we loaded over DRS */ - for (i=0, cur = first_object; cur; cur = cur->next_object, i++) { - struct dsdb_extended_replicated_object object; - TALLOC_CTX *tmp_ctx = talloc_new(s); - NT_STATUS_HAVE_NO_MEMORY(tmp_ctx); + /* check if we converted any objects in this pass */ + if (converted_obj_count == 0) { + DEBUG(0,("Can't continue Schema load: didn't manage to convert any objects: all %d remaining of %d objects failed to convert\n", failed_obj_count, object_count)); + return NT_STATUS_INTERNAL_ERROR; + } - /* Convert the objects into LDB messages using the - * self_made_schema, and the DRS prefix map. We now - * know the full schema int->OID->name mapping, so we - * can get it right this time */ - status = dsdb_convert_object_ex(s->ldb, s->self_made_schema, - cur, c->gensec_skey, - tmp_ctx, &object); - if (!W_ERROR_IS_OK(status)) { - DEBUG(0,("ERROR: Failed to convert schema object %s into ldb msg\n", cur->object.identifier->dn)); - } else { - /* Convert the schema from ldb_message format - * (OIDs as OID strings) into schema, using - * the remote prefixMap, now that we know - * names for all the schema elements (from the - * first conversion) */ - status = dsdb_schema_set_el_from_ldb_msg(s->ldb, s->self_corrected_schema, object.msg); - if (!W_ERROR_IS_OK(status)) { - DEBUG(0,("ERROR: failed to convert object %s into a schema element: %s\n", - ldb_dn_get_linearized(object.msg->dn), - win_errstr(status))); + if (schema_list) { + /* prepare for another cycle */ + working_schema = s->self_made_schema; + + ret = dsdb_setup_sorted_accessors(s->ldb, working_schema); + if (LDB_SUCCESS != ret) { + DEBUG(0,("Failed to create schema-cache indexes!\n")); + return NT_STATUS_INTERNAL_ERROR; } } - talloc_free(tmp_ctx); - } + }; - /* We don't want to use the s->self_made_schema any more */ - s->self_made_schema = NULL; + /* free temp objects for 1st conversion phase */ + talloc_unlink(s, provision_schema); + TALLOC_FREE(schema_list); - /* attach the schema we just brought over DRS to the ldb */ - ret = dsdb_set_schema(s->ldb, s->self_corrected_schema); + /* + * attach the schema we just brought over DRS to the ldb, + * so we can use it in dsdb_convert_object_ex below + */ + ret = dsdb_set_schema(s->ldb, s->self_made_schema); if (ret != LDB_SUCCESS) { - DEBUG(0,("Failed to attach 2nd pass (corrected) schema from DRS.\n")); + DEBUG(0,("Failed to attach working schema from DRS.\n")); return NT_STATUS_FOOBAR; } /* we don't want to access the self made schema anymore */ - s->schema = s->self_corrected_schema; - s->self_corrected_schema = NULL; + s->schema = s->self_made_schema; + s->self_made_schema = NULL; /* Now convert the schema elements again, using the schema we finalised, ready to actually import */ status = dsdb_extended_replicated_objects_convert(s->ldb, @@ -539,18 +562,11 @@ NTSTATUS libnet_vampire_cb_schema_chunk(void *private_data, * other. */ s->self_made_schema = dsdb_new_schema(s); NT_STATUS_HAVE_NO_MEMORY(s->self_made_schema); - s->self_corrected_schema = dsdb_new_schema(s); - NT_STATUS_HAVE_NO_MEMORY(s->self_corrected_schema); status = dsdb_load_prefixmap_from_drsuapi(s->self_made_schema, mapping_ctr); if (!W_ERROR_IS_OK(status)) { return werror_to_ntstatus(status); } - - status = dsdb_load_prefixmap_from_drsuapi(s->self_corrected_schema, mapping_ctr); - if (!W_ERROR_IS_OK(status)) { - return werror_to_ntstatus(status); - } } else { status = dsdb_schema_pfm_contains_drsuapi_pfm(s->self_made_schema->prefixmap, mapping_ctr); if (!W_ERROR_IS_OK(status)) { -- Samba Shared Repository