From 1144b2e27d787b824d39b8dcc952ca44b54ecce4 Mon Sep 17 00:00:00 2001 From: Peter Eckel Date: Thu, 27 Jun 2024 18:05:55 +0000 Subject: [PATCH 1/2] Do not delete all search indexes when reindexing specific models * Clear all indexes only if neither --lazy nor a list of models are specified for "manage.py reindex" * Otherwise, clear the index for a model immediately before rebuilding it --- netbox/extras/management/commands/reindex.py | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/netbox/extras/management/commands/reindex.py b/netbox/extras/management/commands/reindex.py index e20fad0ceb8..51241af9393 100644 --- a/netbox/extras/management/commands/reindex.py +++ b/netbox/extras/management/commands/reindex.py @@ -67,8 +67,8 @@ def handle(self, *model_labels, **kwargs): self.stdout.write(f'Reindexing {len(indexers)} models.') # Clear all cached values for the specified models (if not being lazy) - if not kwargs['lazy']: - self.stdout.write('Clearing cached values... ', ending='') + if not kwargs['lazy'] and not model_labels: + self.stdout.write('Clearing all cached values... ', ending='') self.stdout.flush() deleted_count = search_backend.clear() self.stdout.write(f'{deleted_count} entries deleted.') @@ -81,12 +81,19 @@ def handle(self, *model_labels, **kwargs): self.stdout.write(f' {app_label}.{model_name}... ', ending='') self.stdout.flush() - if kwargs['lazy']: - content_type = ContentType.objects.get_for_model(model) - if cached_count := search_backend.count(object_types=[content_type]): + content_type = ContentType.objects.get_for_model(model) + cached_count = search_backend.count(object_types=[content_type]) + + if cached_count: + if kwargs['lazy']: self.stdout.write(f'Skipping (found {cached_count} existing).') continue + if model_labels: + self.stdout.write(f'clearing {cached_count} cached values... ', ending='') + self.stdout.flush() + search_backend.clear(object_types=[content_type]) + i = search_backend.cache(model.objects.iterator(), remove_existing=False) if i: self.stdout.write(f'{i} entries cached.') From 3f9b7d9488ee437c83041296629178da153f9781 Mon Sep 17 00:00:00 2001 From: Peter Eckel Date: Sun, 30 Jun 2024 16:10:11 +0000 Subject: [PATCH 2/2] Separated clearing from re-indexing the search cache --- netbox/extras/management/commands/reindex.py | 26 +++++++++----------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/netbox/extras/management/commands/reindex.py b/netbox/extras/management/commands/reindex.py index 51241af9393..5aab745115a 100644 --- a/netbox/extras/management/commands/reindex.py +++ b/netbox/extras/management/commands/reindex.py @@ -66,11 +66,16 @@ def handle(self, *model_labels, **kwargs): raise CommandError(_("No indexers found!")) self.stdout.write(f'Reindexing {len(indexers)} models.') - # Clear all cached values for the specified models (if not being lazy) - if not kwargs['lazy'] and not model_labels: - self.stdout.write('Clearing all cached values... ', ending='') + # Clear cached values for the specified models (if not being lazy) + if not kwargs['lazy']: + if model_labels: + content_types = [ContentType.objects.get_for_model(model) for model in indexers.keys()] + else: + content_types = None + + self.stdout.write('Clearing cached values... ', ending='') self.stdout.flush() - deleted_count = search_backend.clear() + deleted_count = search_backend.clear(object_types=content_types) self.stdout.write(f'{deleted_count} entries deleted.') # Index models @@ -81,19 +86,12 @@ def handle(self, *model_labels, **kwargs): self.stdout.write(f' {app_label}.{model_name}... ', ending='') self.stdout.flush() - content_type = ContentType.objects.get_for_model(model) - cached_count = search_backend.count(object_types=[content_type]) - - if cached_count: - if kwargs['lazy']: + if kwargs['lazy']: + content_type = ContentType.objects.get_for_model(model) + if cached_count := search_backend.count(object_types=[content_type]): self.stdout.write(f'Skipping (found {cached_count} existing).') continue - if model_labels: - self.stdout.write(f'clearing {cached_count} cached values... ', ending='') - self.stdout.flush() - search_backend.clear(object_types=[content_type]) - i = search_backend.cache(model.objects.iterator(), remove_existing=False) if i: self.stdout.write(f'{i} entries cached.')