Skip to content

Commit 53f511f

Browse files
Merge pull request #13837 from rabbitmq/dqt-export-fix
Modify default queue type injection logic
2 parents 451850f + f61b9d9 commit 53f511f

File tree

6 files changed

+79
-16
lines changed

6 files changed

+79
-16
lines changed

deps/rabbit/src/rabbit_definitions.erl

+1-3
Original file line numberDiff line numberDiff line change
@@ -1081,12 +1081,10 @@ list_vhosts() ->
10811081

10821082
vhost_definition(VHost) ->
10831083
Name = vhost:get_name(VHost),
1084-
DQT = rabbit_queue_type:short_alias_of(rabbit_vhost:default_queue_type(Name)),
10851084
#{
10861085
<<"name">> => Name,
10871086
<<"limits">> => vhost:get_limits(VHost),
1088-
<<"metadata">> => vhost:get_metadata(VHost),
1089-
<<"default_queue_type">> => DQT
1087+
<<"metadata">> => vhost:get_metadata(VHost)
10901088
}.
10911089

10921090
list_users() ->

deps/rabbit/src/rabbit_vhost.erl

+41-1
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,38 @@ recover(VHost) ->
5757
ok = rabbit_file:ensure_dir(VHostStubFile),
5858
ok = file:write_file(VHostStubFile, VHost),
5959
ok = ensure_config_file(VHost),
60+
61+
%% in the past, a vhost didn't necessarily have a default queue type
62+
%% and queues declared in that vhost defaulted to the type configured
63+
%% on the node level (in the config file). Now each vhost has its default
64+
%% queue type in the metadata. For vhosts updated from older versions,
65+
%% we need to add the default type to the metadata
66+
case rabbit_db_vhost:get(VHost) of
67+
undefined ->
68+
rabbit_log:warning("Cannot check metadata for vhost '~ts' during recovery, record not found.",
69+
[VHost]);
70+
VHostRecord ->
71+
Metadata = vhost:get_metadata(VHostRecord),
72+
case maps:is_key(default_queue_type, Metadata) of
73+
true ->
74+
rabbit_log:debug("Default queue type for vhost '~ts' is ~p.",
75+
[VHost, maps:get(default_queue_type, Metadata)]),
76+
ok;
77+
false ->
78+
DefaultType = rabbit_queue_type:default_alias(),
79+
rabbit_log:info("Setting missing default queue type to '~p' for vhost '~ts'.",
80+
[DefaultType, VHost]),
81+
case rabbit_db_vhost:merge_metadata(VHost, #{default_queue_type => DefaultType}) of
82+
{ok, _UpdatedVHostRecord} ->
83+
ok;
84+
{error, Reason} ->
85+
% Log the error but continue recovery
86+
rabbit_log:warning("Failed to set the default queue type for vhost '~ts': ~p",
87+
[VHost, Reason])
88+
end
89+
end
90+
end,
91+
6092
{Recovered, Failed} = rabbit_amqqueue:recover(VHost),
6193
AllQs = Recovered ++ Failed,
6294
QNames = [amqqueue:get_name(Q) || Q <- AllQs],
@@ -157,8 +189,16 @@ add(Name, Metadata, ActingUser) ->
157189
catch(do_add(Name, Metadata, ActingUser))
158190
end.
159191

160-
do_add(Name, Metadata, ActingUser) ->
192+
do_add(Name, Metadata0, ActingUser) ->
161193
ok = is_over_vhost_limit(Name),
194+
195+
Metadata = case maps:is_key(default_queue_type, Metadata0) of
196+
true ->
197+
Metadata0;
198+
false ->
199+
Metadata0#{default_queue_type => rabbit_queue_type:default_alias()}
200+
end,
201+
162202
Description = maps:get(description, Metadata, undefined),
163203
Tags = maps:get(tags, Metadata, []),
164204

deps/rabbit/src/vhost.erl

+2-1
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,8 @@ disable_protection_from_deletion(VHost) ->
215215
-spec new_metadata(binary(), [atom()], rabbit_queue_type:queue_type() | 'undefined') -> metadata().
216216
new_metadata(Description, Tags, undefined) ->
217217
#{description => Description,
218-
tags => Tags};
218+
default_queue_type => rabbit_queue_type:default_alias(),
219+
tags => Tags};
219220
new_metadata(Description, Tags, DefaultQueueType) ->
220221
#{description => Description,
221222
tags => Tags,

