Skip to content

purge_urls() sporadically raises ConnectionError #1349

Open
@berkerpeksag

Description

@berkerpeksag

I think this was caused by the refactoring we made in f40b171. We now send PURGE requests in the same connection object and for some reason it's being rejected by the server.

Example traceback:

TypeError: getresponse() got an unexpected keyword argument 'buffering'
  File "requests/packages/urllib3/connectionpool.py", line 353, in _make_request
    httplib_response = conn.getresponse(buffering=True)
  File "raven/breadcrumbs.py", line 375, in getresponse
    rv = real_getresponse(self, *args, **kwargs)
ConnectionResetError: [Errno 104] Connection reset by peer
  File "requests/packages/urllib3/connectionpool.py", line 518, in urlopen
    body=body, headers=headers)
  File "requests/packages/urllib3/connectionpool.py", line 355, in _make_request
    httplib_response = conn.getresponse()
  File "raven/breadcrumbs.py", line 375, in getresponse
    rv = real_getresponse(self, *args, **kwargs)
  File "http/client.py", line 1208, in getresponse
    response.begin()
  File "http/client.py", line 380, in begin
    version, status, reason = self._read_status()
  File "http/client.py", line 342, in _read_status
    line = str(self.fp.readline(_MAXLINE + 1), "iso-8859-1")
  File "python3.4/socket.py", line 374, in readinto
    return self._sock.recv_into(b)
  File "python3.4/ssl.py", line 769, in recv_into
    return self.read(nbytes, buffer)
  File "python3.4/ssl.py", line 641, in read
    v = self._sslobj.read(len, buffer)
ProtocolError: ('Connection aborted.', ConnectionResetError(104, 'Connection reset by peer'))
  File "requests/adapters.py", line 370, in send
    timeout=timeout
  File "requests/packages/urllib3/connectionpool.py", line 564, in urlopen
    _pool=self, _stacktrace=stacktrace)
  File "requests/packages/urllib3/util/retry.py", line 245, in increment
    raise six.reraise(type(error), error, _stacktrace)
  File "requests/packages/urllib3/packages/six.py", line 309, in reraise
    raise value.with_traceback(tb)
  File "requests/packages/urllib3/connectionpool.py", line 518, in urlopen
    body=body, headers=headers)
  File "requests/packages/urllib3/connectionpool.py", line 355, in _make_request
    httplib_response = conn.getresponse()
  File "raven/breadcrumbs.py", line 375, in getresponse
    rv = real_getresponse(self, *args, **kwargs)
  File "http/client.py", line 1208, in getresponse
    response.begin()
  File "http/client.py", line 380, in begin
    version, status, reason = self._read_status()
  File "http/client.py", line 342, in _read_status
    line = str(self.fp.readline(_MAXLINE + 1), "iso-8859-1")
  File "python3.4/socket.py", line 374, in readinto
    return self._sock.recv_into(b)
  File "python3.4/ssl.py", line 769, in recv_into
    return self.read(nbytes, buffer)
  File "python3.4/ssl.py", line 641, in read
    v = self._sslobj.read(len, buffer)
ConnectionError: ('Connection aborted.', ConnectionResetError(104, 'Connection reset by peer'))
  File "pythondotorg/manage.py", line 8, in <module>
    execute_from_command_line(sys.argv)
  File "django/core/management/__init__.py", line 371, in execute_from_command_line
    utility.execute()
  File "django/core/management/__init__.py", line 365, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "django/core/management/base.py", line 288, in run_from_argv
    self.execute(*args, **cmd_options)
  File "django/core/management/base.py", line 335, in execute
    output = self.handle(*args, **options)
  File "peps/management/commands/generate_pep_pages.py", line 51, in handle
    pep0_page, _ = get_pep0_page()
  File "peps/converters.py", line 62, in get_pep0_page
    page.save()
  File "cms/models.py", line 43, in save
    return super().save(**kwargs)
  File "django/db/models/base.py", line 729, in save
    force_update=force_update, update_fields=update_fields)
  File "django/db/models/base.py", line 769, in save_base
    update_fields=update_fields, raw=raw, using=using,
  File "django/dispatch/dispatcher.py", line 178, in send
    for receiver in self._live_receivers(sender)
  File "django/dispatch/dispatcher.py", line 178, in <listcomp>
    for receiver in self._live_receivers(sender)
  File "pages/models.py", line 89, in purge_fastly_cache
    purge_urls(instance.path)
  File "fastly/utils.py", line 20, in purge_urls
    session.request('PURGE', url)
  File "requests/sessions.py", line 461, in request
    resp = self.send(prep, **send_kwargs)
  File "raven/breadcrumbs.py", line 326, in send
    resp = real_send(self, request, *args, **kwargs)
  File "requests/sessions.py", line 573, in send
    r = adapter.send(request, **kwargs)
  File "requests/adapters.py", line 415, in send
    raise ConnectionError(err, request=request)

I've implemented a retry logic in master...berkerpeksag:retry, but I'm not sure if that's the best way to solve this issue. @jaap3 do you have any suggestions?

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugThis is a bug!sentryRelates to Sentry telemetry

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions