Skip to content

Commit

Permalink
Merge pull request #4137 from chrismeyersfsu/fix-smart_inv_race
Browse files Browse the repository at this point in the history
wrap smart inv cache update w/ advisory lock

Reviewed-by: https://github.com/softwarefactory-project-zuul[bot]
  • Loading branch information
softwarefactory-project-zuul[bot] authored Jun 21, 2019
2 parents b369609 + acb6d9c commit 9f42d94
Showing 1 changed file with 20 additions and 19 deletions.
39 changes: 20 additions & 19 deletions awx/main/tasks.py
Original file line number Diff line number Diff line change
Expand Up @@ -602,25 +602,26 @@ def update_inventory_computed_fields(inventory_id, should_update_hosts=True):


def update_smart_memberships_for_inventory(smart_inventory):
current = set(SmartInventoryMembership.objects.filter(inventory=smart_inventory).values_list('host_id', flat=True))
new = set(smart_inventory.hosts.values_list('id', flat=True))
additions = new - current
removals = current - new
if additions or removals:
with transaction.atomic():
if removals:
SmartInventoryMembership.objects.filter(inventory=smart_inventory, host_id__in=removals).delete()
if additions:
add_for_inventory = [
SmartInventoryMembership(inventory_id=smart_inventory.id, host_id=host_id)
for host_id in additions
]
SmartInventoryMembership.objects.bulk_create(add_for_inventory)
logger.debug('Smart host membership cached for {}, {} additions, {} removals, {} total count.'.format(
smart_inventory.pk, len(additions), len(removals), len(new)
))
return True # changed
return False
with advisory_lock('update_smart_memberships_for_inventory-{}'.format(smart_inventory.id)):
current = set(SmartInventoryMembership.objects.filter(inventory=smart_inventory).values_list('host_id', flat=True))
new = set(smart_inventory.hosts.values_list('id', flat=True))
additions = new - current
removals = current - new
if additions or removals:
with transaction.atomic():
if removals:
SmartInventoryMembership.objects.filter(inventory=smart_inventory, host_id__in=removals).delete()
if additions:
add_for_inventory = [
SmartInventoryMembership(inventory_id=smart_inventory.id, host_id=host_id)
for host_id in additions
]
SmartInventoryMembership.objects.bulk_create(add_for_inventory)
logger.debug('Smart host membership cached for {}, {} additions, {} removals, {} total count.'.format(
smart_inventory.pk, len(additions), len(removals), len(new)
))
return True # changed
return False


@task()
Expand Down

0 comments on commit 9f42d94

Please sign in to comment.