6363-export ([is_server_named_allowed /1 ]).
6464
6565-export ([check_max_age /1 ]).
66- -export ([get_queue_type /1 , get_resource_vhost_name /1 , get_resource_name /1 ]).
66+ -export ([get_queue_type /1 , get_queue_type / 2 , get_resource_vhost_name /1 , get_resource_name /1 ]).
6767
6868-export ([deactivate_limit_all /2 ]).
6969
@@ -220,8 +220,11 @@ declare(QueueName, Durable, AutoDelete, Args, Owner, ActingUser) ->
220220 {protocol_error , Type :: atom (), Reason :: string (), Args :: term ()}.
221221declare (QueueName = # resource {virtual_host = VHost }, Durable , AutoDelete , Args ,
222222 Owner , ActingUser , Node ) ->
223- ok = check_declare_arguments (QueueName , Args ),
224- Type = get_queue_type (Args ),
223+ % % note: this is a module name, not a shortcut such as <<"quorum">>
224+ DQT = rabbit_vhost :default_queue_type (VHost , rabbit_queue_type :fallback ()),
225+ rabbit_log :debug (" Args: ~tp , DQT: ~tp " , [Args , DQT ]),
226+ ok = check_declare_arguments (QueueName , Args , DQT ),
227+ Type = get_queue_type (Args , DQT ),
225228 case rabbit_queue_type :is_enabled (Type ) of
226229 true ->
227230 Q = amqqueue :new (QueueName ,
@@ -248,10 +251,19 @@ declare(QueueName = #resource{virtual_host = VHost}, Durable, AutoDelete, Args,
248251 [rabbit_misc :rs (QueueName ), Type , Node ]}
249252 end .
250253
254+ - spec get_queue_type (Args :: rabbit_framing :amqp_table ()) -> rabbit_queue_type :queue_type ().
255+ % % This version is not virtual host metadata-aware but will use
256+ % % the node-wide default type as well as 'rabbit_queue_type:fallback/0'.
251257get_queue_type (Args ) ->
258+ get_queue_type (Args , rabbit_queue_type :default ()).
259+
260+ % % This version should be used together with 'rabbit_vhost:default_queue_type/{1,2}'
261+ get_queue_type (Args , DefaultQueueType ) ->
252262 case rabbit_misc :table_lookup (Args , <<" x-queue-type" >>) of
253- undefined ->
254- rabbit_queue_type :default ();
263+ {longstr , undefined } ->
264+ rabbit_queue_type :discover (DefaultQueueType );
265+ {longstr , <<" undefined" >>} ->
266+ rabbit_queue_type :discover (DefaultQueueType );
255267 {_ , V } ->
256268 rabbit_queue_type :discover (V )
257269 end .
@@ -783,7 +795,31 @@ assert_args_equivalence(Q, NewArgs) ->
783795 QueueTypeArgs = rabbit_queue_type :arguments (queue_arguments , Type ),
784796 rabbit_misc :assert_args_equivalence (ExistingArgs , NewArgs , QueueName , QueueTypeArgs ).
785797
786- check_declare_arguments (QueueName , Args ) ->
798+ - spec maybe_inject_default_queue_type_shortcut_into_args (
799+ rabbit_framing :amqp_table (), rabbit_queue_type :queue_type ()) -> rabbit_framing :amqp_table ().
800+ maybe_inject_default_queue_type_shortcut_into_args (Args0 , DefaultQueueType ) ->
801+ case rabbit_misc :table_lookup (Args0 , <<" x-queue-type" >>) of
802+ {longstr , undefined } ->
803+ % % Important: use a shortcut such as 'quorum' or 'stream' that for the given queue type module
804+ inject_default_queue_type_shortcut_into_args (Args0 , DefaultQueueType );
805+ {longstr , <<" undefined" >>} ->
806+ % % Important: use a shortcut such as 'quorum' or 'stream' that for the given queue type module
807+ inject_default_queue_type_shortcut_into_args (Args0 , DefaultQueueType );
808+ _ValueIsAlreadySet ->
809+ Args0
810+ end .
811+
812+ - spec inject_default_queue_type_shortcut_into_args (
813+ rabbit_framing :amqp_table (), rabbit_queue_type :queue_type ()) -> rabbit_framing :amqp_table ().
814+ inject_default_queue_type_shortcut_into_args (Args0 , QueueType ) ->
815+ Shortcut = rabbit_queue_type :short_alias_of (QueueType ),
816+ NewVal = rabbit_data_coercion :to_binary (Shortcut ),
817+ rabbit_misc :set_table_value (Args0 , <<" x-queue-type" >>, longstr , NewVal ).
818+
819+ check_declare_arguments (QueueName , Args0 , DefaultQueueType ) ->
820+ % % If the x-queue-type was not provided by the client, inject the
821+ % % (virtual host, global or fallback) default before performing validation. MK.
822+ Args = maybe_inject_default_queue_type_shortcut_into_args (Args0 , DefaultQueueType ),
787823 check_arguments_type_and_value (QueueName , Args , [{<<" x-queue-type" >>, fun check_queue_type /2 }]),
788824 Type = get_queue_type (Args ),
789825 QueueTypeArgs = rabbit_queue_type :arguments (queue_arguments , Type ),
0 commit comments