s4-dsdb: cope with missing backlinks in rpmd handling
authorAndrew Tridgell <tridge@samba.org>
Tue, 7 Jun 2011 00:44:48 +0000 (10:44 +1000)
committerAndrew Tridgell <tridge@samba.org>
Tue, 7 Jun 2011 02:55:37 +0000 (12:55 +1000)
if backlinks have not propogated correctly in a previous replication
this allows us to recover

source4/dsdb/samdb/ldb_modules/repl_meta_data.c

index 90933c4c792fda51cb02bd500fc299fe10ec0135..04311a4a9871d5b677530c2d0127f0e9e3a11ce0 100644 (file)
@@ -254,7 +254,16 @@ static int replmd_process_backlink(struct ldb_module *module, struct la_backlink
        msg->elements[0].flags |= LDB_FLAG_INTERNAL_DISABLE_SINGLE_VALUE_CHECK;
 
        ret = dsdb_module_modify(module, msg, DSDB_FLAG_NEXT_MODULE, parent);
-       if (ret != LDB_SUCCESS) {
+       if (ret == LDB_ERR_NO_SUCH_ATTRIBUTE && !bl->active) {
+               /* we allow LDB_ERR_NO_SUCH_ATTRIBUTE as success to
+                  cope with possible corruption where the backlink has
+                  already been removed */
+               DEBUG(0,("WARNING: backlink from %s already removed from %s - %s\n",
+                        ldb_dn_get_linearized(target_dn),
+                        ldb_dn_get_linearized(source_dn),
+                        ldb_errstring(ldb)));
+               ret = LDB_SUCCESS;
+       } else if (ret != LDB_SUCCESS) {
                ldb_asprintf_errstring(ldb, "Failed to %s backlink from %s to %s - %s",
                                       bl->active?"add":"remove",
                                       ldb_dn_get_linearized(source_dn),