diff options
author | Paweł Chmielowski <pchmielowski@process-one.net> | 2020-10-13 14:57:33 +0200 |
---|---|---|
committer | Paweł Chmielowski <pchmielowski@process-one.net> | 2020-10-13 14:57:33 +0200 |
commit | b95d67aefbfc7df9f309b9c39bfbaea4b614bb6b (patch) | |
tree | b5e40918342b9546d1faa3f9e271aa507b8f9303 /src | |
parent | Make mod_muc_admin command work correctly with hibernated rooms (diff) |
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 <r> request was sent, client could even not receive it
before timeout was triggered on server waiting for corresponding <a>).
This changes makes c2s process wait for data being sent to tcp socket
associated with websocket connection, which should help with this problem.
Diffstat (limited to 'src')
-rw-r--r-- | src/ejabberd_http_ws.erl | 7 | ||||
-rw-r--r-- | 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, |