Skip to content

Commit d986ead

Browse files
committed
Do not overwrite default_queue_type with undefined
Importing a definitions file with no `default_queue_type` metadata for a vhost will result in that vhosts value being set to `undefined`. Once set to a non-`undefined` value, this PR prevents `default_queue_type` from being set back to `undefined`
1 parent c4afa23 commit d986ead

File tree

2 files changed

+46
-4
lines changed

2 files changed

+46
-4
lines changed

deps/rabbit/src/vhost.erl

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -163,10 +163,25 @@ set_metadata(VHost, Value) ->
163163
VHost#vhost{metadata = Value}.
164164

165165
-spec merge_metadata(vhost(), metadata()) -> vhost().
166-
merge_metadata(VHost, Value) ->
167-
Meta0 = get_metadata(VHost),
168-
NewMeta = maps:merge(Meta0, Value),
169-
VHost#vhost{metadata = NewMeta}.
166+
merge_metadata(VHost, NewVHostMeta) ->
167+
CurrentVHostMeta = get_metadata(VHost),
168+
FinalMeta = maps:merge_with(
169+
fun metadata_merger/3, CurrentVHostMeta, NewVHostMeta),
170+
VHost#vhost{metadata = FinalMeta}.
171+
172+
%% This is the case where the existing VHost metadata has a default queue type
173+
%% value and the proposed value is `undefined`. We do not want the proposed
174+
%% value to overwrite the current value
175+
metadata_merger(default_queue_type, CurrentDefaultQueueType, undefined) ->
176+
CurrentDefaultQueueType;
177+
%% This is the case where the existing VHost metadata has any default queue
178+
%% type value, and the proposed value is NOT `undefined`. It is OK for any
179+
%% proposed value to be used.
180+
metadata_merger(default_queue_type, _, NewVHostDefaultQueueType) ->
181+
NewVHostDefaultQueueType;
182+
%% This is the case for all other VHost metadata keys.
183+
metadata_merger(_, _, NewMetadataValue) ->
184+
NewMetadataValue.
170185

171186
-spec is_tagged_with(vhost(), tag()) -> boolean().
172187
is_tagged_with(VHost, Tag) ->

deps/rabbit/test/vhost_SUITE.erl

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ groups() ->
3333
vhost_failure_forces_connection_closure,
3434
vhost_creation_idempotency,
3535
vhost_update_idempotency,
36+
vhost_update_default_queue_type_undefined,
3637
vhost_deletion,
3738
parse_tags
3839
],
@@ -42,6 +43,8 @@ groups() ->
4243
vhost_failure_forces_connection_closure_on_failure_node,
4344
node_starts_with_dead_vhosts,
4445
vhost_creation_idempotency,
46+
vhost_update_idempotency,
47+
vhost_update_default_queue_type_undefined,
4548
vhost_deletion
4649
],
4750
[
@@ -300,6 +303,30 @@ vhost_update_idempotency(Config) ->
300303
rabbit_ct_broker_helpers:delete_vhost(Config, VHost)
301304
end.
302305

306+
vhost_update_default_queue_type_undefined(Config) ->
307+
VHost = <<"update-default_queue_type-with-undefined-test">>,
308+
Description = <<"rmqfpas-105 test vhost">>,
309+
Tags = [replicate, private],
310+
DefaultQueueType = quorum,
311+
Trace = false,
312+
ActingUser = <<"acting-user">>,
313+
try
314+
?assertMatch(ok, rabbit_ct_broker_helpers:add_vhost(Config, VHost)),
315+
316+
PutVhostArgs0 = [VHost, Description, Tags, DefaultQueueType, Trace, ActingUser],
317+
?assertMatch(ok,
318+
rabbit_ct_broker_helpers:rpc(Config, 0, rabbit_vhost, put_vhost, PutVhostArgs0)),
319+
320+
PutVhostArgs1 = [VHost, Description, Tags, undefined, Trace, ActingUser],
321+
?assertMatch(ok,
322+
rabbit_ct_broker_helpers:rpc(Config, 0, rabbit_vhost, put_vhost, PutVhostArgs1)),
323+
324+
V = rabbit_ct_broker_helpers:rpc(Config, 0, rabbit_vhost, lookup, [VHost]),
325+
?assertMatch(#{default_queue_type := DefaultQueueType}, vhost:get_metadata(V))
326+
after
327+
rabbit_ct_broker_helpers:delete_vhost(Config, VHost)
328+
end.
329+
303330
vhost_deletion(Config) ->
304331
VHost = <<"deletion-vhost">>,
305332
ActingUser = <<"acting-user">>,

0 commit comments

Comments
 (0)