Stephen Finucane <step...@that.guru> writes: > The dropdown select-based filters in the web view of the REST API have > stung us a few times. In this case, populating these filters for the > '/events' endpoint results in a huge query that hammers the database and > results in seriously laggy responses.
This is good and solves the problem, thank you. > > The root cause of this performance issues was erroneously identified as > an issue with the JSON renderer so that particular patch can now be > reverted. This will be done separately. > > Signed-off-by: Stephen Finucane <step...@that.guru> > Cc: Daniel Axtens <d...@axtens.net> > --- > We might want to look at extending this to other endpoint, which are > probably seeing similar issues (albeit, not as severe). I haven't done > this yet though, out of fear of engaging in premature optimization > [1]. It's definitely a problem with other endpoints: /api/patches takes ~10s. I think it might end up being an issue with series and covers if we have enough of them, but that doesn't show up on my test instance. Tested-by: Daniel Axtens <d...@axtens.net> Regards, Daniel > > [1] https://xkcd.com/1691/ > --- > patchwork/api/filters.py | 16 ++++++++++++---- > 1 file changed, 12 insertions(+), 4 deletions(-) > > diff --git a/patchwork/api/filters.py b/patchwork/api/filters.py > index f6fff792..7e818954 100644 > --- a/patchwork/api/filters.py > +++ b/patchwork/api/filters.py > @@ -24,6 +24,7 @@ from django_filters.rest_framework import FilterSet > from django_filters import IsoDateTimeFilter > from django_filters import ModelMultipleChoiceFilter > from django.forms import ModelMultipleChoiceField as BaseMultipleChoiceField > +from django.forms.widgets import MultipleHiddenInput > > from patchwork.models import Bundle > from patchwork.models import Check > @@ -200,10 +201,17 @@ class CheckFilterSet(TimestampMixin, FilterSet): > > class EventFilterSet(TimestampMixin, FilterSet): > > - project = ProjectFilter(queryset=Project.objects.all()) > - series = BaseFilter(queryset=Series.objects.all()) > - patch = BaseFilter(queryset=Patch.objects.all()) > - cover = BaseFilter(queryset=CoverLetter.objects.all()) > + # NOTE(stephenfin): We disable the select-based HTML widgets for these > + # filters as the resulting query is _huge_ > + # TODO(stephenfin): We should really use an AJAX widget of some form here > + project = ProjectFilter(queryset=Project.objects.all(), > + widget=MultipleHiddenInput) > + series = BaseFilter(queryset=Series.objects.all(), > + widget=MultipleHiddenInput) > + patch = BaseFilter(queryset=Patch.objects.all(), > + widget=MultipleHiddenInput) > + cover = BaseFilter(queryset=CoverLetter.objects.all(), > + widget=MultipleHiddenInput) > > class Meta: > model = Event > -- > 2.14.3 _______________________________________________ Patchwork mailing list Patchwork@lists.ozlabs.org https://lists.ozlabs.org/listinfo/patchwork