From b95d67aefbfc7df9f309b9c39bfbaea4b614bb6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Chmielowski?= Date: Tue, 13 Oct 2020 14:57:33 +0200 Subject: [PATCH] Make websocket send put back pressure on c2s process Previously c2s was free to generate data to send in unlimited manner, and just generate queue of messages that are waiting to be send. This could lead to hitting timouts in stream management ack handling (if c2s generate lot of packages, after which request was sent, client could even not receive it before timeout was triggered on server waiting for corresponding ). This changes makes c2s process wait for data being sent to tcp socket associated with websocket connection, which should help with this problem. --- src/ejabberd_http_ws.erl | 7 +++++-- src/ejabberd_websocket.erl | 10 ++++++++++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/ejabberd_http_ws.erl b/src/ejabberd_http_ws.erl index d8c58618e..35b38e3e9 100644 --- a/src/ejabberd_http_ws.erl +++ b/src/ejabberd_http_ws.erl @@ -364,5 +364,8 @@ parsed_items(List) -> -spec route_text(pid(), binary()) -> ok. route_text(Pid, Data) -> - Pid ! {text, Data}, - ok. + Pid ! {text_with_reply, Data, self()}, + receive + {text_reply, Pid} -> + ok + end. diff --git a/src/ejabberd_websocket.erl b/src/ejabberd_websocket.erl index 3b4f03bdf..01a7aa6a1 100644 --- a/src/ejabberd_websocket.erl +++ b/src/ejabberd_websocket.erl @@ -225,6 +225,16 @@ ws_loop(FrameInfo, Socket, WsHandleLoopPid, SocketMode, Shaper) -> end, erlang:demonitor(Ref), websocket_close(Socket, WsHandleLoopPid, SocketMode, Code); + {text_with_reply, Data, Sender} -> + SocketMode:send(Socket, encode_frame(Data, 1)), + Sender ! {text_reply, self()}, + ws_loop(FrameInfo, Socket, WsHandleLoopPid, + SocketMode, Shaper); + {data_with_reply, Data, Sender} -> + SocketMode:send(Socket, encode_frame(Data, 2)), + Sender ! {data_reply, self()}, + ws_loop(FrameInfo, Socket, WsHandleLoopPid, + SocketMode, Shaper); {text, Data} -> SocketMode:send(Socket, encode_frame(Data, 1)), ws_loop(FrameInfo, Socket, WsHandleLoopPid,