Skip to content

Commit ecb02f4

Browse files
authored
Merge pull request #4497 from esl/refactor-stream-management
Minor refactoring of mod_stream_management This PR includes minor improvements to mod_stream_management: Improve separation of concerns between functions. Remove broken and unnecessary guard. Prevent stanzas from being sent to a closed socket in the resume state, because they would fail anyway. Blocking the stanza looks safe as there are no handlers (or further hooks) executed afterwards. It looks better to skip such stanzas in the outgoing c2s instrumentation events, because they are not actually sent anywhere.
2 parents ca654ae + c0ab771 commit ecb02f4

File tree

1 file changed

+20
-14
lines changed

1 file changed

+20
-14
lines changed

src/stream_management/mod_stream_management.erl

+20-14
Original file line numberDiff line numberDiff line change
@@ -223,11 +223,11 @@ user_receive_packet(Acc, _Params, _Extra) ->
223223
xmpp_presend_element(Acc, #{c2s_data := StateData, c2s_state := C2SState}, _Extra) ->
224224
case {get_mod_state(StateData), mongoose_acc:stanza_type(Acc)} of
225225
{{error, not_found}, _} ->
226-
{ok, Acc};
226+
{xmpp_presend_result(C2SState), Acc};
227227
{_, <<"probe">>} ->
228-
{ok, Acc};
228+
{xmpp_presend_result(C2SState), Acc};
229229
{#sm_state{buffer_max = no_buffer} = SmState, _} ->
230-
maybe_send_ack_request(Acc, SmState);
230+
maybe_send_ack_request(Acc, C2SState, SmState);
231231
{SmState, _} ->
232232
Jid = mongoose_c2s:get_jid(StateData),
233233
handle_buffer_and_ack(Acc, C2SState, Jid, SmState)
@@ -246,8 +246,9 @@ handle_buffer_and_ack(Acc, C2SState, Jid, #sm_state{buffer = Buffer, buffer_max
246246
end,
247247
Acc1 = notify_unacknowledged_msg_if_in_resume_state(Acc, Jid, C2SState),
248248
NewSmState = SmState#sm_state{buffer = [Acc1 | Buffer], buffer_size = NewBufferSize},
249-
Acc2 = mongoose_c2s_acc:to_acc(Acc, actions, MaybeActions),
250-
maybe_send_ack_request(Acc2, NewSmState).
249+
ToAcc = [{actions, MaybeActions}, {state_mod, {?MODULE, NewSmState}}],
250+
Acc2 = mongoose_c2s_acc:to_acc_many(Acc1, ToAcc),
251+
maybe_send_ack_request(Acc2, C2SState, NewSmState).
251252

252253
notify_unacknowledged_msg_if_in_resume_state(Acc, Jid, ?EXT_C2S_STATE(resume_session)) ->
253254
maybe_notify_unacknowledged_msg(Acc, Jid);
@@ -262,17 +263,22 @@ is_buffer_full(BufferSize, BufferMax) when BufferSize =< BufferMax ->
262263
is_buffer_full(_, _) ->
263264
true.
264265

265-
-spec maybe_send_ack_request(mongoose_acc:t(), sm_state()) ->
266+
-spec maybe_send_ack_request(mongoose_acc:t(), c2s_state(), sm_state()) ->
266267
mongoose_c2s_hooks:result().
267-
maybe_send_ack_request(Acc, #sm_state{buffer_size = BufferSize,
268-
counter_out = Out,
269-
ack_freq = AckFreq} = SmState)
270-
when 0 =:= (Out + BufferSize) rem AckFreq, ack_freq =/= never ->
268+
maybe_send_ack_request(Acc, C2SState, #sm_state{buffer_size = BufferSize,
269+
counter_out = Out,
270+
ack_freq = AckFreq})
271+
when 0 =:= (Out + BufferSize) rem AckFreq, C2SState =/= ?EXT_C2S_STATE(resume_session) ->
271272
Stanza = mod_stream_management_stanzas:stream_mgmt_request(),
272-
ToAcc = [{socket_send, Stanza}, {state_mod, {?MODULE, SmState}}],
273-
{ok, mongoose_c2s_acc:to_acc_many(Acc, ToAcc)};
274-
maybe_send_ack_request(Acc, SmState) ->
275-
{ok, mongoose_c2s_acc:to_acc(Acc, state_mod, {?MODULE, SmState})}.
273+
{ok, mongoose_c2s_acc:to_acc(Acc, socket_send, Stanza)};
274+
maybe_send_ack_request(Acc, C2SState, _SmState) ->
275+
{xmpp_presend_result(C2SState), Acc}.
276+
277+
-spec xmpp_presend_result(c2s_state()) -> stop | ok.
278+
xmpp_presend_result(?EXT_C2S_STATE(resume_session)) ->
279+
stop; % It makes no sense to route anything to a closed socket
280+
xmpp_presend_result(_C2SState) ->
281+
ok.
276282

277283
-spec user_send_xmlel(Acc, Params, Extra) -> Result when
278284
Acc :: mongoose_acc:t(),

0 commit comments

Comments
 (0)