diff --git a/source4/dsdb/samdb/ldb_modules/repl_meta_data.c b/source4/dsdb/samdb/ldb_modules/repl_meta_data.c index 228622cfcc0..d5234d58d8c 100644 --- a/source4/dsdb/samdb/ldb_modules/repl_meta_data.c +++ b/source4/dsdb/samdb/ldb_modules/repl_meta_data.c @@ -374,8 +374,9 @@ static int replmd_process_backlink(struct ldb_module *module, struct la_backlink ret = dsdb_module_dn_by_guid(module, frame, &bl->target_guid, &target_dn, parent); if (ret != LDB_SUCCESS) { struct GUID_txt_buf guid_str; - DEBUG(2,(__location__ ": WARNING: Failed to find target DN for linked attribute with GUID %s\n", - GUID_buf_string(&bl->target_guid, &guid_str))); + DBG_WARNING("Failed to find target DN for linked attribute with GUID %s\n", + GUID_buf_string(&bl->target_guid, &guid_str)); + DBG_WARNING("Please run 'samba-tool dbcheck' to resolve any missing backlinks.\n"); talloc_free(frame); return LDB_SUCCESS; } @@ -6816,15 +6817,14 @@ static int replmd_check_target_exists(struct ldb_module *module, } else { /* - * TODO: - * We don't handle cross-partition links well here (we - * could potentially lose them), but don't fail the - * replication. + * The target of the cross-partition link is missing. + * Continue and try to at least add the forward-link. + * This isn't great, but if we can add a partial link + * then it's better than nothing. */ DEBUG(2,("Failed to resolve cross-partition link between %s and %s\n", ldb_dn_get_linearized(source_dn), ldb_dn_get_linearized(dsdb_dn->dn))); - *ignore_link = true; } } else if (target_res->count != 1) { ldb_asprintf_errstring(ldb, "More than one object found matching objectGUID %s\n", diff --git a/testprogs/blackbox/dbcheck.sh b/testprogs/blackbox/dbcheck.sh index 0f979abc7eb..387ce70eefc 100755 --- a/testprogs/blackbox/dbcheck.sh +++ b/testprogs/blackbox/dbcheck.sh @@ -27,6 +27,13 @@ dbcheck_fix_stale_links() { $BINDIR/samba-tool dbcheck --quiet --fix --yes remove_plausible_deleted_DN_links --attrs="member msDS-NC-Replica-Locations msDS-NC-RO-Replica-Locations" --cross-ncs $ARGS } +# This list of attributes can be freely extended +dbcheck_fix_crosspartition_backlinks() { + # we may not know the target yet when we receive a cross-partition link, + # which can result in a missing backlink + $BINDIR/samba-tool dbcheck --quiet --fix --yes fix_all_missing_backlinks --attrs="serverReference" --cross-ncs $ARGS +} + # This test shows that this does not do anything to a current # provision (that would be a bug) dbcheck_reset_well_known_acls() { @@ -47,6 +54,7 @@ force_modules() { dbcheck_fix_one_way_links dbcheck_fix_stale_links +dbcheck_fix_crosspartition_backlinks testit "dbcheck" dbcheck testit "reindex" reindex testit "fixed_attrs" fixed_attrs