deps/rabbit/test/vhost_SUITE.erl

+33-4
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ all() ->
2727
groups() ->
2828
ClusterSize1Tests = [
2929
vhost_is_created_with_default_limits,
30+
vhost_is_created_with_default_queue_type,
3031
vhost_is_created_with_operator_policies,
3132
vhost_is_created_with_default_user,
3233
single_node_vhost_deletion_forces_connection_closure,
@@ -307,13 +308,14 @@ vhost_update_default_queue_type_undefined(Config) ->
307308
VHost = <<"update-default_queue_type-with-undefined-test">>,
308309
Description = <<"rmqfpas-105 test vhost">>,
309310
Tags = [replicate, private],
310-
DefaultQueueType = quorum,
311+
VhostDefaultQueueType = quorum,
312+
NodeDefaultQueueType = rabbit_ct_broker_helpers:rpc(Config, 0, rabbit_queue_type, default_alias, []),
311313
Trace = false,
312314
ActingUser = <<"acting-user">>,
313315
try
314316
?assertMatch(ok, rabbit_ct_broker_helpers:add_vhost(Config, VHost)),
315317

316-
PutVhostArgs0 = [VHost, Description, Tags, DefaultQueueType, Trace, ActingUser],
318+
PutVhostArgs0 = [VHost, Description, Tags, VhostDefaultQueueType, Trace, ActingUser],
317319
?assertMatch(ok,
318320
rabbit_ct_broker_helpers:rpc(Config, 0, rabbit_vhost, put_vhost, PutVhostArgs0)),
319321

@@ -322,7 +324,7 @@ vhost_update_default_queue_type_undefined(Config) ->
322324
rabbit_ct_broker_helpers:rpc(Config, 0, rabbit_vhost, put_vhost, PutVhostArgs1)),
323325

324326
V = rabbit_ct_broker_helpers:rpc(Config, 0, rabbit_vhost, lookup, [VHost]),
325-
?assertMatch(#{default_queue_type := DefaultQueueType}, vhost:get_metadata(V))
327+
?assertMatch(#{default_queue_type := NodeDefaultQueueType}, vhost:get_metadata(V))
326328
after
327329
rabbit_ct_broker_helpers:delete_vhost(Config, VHost)
328330
end.
@@ -460,10 +462,37 @@ vhost_is_created_with_default_limits(Config) ->
460462
?assertEqual(ok, rabbit_ct_broker_helpers:add_vhost(Config, VHost)),
461463
?assertEqual(Limits, rabbit_ct_broker_helpers:rpc(Config, 0,
462464
rabbit_vhost_limit, list, [VHost]))
465+
after
466+
rabbit_ct_broker_helpers:rpc(
467+
Config, 0,
468+
application, unset_env, [rabbit, default_limits])
469+
end.
470+
471+
vhost_is_created_with_default_queue_type(Config) ->
472+
VHost = atom_to_binary(?FUNCTION_NAME),
473+
QName = atom_to_binary(?FUNCTION_NAME),
474+
?assertEqual(ok, rabbit_ct_broker_helpers:rpc(Config, 0,
475+
application, set_env, [rabbit, default_queue_type, rabbit_quorum_queue])),
476+
try
477+
?assertEqual(ok, rabbit_ct_broker_helpers:add_vhost(Config, VHost)),
478+
rabbit_ct_broker_helpers:set_full_permissions(Config, <<"guest">>, VHost),
479+
?assertEqual(<<"quorum">>, rabbit_ct_broker_helpers:rpc(Config, 0,
480+
rabbit_vhost, default_queue_type, [VHost])),
481+
V = rabbit_ct_broker_helpers:rpc(Config, 0, rabbit_db_vhost, get, [VHost]),
482+
ct:pal("Vhost metadata: ~p", [V]),
483+
?assertEqual(<<"quorum">>, maps:get(default_queue_type, vhost:get_metadata(V))),
484+
485+
Conn = rabbit_ct_client_helpers:open_unmanaged_connection(Config, 0, VHost),
486+
{ok, Chan} = amqp_connection:open_channel(Conn),
487+
amqp_channel:call(Chan, #'queue.declare'{queue = QName, durable = true}),
488+
QNameRes = rabbit_misc:r(VHost, queue, QName),
489+
{ok, Q} = rabbit_ct_broker_helpers:rpc(Config, 0, rabbit_amqqueue, lookup, [QNameRes]),
490+
?assertMatch(rabbit_quorum_queue, amqqueue:get_type(Q)),
491+
close_connections([Conn])
463492
after
464493
rabbit_ct_broker_helpers:rpc(
465494
Config, 0,
466-
application, unset_env, [rabbit, default_limits])
495+
application, unset_env, [rabbit, default_queue_type])
467496
end.
468497

469498
vhost_is_created_with_operator_policies(Config) ->

deps/rabbitmq_management/src/rabbit_mgmt_wm_definitions.erl

+2-6
Original file line numberDiff line numberDiff line change
@@ -132,10 +132,7 @@ vhost_definitions(ReqData, VHostName, Context) ->
132132
ProductName = rabbit:product_name(),
133133
ProductVersion = rabbit:product_version(),
134134

135-
DQT = rabbit_queue_type:short_alias_of(rabbit_vhost:default_queue_type(VHostName)),
136-
%% note: the type changes to a map
137-
VHost1 = rabbit_queue_type:inject_dqt(VHost),
138-
Metadata = maps:get(metadata, VHost1),
135+
Metadata = vhost:get_metadata(VHost),
139136

140137
TopLevelDefsAndMetadata = [
141138
{rabbit_version, rabbit_data_coercion:to_binary(Vsn)},
@@ -147,7 +144,6 @@ vhost_definitions(ReqData, VHostName, Context) ->
147144
{explanation, rabbit_data_coercion:to_binary(io_lib:format("Definitions of virtual host '~ts'", [VHostName]))},
148145
{metadata, Metadata},
149146
{description, vhost:get_description(VHost)},
150-
{default_queue_type, DQT},
151147
{limits, vhost:get_limits(VHost)}
152148
],
153149
Result = TopLevelDefsAndMetadata ++ retain_whitelisted(Contents),
@@ -288,7 +284,7 @@ export_name(_Name) -> true.
288284

289285
rw_state() ->
290286
[{users, [name, password_hash, hashing_algorithm, tags, limits]},
291-
{vhosts, [name, description, tags, default_queue_type, metadata]},
287+
{vhosts, [name, description, tags, metadata]},
292288
{permissions, [user, vhost, configure, write, read]},
293289
{topic_permissions, [user, vhost, exchange, write, read]},
294290
{parameters, [vhost, component, name, value]},

deps/rabbitmq_management/test/rabbit_mgmt_http_SUITE.erl

-1
Original file line numberDiff line numberDiff line change
@@ -2126,7 +2126,6 @@ definitions_vhost_metadata_test(Config) ->
21262126
?assertEqual(#{
21272127
name => VHostName,
21282128
description => Desc,
2129-
default_queue_type => DQT,
21302129
tags => Tags,
21312130
metadata => Metadata
21322131
}, VH),

0 commit comments

Comments
 (0)