pretix / pretix

Ticket shop application for conferences, festivals, concerts, tech events, shows, exhibitions, workshops, barcamps, etc.
https://pretix.eu
Other
1.82k stars 456 forks source link

Internal Server Error when editing order with many tickets #2872

Open neumantm opened 1 year ago

neumantm commented 1 year ago

Problem and impact

When trying (as an admin) to edit an order with many tickets (in my case 250), I get an internal server error. This prevents me from editing such large tickets.

In the server log I get

ERROR 2022-10-27 16:17:54,318 django.request log Internal Server Error: /control/event/emo22/shop/orders/9HZAS/change
Traceback (most recent call last):
  File "/usr/local/lib/python3.9/site-packages/django/db/utils.py", line 97, in inner
    return func(*args, **kwargs)
psycopg2.errors.InvalidCursorName: cursor "_django_curs_140056561694528_sync_240" does not exist

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/usr/local/lib/python3.9/site-packages/django/db/models/sql/compiler.py", line 1646, in cursor_iter
    for rows in iter((lambda: cursor.fetchmany(itersize)), sentinel):
  File "/usr/local/lib/python3.9/site-packages/django/db/models/sql/compiler.py", line 1646, in <lambda>
    for rows in iter((lambda: cursor.fetchmany(itersize)), sentinel):
  File "/usr/local/lib/python3.9/site-packages/django/db/utils.py", line 97, in inner
    return func(*args, **kwargs)
  File "/usr/local/lib/python3.9/site-packages/django/db/utils.py", line 90, in __exit__
    raise dj_exc_value.with_traceback(traceback) from exc_value
  File "/usr/local/lib/python3.9/site-packages/django/db/utils.py", line 97, in inner
    return func(*args, **kwargs)
django.db.utils.OperationalError: cursor "_django_curs_140056561694528_sync_240" does not exist

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/local/lib/python3.9/site-packages/django/core/handlers/exception.py", line 47, in inner
    response = get_response(request)
  File "/usr/local/lib/python3.9/site-packages/django/core/handlers/base.py", line 204, in _get_response
    response = response.render()
  File "/usr/local/lib/python3.9/site-packages/django/template/response.py", line 105, in render
    self.content = self.rendered_content
  File "/usr/local/lib/python3.9/site-packages/django/template/response.py", line 83, in rendered_content
    return template.render(context, self._request)
  File "/usr/local/lib/python3.9/site-packages/django/template/backends/django.py", line 61, in render
    return self.template.render(context)
  File "/usr/local/lib/python3.9/site-packages/django/template/base.py", line 170, in render
    return self._render(context)
  File "/usr/local/lib/python3.9/site-packages/django/template/base.py", line 162, in _render
    return self.nodelist.render(context)
  File "/usr/local/lib/python3.9/site-packages/django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "/usr/local/lib/python3.9/site-packages/django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "/usr/local/lib/python3.9/site-packages/django/template/loader_tags.py", line 150, in render
    return compiled_parent._render(context)
  File "/usr/local/lib/python3.9/site-packages/django/template/base.py", line 162, in _render
    return self.nodelist.render(context)
  File "/usr/local/lib/python3.9/site-packages/django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "/usr/local/lib/python3.9/site-packages/django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "/usr/local/lib/python3.9/site-packages/django/template/loader_tags.py", line 150, in render
    return compiled_parent._render(context)
  File "/usr/local/lib/python3.9/site-packages/django/template/base.py", line 162, in _render
    return self.nodelist.render(context)
  File "/usr/local/lib/python3.9/site-packages/django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "/usr/local/lib/python3.9/site-packages/django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "/usr/local/lib/python3.9/site-packages/django/template/loader_tags.py", line 62, in render
    result = block.nodelist.render(context)
  File "/usr/local/lib/python3.9/site-packages/django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "/usr/local/lib/python3.9/site-packages/django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "/usr/local/lib/python3.9/site-packages/django/template/defaulttags.py", line 214, in render
    nodelist.append(node.render_annotated(context))
  File "/usr/local/lib/python3.9/site-packages/django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "/usr/local/lib/python3.9/site-packages/django/template/library.py", line 192, in render
    output = self.func(*resolved_args, **resolved_kwargs)
  File "/usr/local/lib/python3.9/site-packages/bootstrap3/templatetags/bootstrap3.py", line 505, in bootstrap_field
    return render_field(*args, **kwargs)
  File "/usr/local/lib/python3.9/site-packages/bootstrap3/forms.py", line 54, in render_field
    return renderer_cls(field, **kwargs).render()
  File "/usr/local/lib/python3.9/site-packages/bootstrap3/renderers.py", line 85, in render
    return mark_safe(self._render())
  File "/usr/local/lib/python3.9/site-packages/bootstrap3/renderers.py", line 480, in _render
    html = self.field.as_widget(attrs=self.widget.attrs)
  File "/usr/local/lib/python3.9/site-packages/django/forms/boundfield.py", line 93, in as_widget
    return widget.render(
  File "/usr/local/lib/python3.9/site-packages/django/forms/widgets.py", line 246, in render
    context = self.get_context(name, value, attrs)
  File "/usr/local/lib/python3.9/site-packages/django/forms/widgets.py", line 683, in get_context
    context = super().get_context(name, value, attrs)
  File "/usr/local/lib/python3.9/site-packages/django/forms/widgets.py", line 644, in get_context
    context['widget']['optgroups'] = self.optgroups(name, context['widget']['value'], attrs)
  File "/usr/local/lib/python3.9/site-packages/django/forms/widgets.py", line 592, in optgroups
    for index, (option_value, option_label) in enumerate(self.choices):
  File "/usr/local/lib/python3.9/site-packages/django/forms/models.py", line 1169, in __iter__
    for obj in queryset:
  File "/usr/local/lib/python3.9/site-packages/django/db/models/query.py", line 353, in _iterator
    yield from self._iterable_class(self, chunked_fetch=use_chunked_fetch, chunk_size=chunk_size)
  File "/usr/local/lib/python3.9/site-packages/django/db/models/query.py", line 68, in __iter__
    for row in compiler.results_iter(results):
  File "/usr/local/lib/python3.9/site-packages/django/db/models/sql/compiler.py", line 1118, in apply_converters
    for row in map(list, rows):
  File "/usr/local/lib/python3.9/site-packages/django/db/models/sql/compiler.py", line 1649, in cursor_iter
    cursor.close()
psycopg2.errors.InvalidCursorName: cursor "_django_curs_140056561694528_sync_240" does not exist

I can reproduce the issue on my production instance most of the time but not every time. I did not have time yet to check the minimal setup for reproduction on a test instance.

Expected behaviour

Don't return an internal server error.

Steps to reproduce

  1. Create order with many tickets
  2. As an admin edit that order

Screenshots

pretixbug1

Link

https://tickets-emotions.stuvus.uni-stuttgart.de/control/event/emo22/shop/orders/9HZAS/

Browser (software, desktop or mobile?) and version

No response

Operating system, dependency versions

Docker pretix/standalone:4.7

Version

Docker pretix/standalone:4.7

yvovandoorn commented 1 year ago

I'm not a Pretix developer but I believe DEBUG is needed here in order to have the SQL statement causing this issue be printed alongside the error. First things first I'd suggest upgrading to the most current version (4.15, but likely 4.16 in a week or so) of Pretix to see if isn't already addressed.