diff --git a/apps/emqx/src/emqx_schema.erl b/apps/emqx/src/emqx_schema.erl index ce4840eb9..6c8466aab 100644 --- a/apps/emqx/src/emqx_schema.erl +++ b/apps/emqx/src/emqx_schema.erl @@ -3630,9 +3630,9 @@ mqtt_general() -> )}, {"retry_interval", sc( - duration(), + hoconsc:union([infinity, duration()]), #{ - default => <<"30s">>, + default => infinity, desc => ?DESC(mqtt_retry_interval) } )}, diff --git a/apps/emqx/src/emqx_session_mem.erl b/apps/emqx/src/emqx_session_mem.erl index 2d8ebb2f9..c3cc17926 100644 --- a/apps/emqx/src/emqx_session_mem.erl +++ b/apps/emqx/src/emqx_session_mem.erl @@ -602,9 +602,9 @@ handle_timeout(ClientInfo, expire_awaiting_rel, Session) -> %%-------------------------------------------------------------------- -spec retry(clientinfo(), session()) -> - {ok, replies(), session()}. -retry(ClientInfo, Session = #session{inflight = Inflight}) -> - case emqx_inflight:is_empty(Inflight) of + {ok, replies(), session()} | {ok, replies(), timeout(), session()}. +retry(ClientInfo, Session = #session{inflight = Inflight, retry_interval = Interval}) -> + case emqx_inflight:is_empty(Inflight) orelse Interval =:= infinity of true -> {ok, [], Session}; false -> diff --git a/apps/emqx/test/emqx_config_SUITE.erl b/apps/emqx/test/emqx_config_SUITE.erl index 28f542f81..2acc69c1d 100644 --- a/apps/emqx/test/emqx_config_SUITE.erl +++ b/apps/emqx/test/emqx_config_SUITE.erl @@ -444,7 +444,7 @@ zone_global_defaults() -> peer_cert_as_username => disabled, response_information => [], retain_available => true, - retry_interval => 30000, + retry_interval => infinity, message_expiry_interval => infinity, server_keepalive => disabled, session_expiry_interval => 7200000, diff --git a/apps/emqx/test/emqx_session_mem_SUITE.erl b/apps/emqx/test/emqx_session_mem_SUITE.erl index 85b6834fe..21feab70c 100644 --- a/apps/emqx/test/emqx_session_mem_SUITE.erl +++ b/apps/emqx/test/emqx_session_mem_SUITE.erl @@ -78,7 +78,7 @@ t_session_init(_) -> ?assertEqual(0, emqx_session_mem:info(inflight_cnt, Session)), ?assertEqual(64, emqx_session_mem:info(inflight_max, Session)), ?assertEqual(1, emqx_session_mem:info(next_pkt_id, Session)), - ?assertEqual(30000, emqx_session_mem:info(retry_interval, Session)), + ?assertEqual(infinity, emqx_session_mem:info(retry_interval, Session)), ?assertEqual(0, emqx_mqueue:len(emqx_session_mem:info(mqueue, Session))), ?assertEqual(0, emqx_session_mem:info(awaiting_rel_cnt, Session)), ?assertEqual(100, emqx_session_mem:info(awaiting_rel_max, Session)), @@ -95,7 +95,7 @@ t_session_info(_) -> #{ subscriptions := #{}, upgrade_qos := false, - retry_interval := 30000, + retry_interval := infinity, await_rel_timeout := 300000 }, maps:from_list(emqx_session_mem:info(Keys, session())) diff --git a/changes/ce/breaking-13080.en.md b/changes/ce/breaking-13080.en.md new file mode 100644 index 000000000..3cd638171 --- /dev/null +++ b/changes/ce/breaking-13080.en.md @@ -0,0 +1,8 @@ +Change `mqtt.retry_interval` config default to `infinity`. + +Previously, the default value for `retry_interval` was 30 seconds. + +The new default has been changed to 'infinity'. With this update, EMQX will not automatically retry message deliveries by default. + +Aligning with MQTT specification standards, in-session message delivery retries are not typically compliant. +We recognize that some users depend on this feature, so the option to configure retries remains available for backward compatibility.