From a0fb9bef3a1b92f125c43deca609b405b4c5c3f8 Mon Sep 17 00:00:00 2001 From: Alan Rominger Date: Wed, 23 Oct 2019 08:25:00 -0400 Subject: [PATCH] Disable activity stream and speed up host group bulk deletion (#3817) --- awx/api/views/__init__.py | 38 +++++++++++++++++++++++++++----------- awx/main/models/base.py | 5 ++++- 2 files changed, 31 insertions(+), 12 deletions(-) diff --git a/awx/api/views/__init__.py b/awx/api/views/__init__.py index f337345df9..63325abe2a 100644 --- a/awx/api/views/__init__.py +++ b/awx/api/views/__init__.py @@ -2136,12 +2136,21 @@ class InventorySourceHostsList(HostRelatedSearchMixin, SubListDestroyAPIView): def perform_list_destroy(self, instance_list): inv_source = self.get_parent_object() with ignore_inventory_computed_fields(): - # Activity stream doesn't record disassociation here anyway - # no signals-related reason to not bulk-delete - models.Host.groups.through.objects.filter( - host__inventory_sources=inv_source - ).delete() - r = super(InventorySourceHostsList, self).perform_list_destroy(instance_list) + if not settings.ACTIVITY_STREAM_ENABLED_FOR_INVENTORY_SYNC: + from awx.main.signals import disable_activity_stream + with disable_activity_stream(): + # job host summary deletion necessary to avoid deadlock + models.JobHostSummary.objects.filter(host__inventory_sources=inv_source).update(host=None) + models.Host.objects.filter(inventory_sources=inv_source).delete() + r = super(InventorySourceHostsList, self).perform_list_destroy([]) + else: + # Advance delete of group-host memberships to prevent deadlock + # Activity stream doesn't record disassociation here anyway + # no signals-related reason to not bulk-delete + models.Host.groups.through.objects.filter( + host__inventory_sources=inv_source + ).delete() + r = super(InventorySourceHostsList, self).perform_list_destroy(instance_list) update_inventory_computed_fields.delay(inv_source.inventory_id, True) return r @@ -2157,11 +2166,18 @@ class InventorySourceGroupsList(SubListDestroyAPIView): def perform_list_destroy(self, instance_list): inv_source = self.get_parent_object() with ignore_inventory_computed_fields(): - # Same arguments for bulk delete as with host list - models.Group.hosts.through.objects.filter( - group__inventory_sources=inv_source - ).delete() - r = super(InventorySourceGroupsList, self).perform_list_destroy(instance_list) + if not settings.ACTIVITY_STREAM_ENABLED_FOR_INVENTORY_SYNC: + from awx.main.signals import disable_activity_stream + with disable_activity_stream(): + models.Group.objects.filter(inventory_sources=inv_source).delete() + r = super(InventorySourceGroupsList, self).perform_list_destroy([]) + else: + # Advance delete of group-host memberships to prevent deadlock + # Same arguments for bulk delete as with host list + models.Group.hosts.through.objects.filter( + group__inventory_sources=inv_source + ).delete() + r = super(InventorySourceGroupsList, self).perform_list_destroy(instance_list) update_inventory_computed_fields.delay(inv_source.inventory_id, True) return r diff --git a/awx/main/models/base.py b/awx/main/models/base.py index 70fa92cf0a..915b18977f 100644 --- a/awx/main/models/base.py +++ b/awx/main/models/base.py @@ -295,7 +295,10 @@ class PrimordialModel(HasEditsMixin, CreatedModifiedModel): def __init__(self, *args, **kwargs): r = super(PrimordialModel, self).__init__(*args, **kwargs) - self._prior_values_store = self._get_fields_snapshot() + if self.pk: + self._prior_values_store = self._get_fields_snapshot() + else: + self._prior_values_store = {} return r def save(self, *args, **kwargs):