Opened 4 years ago

Closed 4 years ago

Last modified 4 years ago

#31091 closed Bug (invalid)

ConnectionResetError: [Errno 104] Connection reset by peer with a simple GET call.

Reported by: aleaforny Owned by: nobody
Component: HTTP handling Version: dev
Severity: Normal Keywords:
Cc: Florian Apolloner Triage Stage: Unreviewed
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description (last modified by Mariusz Felisiak)

Hello,

I have this pretty simple GET api method (I use djangorestframework, but the issue is still related to Django itself, see all my explanations):

from rest_framework import generics, status
from rest_framework.response import Response
from django.conf import settings

class Monitoring(generics.RetrieveAPIView):
    def retrieve(self, request, *args, **kwargs):
        return Response({
            "app_build": settings.APP_BUILD_NUMBER,
        }, status=status.HTTP_200_OK
        )

I was using Django Version 2.1.1, everything was working perfectly fine.

Then, I upgraded to version Django 2.2.8, and I suddenly get the following error (for all my API call, but I took the simplest as an example) :

[14/Dec/2019 23:18:29] "GET /monitoring HTTP/1.1" 200 38
----------------------------------------
Exception happened during processing of request from ('x.y.z.x', 53609)
Traceback (most recent call last):
  File "/opt/rh/rh-python36/root/usr/lib64/python3.6/socketserver.py", line 654, in process_request_thread
    self.finish_request(request, client_address)
  File "/opt/rh/rh-python36/root/usr/lib64/python3.6/socketserver.py", line 364, in finish_request
    self.RequestHandlerClass(request, client_address, self)
  File "/opt/rh/rh-python36/root/usr/lib64/python3.6/socketserver.py", line 724, in __init__
    self.handle()
  File "/opt/rh/rh-python36/root/usr/lib/python3.6/site-packages/django/core/servers/basehttp.py", line 153, in handle
    self.handle_one_request()
  File "/opt/rh/rh-python36/root/usr/lib/python3.6/site-packages/django/core/servers/basehttp.py", line 161, in handle_one_request
    self.raw_requestline = self.rfile.readline(65537)
  File "/opt/rh/rh-python36/root/usr/lib64/python3.6/socket.py", line 586, in readinto
    return self._sock.recv_into(b)
ConnectionResetError: [Errno 104] Connection reset by peer
----------------------------------------

FYI, I'm using Python 2.6.9 version

By the way, these APIs are sending me the response as expected, these errors are just printed on Django console, so I guess it's not critical nor preventing Django to work as expected, but it's still annoying to get these errors everytime now.

I just did one thing: Tried different versions of Django (using pip3.6), and here the result I got :

  • Django 2.1.1: Working as expected
  • Django 2.1.3: Working as expected
  • Django 2.1.4: Error
  • Django 2.1.5: Error
  • Django 2.1.15: Error
  • Django 2.2.0: Error
  • Django 2.2.8: Error

So I guess something happened between Django 2.1.3 and 2.1.4 but can't figure what.

Thanks for the help!
Kindly

Change History (3)

comment:1 by Mariusz Felisiak, 4 years ago

Cc: Florian Apolloner added
Description: modified (diff)
Resolution: wontfix
Status: newclosed
Summary: ConnectionResetError: [Errno 104] Connection reset by peer with a simple GET callConnectionResetError: [Errno 104] Connection reset by peer with a simple GET call.
Version: 2.2master

Thanks for this report, however I cannot reproduce this issue with Python 3.6.9 and Django 2.2.8.

This can be a side effect of 934acf1126995f6e6ccba5947ec8f7561633c27f (ticket #29849), see a commit message:

The combination of those two fixes resulted in yet another problem:
HTTP/1.1 by default allows a client to assume that keep-alive is
supported unless the server disables it via 'Connection: close' -- see
RFC2616 8.1.2.1 for details on persistent connection negotiation. Now if
the client receives a response from Django without 'Connection: close'
and immediately sends a new request (on the same tcp connection) before
our server closes the tcp connection, it will error out at some point
because the connection does get closed a few milli seconds later.

but I don't think that there is anything we can improve in Django.

comment:2 by Mariusz Felisiak, 4 years ago

Resolution: wontfixinvalid

in reply to:  1 comment:3 by aleaforny, 4 years ago

Replying to felixxm:

Thanks for this report, however I cannot reproduce this issue with Python 3.6.9 and Django 2.2.8.

This can be a side effect of 934acf1126995f6e6ccba5947ec8f7561633c27f (ticket #29849), see a commit message:

The combination of those two fixes resulted in yet another problem:
HTTP/1.1 by default allows a client to assume that keep-alive is
supported unless the server disables it via 'Connection: close' -- see
RFC2616 8.1.2.1 for details on persistent connection negotiation. Now if
the client receives a response from Django without 'Connection: close'
and immediately sends a new request (on the same tcp connection) before
our server closes the tcp connection, it will error out at some point
because the connection does get closed a few milli seconds later.

but I don't think that there is anything we can improve in Django.

Good shot! That's nothing to improve in Django directly, indeed!

I've just added the header Connection: close and it fixed it (for those who may encounter this issue as well)

Thanks again for your help

Note: See TracTickets for help on using tickets.
Back to Top