rpc_server-drsuapi/getncchanges: Reload the schema and re-run failed conversions
authorAndrew Bartlett <abartlet@samba.org>
Fri, 19 Jul 2013 06:18:54 +0000 (16:18 +1000)
committerStefan Metzmacher <metze@samba.org>
Sun, 29 Jun 2014 21:45:24 +0000 (23:45 +0200)
source4/rpc_server/drsuapi/getncchanges.c

index c6e5aa181e0890582715c5a4e29a1cce77ae713c..b1cafbbe667b47f428990a4ddc278275326c7be2 100644 (file)
@@ -257,7 +257,7 @@ static WERROR get_nc_changes_build_object(struct drsuapi_DsReplicaObjectListItem
                        DEBUG(0,(__location__ ": Failed to find attribute in schema for attrid %u mentioned in replPropertyMetaData of %s\n", 
                                 (unsigned int)md.ctr.ctr1.array[i].attid, 
                                 ldb_dn_get_linearized(msg->dn)));
-                       return WERR_DS_DRA_INTERNAL_ERROR;              
+                       return WERR_DS_DRA_SCHEMA_MISMATCH;             
                }
 
                if (sa->linkID) {
@@ -1949,6 +1949,29 @@ allowed:
                                                   req10->uptodateness_vector,
                                                   req10->extended_op,
                                                   max_wait_reached);
+
+               /* Retry if the schema changed under our feet */
+               if (W_ERROR_EQUAL(werr, WERR_DS_DRA_SCHEMA_MISMATCH)) {
+                       /* Force a reload */
+                       schema->last_refresh = 0;
+                       schema->metadata_usn = 0;
+                       talloc_unlink(mem_ctx, schema);
+                       
+                       schema = dsdb_get_schema(sam_ctx, mem_ctx);
+                       if (!schema) {
+                               DEBUG(0,("No schema in sam_ctx\n"));
+                               return WERR_DS_DRA_INTERNAL_ERROR;
+                       }
+                       werr = get_nc_changes_build_object(obj, msg,
+                                                          sam_ctx, getnc_state->ncRoot_dn,
+                                                          getnc_state->is_schema_nc,
+                                                          schema, &session_key, getnc_state->min_usn,
+                                                          req10->replica_flags,
+                                                          req10->partial_attribute_set,
+                                                          req10->uptodateness_vector,
+                                                          req10->extended_op,
+                                                          max_wait_reached);
+               }
                if (!W_ERROR_IS_OK(werr)) {
                        return werr;
                }