move legacy UnifiedJob stdout data to a separate unmanaged model

This data often (in the case of inventory updates) represents large data
blobs (5+MB per job run).  Storing it on the polymorphic base class
table, `main_unifiedjob`, causes it to be automatically fetched on every
query (and every polymorphic join) against that table, which can result
in _very_ poor performance for awx across the board.  Django offers
`defer()`, but it's quite complicated to sprinkle this everywhere (and
easy to get wrong/introduce side effects related to our RBAC and usage
of polymorphism).

This change moves the field definition to a separate unmanaged model
(which references the same underlying `main_unifiedjob` table) and adds
a proxy for fetching the data as needed

see https://github.com/ansible/awx/issues/200
This commit is contained in:
Ryan Petrello
2017-12-12 14:41:42 -05:00
parent 2c64a2ce63
commit 202161f090
9 changed files with 108 additions and 41 deletions

View File

@@ -516,6 +516,10 @@ class BaseTask(LogErrorsTask):
update_fields.append(field)
if field == 'status':
update_fields.append('failed')
if 'result_stdout_text' in update_fields:
# result_stdout_text is now deprecated, and is no longer
# an actual Django field (it's a property)
update_fields.remove('result_stdout_text')
instance.save(update_fields=update_fields)
return instance
except DatabaseError as e: