Skip to content

Commit ed31a81

Browse files
committed
Make mqtt.subscription_ttl unsupported
Starting with RabbitMQ 3.13 mqtt.max_session_expiry_interval_seconds (set in seconds) will replace the previous setting mqtt.subscription_ttl. MQTT 5.0 introduces the Session Expiry Interval feature which does not only apply to subscribers, but also to publishers. The new config name mqtt.max_session_expiry_interval_seconds makes it clear that it also applies to publishers. Prior to this commit, when mqtt.subscription_ttl was set, a warning got logged and the value was ignored. This is dangerous if an operator does not see the warning but relies for example on `mqtt.subscription = infinity` to not expire non clean session. It's safer to make the boot fail if that unsupported config name is still set. A clear error message will be logged: ``` [error] <0.142.0> Error preparing configuration in phase apply_translations: [error] <0.142.0> - Translation for 'rabbitmq_mqtt.subscription_ttl' found invalid configuration: Since 3.13 mqtt.subscription_ttl (in milliseconds) is unsupported. Use mqtt.max_session_expiry_interval_seconds (in seconds) instead. ``` Alternatively, RabbitMQ could translate mqtt.subscription_ttl to mqtt.max_session_expiry_interval_seconds. However, forcing the new config option sounds the better way to go. Once we write MQTT 5.0 docs, this change must go into the 3.13 release notes. This commit also renames max_session_expiry_interval_secs to max_session_expiry_interval_seconds. The latter is clearer to users.
1 parent 50e9634 commit ed31a81

File tree

8 files changed

+21
-23
lines changed

8 files changed

+21
-23
lines changed

deps/rabbit/docs/rabbitmq.conf.example

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -913,7 +913,7 @@
913913
## 'infinity' means the session does not expire.
914914
## An MQTT 5.0 client can choose a lower value.
915915
##
916-
# mqtt.max_session_expiry_interval_secs = 1800
916+
# mqtt.max_session_expiry_interval_seconds = 1800
917917

918918
## Set the prefetch count (governing the maximum number of unacknowledged
919919
## messages that will be delivered).

deps/rabbitmq_mqtt/BUILD.bazel

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ APP_ENV = """[
3434
{allow_anonymous, true},
3535
{vhost, <<"/">>},
3636
{exchange, <<"amq.topic">>},
37-
{max_session_expiry_interval_secs, 86400}, %% 1 day
37+
{max_session_expiry_interval_seconds, 86400}, %% 1 day
3838
{retained_message_store, rabbit_mqtt_retained_msg_store_dets},
3939
%% only used by DETS store
4040
{retained_message_store_dets_sync_interval, 2000},

deps/rabbitmq_mqtt/Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ define PROJECT_ENV
1111
{allow_anonymous, true},
1212
{vhost, <<"/">>},
1313
{exchange, <<"amq.topic">>},
14-
{max_session_expiry_interval_secs, 86400}, %% 1 day
14+
{max_session_expiry_interval_seconds, 86400}, %% 1 day
1515
{retained_message_store, rabbit_mqtt_retained_msg_store_dets},
1616
%% only used by DETS store
1717
{retained_message_store_dets_sync_interval, 2000},

deps/rabbitmq_mqtt/priv/schema/rabbitmq_mqtt.schema

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -71,24 +71,22 @@ end}.
7171

7272
{translation, "rabbitmq_mqtt.subscription_ttl",
7373
fun(Conf) ->
74-
cuttlefish:warn(
75-
"Since 3.13 mqtt.subscription_ttl (in milliseconds) is deprecated and "
76-
"has no effect anymore. Use mqtt.max_session_expiry_interval_secs (in "
77-
"seconds) instead."),
78-
cuttlefish:unset()
74+
cuttlefish:invalid(
75+
"Since 3.13 mqtt.subscription_ttl (in milliseconds) is unsupported. "
76+
"Use mqtt.max_session_expiry_interval_seconds (in seconds) instead.")
7977
end}.
8078

8179
%% Defines the maximum Session Expiry Interval in seconds allowed by the server.
8280
%% 'infinity' means the session does not expire.
8381
%% An MQTT 5.0 client can choose a lower value.
8482

85-
{mapping, "mqtt.max_session_expiry_interval_secs", "rabbitmq_mqtt.max_session_expiry_interval_secs", [
83+
{mapping, "mqtt.max_session_expiry_interval_seconds", "rabbitmq_mqtt.max_session_expiry_interval_seconds", [
8684
{datatype, [integer, {atom, infinity}]}
8785
]}.
8886

89-
{translation, "rabbitmq_mqtt.max_session_expiry_interval_secs",
87+
{translation, "rabbitmq_mqtt.max_session_expiry_interval_seconds",
9088
fun(Conf) ->
91-
case cuttlefish:conf_get("mqtt.max_session_expiry_interval_secs", Conf) of
89+
case cuttlefish:conf_get("mqtt.max_session_expiry_interval_seconds", Conf) of
9290
N when is_integer(N) andalso N < 0 ->
9391
cuttlefish:invalid("negative integer not allowed");
9492
Valid ->

deps/rabbitmq_mqtt/src/rabbit_mqtt_processor.erl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ process_connect(
148148
MaxPacketSize = maps:get('Maximum-Packet-Size', ConnectProps, ?MAX_PACKET_SIZE),
149149
TopicAliasMax = persistent_term:get(?PERSISTENT_TERM_TOPIC_ALIAS_MAXIMUM),
150150
TopicAliasMaxOutbound = min(maps:get('Topic-Alias-Maximum', ConnectProps, 0), TopicAliasMax),
151-
{ok, MaxSessionExpiry} = application:get_env(?APP_NAME, max_session_expiry_interval_secs),
151+
{ok, MaxSessionExpiry} = application:get_env(?APP_NAME, max_session_expiry_interval_seconds),
152152
SessionExpiry =
153153
case {ProtoVer, CleanStart} of
154154
{5, _} ->
@@ -157,7 +157,7 @@ process_connect(
157157
?UINT_MAX ->
158158
%% "If the Session Expiry Interval is 0xFFFFFFFF (UINT_MAX),
159159
%% the Session does not expire."
160-
min(infinity, MaxSessionExpiry);
160+
MaxSessionExpiry;
161161
Seconds ->
162162
min(Seconds, MaxSessionExpiry)
163163
end;
@@ -569,7 +569,7 @@ process_request(?DISCONNECT,
569569
State0;
570570
_ ->
571571
%% "The session expiry interval can be modified at disconnect."
572-
{ok, MaxSEI} = application:get_env(?APP_NAME, max_session_expiry_interval_secs),
572+
{ok, MaxSEI} = application:get_env(?APP_NAME, max_session_expiry_interval_seconds),
573573
NewSEI = min(RequestedSEI, MaxSEI),
574574
lists:foreach(fun(QName) ->
575575
update_session_expiry_interval(QName, NewSEI)

deps/rabbitmq_mqtt/test/config_schema_SUITE_data/rabbitmq_mqtt.snippets

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
mqtt.allow_anonymous = true
66
mqtt.vhost = /
77
mqtt.exchange = amq.topic
8-
mqtt.max_session_expiry_interval_secs = 1800
8+
mqtt.max_session_expiry_interval_seconds = 86400
99
mqtt.prefetch = 10
1010
mqtt.sparkplug = true
1111
mqtt.listeners.ssl = none
@@ -25,7 +25,7 @@
2525
{allow_anonymous,true},
2626
{vhost,<<"/">>},
2727
{exchange,<<"amq.topic">>},
28-
{max_session_expiry_interval_secs,1800},
28+
{max_session_expiry_interval_seconds,86400},
2929
{prefetch,10},
3030
{sparkplug,true},
3131
{ssl_listeners,[]},
@@ -106,7 +106,7 @@
106106
mqtt.allow_anonymous = true
107107
mqtt.vhost = /
108108
mqtt.exchange = amq.topic
109-
mqtt.max_session_expiry_interval_secs = infinity
109+
mqtt.max_session_expiry_interval_seconds = infinity
110110
mqtt.prefetch = 10
111111
mqtt.proxy_protocol = true",
112112
[{rabbit,[{tcp_listeners,[5672]}]},
@@ -116,7 +116,7 @@
116116
{allow_anonymous,true},
117117
{vhost,<<"/">>},
118118
{exchange,<<"amq.topic">>},
119-
{max_session_expiry_interval_secs,infinity},
119+
{max_session_expiry_interval_seconds,infinity},
120120
{prefetch,10},
121121
{proxy_protocol,true}]}],
122122
[rabbitmq_mqtt]},
@@ -126,7 +126,7 @@
126126
mqtt.allow_anonymous = true
127127
mqtt.vhost = /
128128
mqtt.exchange = amq.topic
129-
mqtt.max_session_expiry_interval_secs = 1800
129+
mqtt.max_session_expiry_interval_seconds = 1800
130130
mqtt.prefetch = 10
131131
## use DETS (disk-based) store for retained messages
132132
mqtt.retained_message_store = rabbit_mqtt_retained_msg_store_dets
@@ -141,7 +141,7 @@
141141
{allow_anonymous,true},
142142
{vhost,<<"/">>},
143143
{exchange,<<"amq.topic">>},
144-
{max_session_expiry_interval_secs,1800},
144+
{max_session_expiry_interval_seconds,1800},
145145
{prefetch,10},
146146
{retained_message_store,rabbit_mqtt_retained_msg_store_dets},
147147
{retained_message_store_dets_sync_interval,2000},

deps/rabbitmq_mqtt/test/shared_SUITE.erl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -824,7 +824,7 @@ delete_create_queue(Config) ->
824824

825825
session_expiry(Config) ->
826826
App = rabbitmq_mqtt,
827-
Par = max_session_expiry_interval_secs,
827+
Par = max_session_expiry_interval_seconds,
828828
Seconds = 1,
829829
{ok, DefaultVal} = rpc(Config, application, get_env, [App, Par]),
830830
ok = rpc(Config, application, set_env, [App, Par, Seconds]),

deps/rabbitmq_mqtt/test/v5_SUITE.erl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@ init_per_testcase(T, Config)
198198
when T =:= session_expiry_disconnect_infinity_to_zero;
199199
T =:= session_expiry_disconnect_to_infinity;
200200
T =:= session_expiry_reconnect_infinity_to_zero ->
201-
Par = max_session_expiry_interval_secs,
201+
Par = max_session_expiry_interval_seconds,
202202
{ok, Default} = rpc(Config, application, get_env, [?APP, Par]),
203203
ok = rpc(Config, application, set_env, [?APP, Par, infinity]),
204204
Config1 = rabbit_ct_helpers:set_config(Config, {Par, Default}),
@@ -215,7 +215,7 @@ end_per_testcase(T, Config)
215215
when T =:= session_expiry_disconnect_infinity_to_zero;
216216
T =:= session_expiry_disconnect_to_infinity;
217217
T =:= session_expiry_reconnect_infinity_to_zero ->
218-
Par = max_session_expiry_interval_secs,
218+
Par = max_session_expiry_interval_seconds,
219219
Default = ?config(Par, Config),
220220
ok = rpc(Config, application, set_env, [?APP, Par, Default]),
221221
end_per_testcase0(T, Config);

0 commit comments

Comments
 (0)