Przeglądaj źródła

fix(sessds): Stricter checks for PacketIds

ieQu1 2 lat temu
rodzic
commit
2c6a776318

+ 12 - 14
apps/emqx/src/emqx_persistent_session_ds.erl

@@ -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.

+ 1 - 1
apps/emqx/test/emqx_persistent_messages_SUITE.erl

@@ -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)).