summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorEvgeny Khramtsov <ekhramtsov@process-one.net>2019-05-11 19:27:56 +0300
committerEvgeny Khramtsov <ekhramtsov@process-one.net>2019-05-11 19:27:56 +0300
commit3d8711f708bbd7bb25b2b8b5a1714d775199a026 (patch)
tree6e12f43b9f8401b150399a39688b41503148af3e /src
parentHandle TCP errors in websockets (diff)
Avoid late arrival of get_disco_item response
Diffstat (limited to 'src')
-rw-r--r--src/mod_muc.erl26
-rw-r--r--src/mod_muc_room.erl13
2 files changed, 25 insertions, 14 deletions
diff --git a/src/mod_muc.erl b/src/mod_muc.erl
index edc570ee..a3447b28 100644
--- a/src/mod_muc.erl
+++ b/src/mod_muc.erl
@@ -740,17 +740,21 @@ iq_disco_items(_ServerHost, _Host, _From, Lang, _MaxRoomsDiscoItems, _Node, _RSM
-spec get_room_disco_item({binary(), binary(), pid()},
term()) -> {ok, disco_item()} |
{error, timeout | notfound}.
-get_room_disco_item({Name, Host, Pid}, Query) ->
- RoomJID = jid:make(Name, Host),
- try p1_fsm:sync_send_all_state_event(Pid, Query, 100) of
- {item, Desc} ->
- {ok, #disco_item{jid = RoomJID, name = Desc}};
- false ->
- {error, notfound}
- catch _:{timeout, {p1_fsm, _, _}} ->
- {error, timeout};
- _:{_, {p1_fsm, _, _}} ->
- {error, notfound}
+get_room_disco_item({Name, Host, Pid},
+ {get_disco_item, Filter, JID, Lang}) ->
+ RoomJID = jid:make(Name, Host),
+ Timeout = 100,
+ Time = erlang:monotonic_time(millisecond),
+ Query1 = {get_disco_item, Filter, JID, Lang, Time+Timeout},
+ try p1_fsm:sync_send_all_state_event(Pid, Query1, Timeout) of
+ {item, Desc} ->
+ {ok, #disco_item{jid = RoomJID, name = Desc}};
+ false ->
+ {error, notfound}
+ catch _:{timeout, {p1_fsm, _, _}} ->
+ {error, timeout};
+ _:{_, {p1_fsm, _, _}} ->
+ {error, notfound}
end.
-spec get_subscribed_rooms(binary(), jid()) -> {ok, [{jid(), [binary()]}]} | {error, any()}.
diff --git a/src/mod_muc_room.erl b/src/mod_muc_room.erl
index 94c43019..2d386512 100644
--- a/src/mod_muc_room.erl
+++ b/src/mod_muc_room.erl
@@ -512,7 +512,7 @@ handle_event({set_affiliations, Affiliations},
handle_event(_Event, StateName, StateData) ->
{next_state, StateName, StateData}.
-handle_sync_event({get_disco_item, Filter, JID, Lang}, _From, StateName, StateData) ->
+handle_sync_event({get_disco_item, Filter, JID, Lang, Time}, _From, StateName, StateData) ->
Len = maps:size(StateData#state.nicks),
Reply = case (Filter == all) or (Filter == Len) or ((Filter /= 0) and (Len /= 0)) of
true ->
@@ -521,10 +521,17 @@ handle_sync_event({get_disco_item, Filter, JID, Lang}, _From, StateName, StateDa
false ->
false
end,
- {reply, Reply, StateName, StateData};
-%% This clause is only for backwards compatibility
+ CurrentTime = erlang:monotonic_time(millisecond),
+ if CurrentTime < Time ->
+ {reply, Reply, StateName, StateData};
+ true ->
+ {next_state, StateName, StateData}
+ end;
+%% These two clauses are only for backward compatibility with nodes running old code
handle_sync_event({get_disco_item, JID, Lang}, From, StateName, StateData) ->
handle_sync_event({get_disco_item, any, JID, Lang}, From, StateName, StateData);
+handle_sync_event({get_disco_item, Filter, JID, Lang}, From, StateName, StateData) ->
+ handle_sync_event({get_disco_item, Filter, JID, Lang, infinity}, From, StateName, StateData);
handle_sync_event(get_config, _From, StateName,
StateData) ->
{reply, {ok, StateData#state.config}, StateName,