From 3d8711f708bbd7bb25b2b8b5a1714d775199a026 Mon Sep 17 00:00:00 2001 From: Evgeny Khramtsov Date: Sat, 11 May 2019 19:27:56 +0300 Subject: [PATCH] Avoid late arrival of get_disco_item response --- src/mod_muc.erl | 26 +++++++++++++++----------- src/mod_muc_room.erl | 13 ++++++++++--- 2 files changed, 25 insertions(+), 14 deletions(-) diff --git a/src/mod_muc.erl b/src/mod_muc.erl index edc570eed..a3447b281 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 94c430197..2d3865120 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,