From 21dae8d8329cdfad2de9050d7b6b23b0e66eb1e6 Mon Sep 17 00:00:00 2001 From: Gerrod Ubben Date: Mon, 16 Mar 2026 16:35:40 -0400 Subject: [PATCH] Add backportable management command for fixing missing repo-version content-ids (cherry picked from commit c5229ceb534b2ff316abae2096fc2480f98aa120) --- CHANGES/7465.bugfix | 1 + .../app/management/commands/datarepair.py | 37 +++++++++++++++++++ 2 files changed, 38 insertions(+) create mode 100644 CHANGES/7465.bugfix diff --git a/CHANGES/7465.bugfix b/CHANGES/7465.bugfix new file mode 100644 index 00000000000..e500ed58cee --- /dev/null +++ b/CHANGES/7465.bugfix @@ -0,0 +1 @@ +Added a management command (`pulpcore-manager datarepair 7465`) to populate the content_ids cache for all repository versions. diff --git a/pulpcore/app/management/commands/datarepair.py b/pulpcore/app/management/commands/datarepair.py index 6e1162793f8..d92b000fd47 100644 --- a/pulpcore/app/management/commands/datarepair.py +++ b/pulpcore/app/management/commands/datarepair.py @@ -38,6 +38,8 @@ def handle(self, *args, **options): self.repair_2327(options) elif issue == "7272": self.repair_7272(options) + elif issue == "7465": + self.repair_7465(options) else: raise CommandError(_("Unknown issue: '{}'").format(issue)) @@ -200,3 +202,38 @@ def repair_2327(self, options): number_unencrypted + number_multi_encrypted ) ) + + def repair_7465(self, options): + dry_run = options["dry_run"] + + number_missing = 0 + self.stdout.write() + + for domain in models.Domain.objects.all(): + has_printed_domain = False + for repo in models.Repository.objects.filter(pulp_domain=domain): + for rv in models.RepositoryVersion.objects.filter(repository=repo): + if rv.content_ids is None: + if not has_printed_domain: + self.stdout.write(f'In domain "{domain.name}"') + has_printed_domain = True + number_missing += 1 + self.stdout.write( + f'\tRepository "{repo.name}" (type "{repo.pulp_type}") ' + f"version {rv.number} has a missing content_ids cache" + ) + if not dry_run: + rv.content_ids = list( + rv._content_relationships().values_list("content__pk", flat=True) + ) + rv.save() + + if not number_missing: + self.stdout.write("Finished. (OK)") + else: + if dry_run: + self.stdout.write( + f"Finished. (dry run: {number_missing} repository versions need fixing)" + ) + else: + self.stdout.write(f"Finished. ({number_missing} repository versions fixed)")