Flask-SocketIO: Flask_SocketIO (OverFlow) Session if i had any Flask_login or SQLAlchemy commands within any of it's funtions

the server breaks with this error within 10-11 refreshes or left it for about 2-5 mins (please note: this server is hosted locally for development only and I’m the only user on it, there is not reason for it to get overflow without a fundamental issue.) sqlalchemy.exc.TimeoutError: QueuePool limit of size 5 overflow 10 reached, connection timed out, timeout 30 (Background on this error at: http://sqlalche.me/e/13/3o7r) followed by this error BrokenPipeError: [WinError 10058] A request to send or receive data was disallowed because the socket had already been shut down in that direction with a previous shutdown call

I have this code running on it. `@socketio.on(‘custom_emit’)

def custom_emit(data):

if current_user.is_authenticated:  # (**FLASK_LOGIN**)

    _id = current_user.get_id() # (**FLASK_LOGIN**)
    
    x = users.query.filter_by(1).first() # (**FLASK_SQLALCHEMY**)
    
    socketio.emit('update_me',{'my_id':x })`

if I make 5-15 refreshes with this code I get the previously mentioned error

If I removed BOTH (FLASK_LOGIN & FLASK_SQLALCHEMY) from the code and only used regular python or socketIO commands , I could spam refreshing as much as I want.

I could use Flask_SQLALECHMY with Flask_Login together but once SOCKETIO is involved, apparently opened sessions doesn’t get teardown.

details on my system’s configurations

app = Flask(__name__)
app.secret_key= _hidden_
app.config['WTF_CSRF_SECRET_KEY'] = _hidden_


app.config['SQLALCHEMY_DATABASE_URI']=  _hidden_
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)


login = LoginManager(app)
login.init_app(app)


@app.teardown_appcontext
def shutdown_session(exception=None):
    print(f'\n now shutting down request:{db.session} \n')
    db.session.remove()


@login.user_loader
def load_user(n):
    try:
        return users.query.get(int(n))
    except:
        return None

socketio = SocketIO(app, manage_session=False)

if __name__ == "__main__":
    socketio.run(app,debug=True )

more details on the errors

