fix(sessds): Stricter checks for PacketIds

This commit is contained in:
ieQu1 2024-01-26 17:39:14 +01:00
parent eec56b0d6b
commit 2c6a776318
2 changed files with 13 additions and 15 deletions

View File

@ -909,30 +909,28 @@ update_seqno(Track, PacketId, Session = #{id := SessionId, s := S}) ->
SeqNo = packet_id_to_seqno(PacketId, S),
case Track of
puback ->
MinTrack = ?committed(?QOS_1),
MaxTrack = ?next(?QOS_1);
QoS = ?QOS_1,
SeqNoKey = ?committed(?QOS_1);
pubrec ->
MinTrack = ?rec,
MaxTrack = ?next(?QOS_2);
QoS = ?QOS_2,
SeqNoKey = ?rec;
pubcomp ->
MinTrack = ?committed(?QOS_2),
MaxTrack = ?next(?QOS_2)
QoS = ?QOS_2,
SeqNoKey = ?committed(?QOS_2)
end,
Min = emqx_persistent_session_ds_state:get_seqno(MinTrack, S),
Max = emqx_persistent_session_ds_state:get_seqno(MaxTrack, S),
case Min =< SeqNo andalso SeqNo =< Max of
true ->
Current = emqx_persistent_session_ds_state:get_seqno(SeqNoKey, S),
case inc_seqno(QoS, Current) of
SeqNo ->
%% TODO: we pass a bogus message into the hook:
Msg = emqx_message:make(SessionId, <<>>, <<>>),
{ok, Msg, Session#{s => emqx_persistent_session_ds_state:put_seqno(MinTrack, SeqNo, S)}};
false ->
{ok, Msg, Session#{s => emqx_persistent_session_ds_state:put_seqno(SeqNoKey, SeqNo, S)}};
Expected ->
?SLOG(warning, #{
msg => "out-of-order_commit",
track => Track,
packet_id => PacketId,
seqno => SeqNo,
min => Min,
max => Max
expected => Expected
}),
{error, ?RC_PACKET_IDENTIFIER_NOT_FOUND}
end.

View File

@ -495,7 +495,7 @@ consume(It) ->
end.
receive_messages(Count) ->
receive_messages(Count, 5_000).
receive_messages(Count, 10_000).
receive_messages(Count, Timeout) ->
lists:reverse(receive_messages(Count, [], Timeout)).