25
1
mirror of https://github.com/processone/ejabberd.git synced 2024-12-22 17:28:25 +01:00

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.
This commit is contained in:
Paweł Chmielowski 2020-10-13 14:57:33 +02:00
parent 73f8aded17
commit b95d67aefb
2 changed files with 15 additions and 2 deletions

View File

@ -364,5 +364,8 @@ parsed_items(List) ->
-spec route_text(pid(), binary()) -> ok. -spec route_text(pid(), binary()) -> ok.
route_text(Pid, Data) -> route_text(Pid, Data) ->
Pid ! {text, Data}, Pid ! {text_with_reply, Data, self()},
ok. receive
{text_reply, Pid} ->
ok
end.

View File

@ -225,6 +225,16 @@ ws_loop(FrameInfo, Socket, WsHandleLoopPid, SocketMode, Shaper) ->
end, end,
erlang:demonitor(Ref), erlang:demonitor(Ref),
websocket_close(Socket, WsHandleLoopPid, SocketMode, Code); 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} -> {text, Data} ->
SocketMode:send(Socket, encode_frame(Data, 1)), SocketMode:send(Socket, encode_frame(Data, 1)),
ws_loop(FrameInfo, Socket, WsHandleLoopPid, ws_loop(FrameInfo, Socket, WsHandleLoopPid,