Traceback (most recent call last):
  File "<hidden_python_directory>\lib\site-packages\eventlet\wsgi.py", line 573, in handle_one_response
    result = self.application(self.environ, start_response)
  File "<hidden_python_directory>\lib\site-packages\flask\app.py", line 2464, in __call__
    return self.wsgi_app(environ, start_response)
  File "<hidden_python_directory>\lib\site-packages\flask_socketio\__init__.py", line 45, in __call__
    return super(_SocketIOMiddleware, self).__call__(environ,
  File "<hidden_python_directory>\lib\site-packages\engineio\middleware.py", line 60, in __call__
    return self.engineio_app.handle_request(environ, start_response)
  File "<hidden_python_directory>\lib\site-packages\socketio\server.py", line 571, in handle_request
    return self.eio.handle_request(environ, start_response)
  File "<hidden_python_directory>\lib\site-packages\engineio\server.py", line 392, in handle_request
    packets = socket.handle_get_request(
  File "<hidden_python_directory>\lib\site-packages\engineio\socket.py", line 103, in handle_get_request
    return getattr(self, '_upgrade_' + transport)(environ,
  File "<hidden_python_directory>\lib\site-packages\engineio\socket.py", line 158, in _upgrade_websocket
    return ws(environ, start_response)
  File "<hidden_python_directory>\lib\site-packages\engineio\async_drivers\eventlet.py", line 20, in __call__
    return super(WebSocketWSGI, self).__call__(environ, start_response)
  File "<hidden_python_directory>\lib\site-packages\eventlet\websocket.py", line 130, in __call__
    self.handler(ws)
  File "<hidden_python_directory>\lib\site-packages\engineio\socket.py", line 184, in _websocket_handler
    pkt = ws.wait()
  File "<hidden_python_directory>\lib\site-packages\eventlet\websocket.py", line 788, in wait
    for i in self.iterator:
  File "<hidden_python_directory>\lib\site-packages\eventlet\websocket.py", line 643, in _iter_frames
    message = self._recv_frame(message=fragmented_message)
  File "<hidden_python_directory>\lib\site-packages\eventlet\websocket.py", line 669, in _recv_frame
    header = recv(2)
  File "<hidden_python_directory>\lib\site-packages\eventlet\websocket.py", line 578, in _get_bytes
    d = self.socket.recv(numbytes - len(data))
  File "<hidden_python_directory>\lib\site-packages\eventlet\greenio\base.py", line 365, in recv
    return self._recv_loop(self.fd.recv, b'', bufsize, flags)
  File "<hidden_python_directory>\lib\site-packages\eventlet\greenio\base.py", line 359, in _recv_loop
    self._read_trampoline()
  File "<hidden_python_directory>\lib\site-packages\eventlet\greenio\base.py", line 327, in _read_trampoline
    self._trampoline(
  File "<hidden_python_directory>\lib\site-packages\eventlet\greenio\base.py", line 208, in _trampoline
    return trampoline(fd, read=read, write=write, timeout=timeout,
  File "<hidden_python_directory>\lib\site-packages\eventlet\hubs\__init__.py", line 159, in trampoline
    return hub.switch()
  File "<hidden_python_directory>\lib\site-packages\eventlet\hubs\hub.py", line 313, in switch
    return self.greenlet.switch()
socket.timeout: timed out

127.0.0.1 - - [12/Mar/2021 13:36:55] "GET /socket.io/?EIO=4&transport=websocket&sid=Wu2Ou1x4dEJnfaynAAAo HTTP/1.1" 500 0 30.117126
Traceback (most recent call last):
  File "<hidden_python_directory>\lib\site-packages\eventlet\wsgi.py", line 573, in handle_one_response
    result = self.application(self.environ, start_response)
  File "<hidden_python_directory>\lib\site-packages\flask\app.py", line 2464, in __call__
    return self.wsgi_app(environ, start_response)
  File "<hidden_python_directory>\lib\site-packages\flask_socketio\__init__.py", line 45, in __call__
    return super(_SocketIOMiddleware, self).__call__(environ,
  File "<hidden_python_directory>\lib\site-packages\engineio\middleware.py", line 60, in __call__
    return self.engineio_app.handle_request(environ, start_response)
  File "<hidden_python_directory>\lib\site-packages\socketio\server.py", line 571, in handle_request
    return self.eio.handle_request(environ, start_response)
  File "<hidden_python_directory>\lib\site-packages\engineio\server.py", line 392, in handle_request
    packets = socket.handle_get_request(
  File "<hidden_python_directory>\lib\site-packages\engineio\socket.py", line 103, in handle_get_request
    return getattr(self, '_upgrade_' + transport)(environ,
  File "<hidden_python_directory>\lib\site-packages\engineio\socket.py", line 158, in _upgrade_websocket
    return ws(environ, start_response)
  File "<hidden_python_directory>\lib\site-packages\engineio\async_drivers\eventlet.py", line 20, in __call__
    return super(WebSocketWSGI, self).__call__(environ, start_response)
  File "<hidden_python_directory>\lib\site-packages\eventlet\websocket.py", line 130, in __call__
    self.handler(ws)
  File "<hidden_python_directory>\lib\site-packages\engineio\socket.py", line 184, in _websocket_handler
    pkt = ws.wait()
  File "<hidden_python_directory>\lib\site-packages\eventlet\websocket.py", line 788, in wait
    for i in self.iterator:
  File "<hidden_python_directory>\lib\site-packages\eventlet\websocket.py", line 643, in _iter_frames
    message = self._recv_frame(message=fragmented_message)
  File "<hidden_python_directory>\lib\site-packages\eventlet\websocket.py", line 669, in _recv_frame
    header = recv(2)
  File "<hidden_python_directory>\lib\site-packages\eventlet\websocket.py", line 578, in _get_bytes
    d = self.socket.recv(numbytes - len(data))
  File "<hidden_python_directory>\lib\site-packages\eventlet\greenio\base.py", line 365, in recv
    return self._recv_loop(self.fd.recv, b'', bufsize, flags)
  File "<hidden_python_directory>\lib\site-packages\eventlet\greenio\base.py", line 359, in _recv_loop
    self._read_trampoline()
  File "<hidden_python_directory>\lib\site-packages\eventlet\greenio\base.py", line 327, in _read_trampoline
    self._trampoline(
  File "<hidden_python_directory>\lib\site-packages\eventlet\greenio\base.py", line 208, in _trampoline
    return trampoline(fd, read=read, write=write, timeout=timeout,
  File "<hidden_python_directory>\lib\site-packages\eventlet\hubs\__init__.py", line 159, in trampoline
    return hub.switch()
  File "<hidden_python_directory>\lib\site-packages\eventlet\hubs\hub.py", line 313, in switch
    return self.greenlet.switch()
socket.timeout: timed out

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<hidden_python_directory>\lib\site-packages\eventlet\wsgi.py", line 357, in __init__
    self.handle()
  File "<hidden_python_directory>\lib\site-packages\eventlet\wsgi.py", line 390, in handle
    self.handle_one_request()
  File "<hidden_python_directory>\lib\site-packages\eventlet\wsgi.py", line 466, in handle_one_request
    self.handle_one_response()
  File "<hidden_python_directory>\lib\site-packages\eventlet\wsgi.py", line 616, in handle_one_response
    write(err_body)
  File "<hidden_python_directory>\lib\site-packages\eventlet\wsgi.py", line 538, in write
    wfile.flush()
  File "<hidden_python_directory>\lib\socket.py", line 722, in write
    return self._sock.send(b)
  File "<hidden_python_directory>\lib\site-packages\eventlet\greenio\base.py", line 396, in send
    return self._send_loop(self.fd.send, data, flags)
  File "<hidden_python_directory>\lib\site-packages\eventlet\greenio\base.py", line 383, in _send_loop
    return send_method(data, *args)
BrokenPipeError: [WinError 10058] A request to send or receive data was disallowed because the socket had already been shut down in that direction with a previous shutdown call

About this issue

  • Original URL
  • State: closed
  • Created 3 years ago
  • Comments: 25 (12 by maintainers)

Most upvoted comments

maybe socketIo is using the session in a way that forces Flask_SqlAlchemy to ignore the teardown commands

I already explained this. Flask-SocketIO does not use your database session. There is nothing in Flask-SocketIO that requires database use. And also, the teardown handlers are for Flask requests, they are not used at all by Flask-SocketIO and this is by design, since Socket.IO does not have the concept of requests.

To summarize: Flask-SocketIO does not know anything about Flask-SQLAlchemy and Flask-SQLAlchemy does not know anything about Flask-SocketIO. If you use your database session in your Socket.IO handlers, you have to manage the allocation of sessions yourself.