[PATCH v2] xmlrpc/patch_list: only fetch required fields
Daniel Axtens
dja at axtens.net
Thu Oct 19 02:53:39 AEDT 2017
OzLabs noticed *massive* slowdowns in queries like this one:
SELECT "patchwork_submission"."id", "patchwork_submission"."msgid",
"patchwork_submission"."date", "patchwork_submission"."headers",
"patchwork_submission"."submitter_id",
"patchwork_submission"."content", "patchwork_submission"."project_id",
"patchwork_submission"."name", "patchwork_patch"."submission_ptr_id",
"patchwork_patch"."diff", "patchwork_patch"."commit_ref",
"patchwork_patch"."pull_url", "patchwork_patch"."delegate_id",
"patchwork_patch"."state_id", "patchwork_patch"."archived",
"patchwork_patch"."hash" FROM "patchwork_patch" INNER JOIN
"patchwork_submission" ON ("patchwork_patch"."submission_ptr_id" =
"patchwork_submission"."id") WHERE
("patchwork_submission"."project_id" = 2 AND
"patchwork_patch"."state_id" = 1) ORDER BY
"patchwork_submission"."date" ASC
These appear to be a result of pwclient list operations. We *do not*
need content/headers/diff in this case - so do not fetch them as it
is incredibly expensive - queries in excess of 50s have been observed.
This should go to stable/2.0.
Reported-by: Stephen Rothwell <sfr at canb.auug.org.au>
Reported-by: Michael Ellerman <mpe at ellerman.id.au>
Cc: Jeremy Kerr <jk at ozlabs.org>
Signed-off-by: Daniel Axtens <dja at axtens.net>
---
We're seeing this much more than in v1, I think because of the join
that is now required. More on this later.
v2: change the only() to a defer() as the defer broke Django 1.6.
If there are no objections I intend to merge this in the next couple of days.
---
patchwork/views/xmlrpc.py | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/patchwork/views/xmlrpc.py b/patchwork/views/xmlrpc.py
index 8de9d10e1d50..93f6035eb164 100644
--- a/patchwork/views/xmlrpc.py
+++ b/patchwork/views/xmlrpc.py
@@ -585,6 +585,11 @@ def patch_list(filt=None):
patches = Patch.objects.filter(**dfilter)
+ # Only extract the relevant fields. This saves a big db load as we
+ # no longer fetch content/headers/etc for potentially every patch
+ # in a project.
+ patches = patches.defer('content', 'headers', 'diff')
+
return _get_objects(patch_to_dict, patches, max_count)
--
2.11.0
More information about the Patchwork
mailing list