Skip to content

Commit f75f8ff

Browse files
committed
Set AMQP rejected error description
### What? This commit is a follow-up to #15075 setting the `description` field of the AMQP `error` if RabbitMQ rejects a message. ### Why? Client libs can then just pass this error description string to client apps, which in turn could optionally log that message.
1 parent de45be3 commit f75f8ff

File tree

2 files changed

+12
-1
lines changed

2 files changed

+12
-1
lines changed

deps/rabbit/src/rabbit_amqp_session.erl

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -697,12 +697,14 @@ send_delivery_state_changes(State0 = #state{cfg = #cfg{writer_pid = Writer,
697697
{RejectedIds, GrantCredits0, State1} = handle_stashed_rejected(State0),
698698
maps:foreach(
699699
fun({QNameBin, Reason}, Ids) ->
700+
Description = reject_description(QNameBin, Reason),
700701
Info = {map,
701702
[{{symbol, <<"queue">>}, {utf8, QNameBin}},
702703
{{symbol, <<"reason">>}, {symbol, reject_reason_to_binary(Reason)}}]},
703704
Rej = #'v1_0.rejected'{
704705
error = #'v1_0.error'{
705706
condition = ?V_1_0_AMQP_ERROR_PRECONDITION_FAILED,
707+
description = {utf8, Description},
706708
info = Info}},
707709
send_dispositions(Ids, Rej, Writer, ChannelNum)
708710
end, RejectedIds),
@@ -2603,6 +2605,11 @@ rejected(DeliveryId, Error) ->
26032605
settled = true,
26042606
state = #'v1_0.rejected'{error = Error}}.
26052607

2608+
reject_description(QNameBin, maxlen) ->
2609+
<<"queue '", QNameBin/binary, "' exceeded maximum length">>;
2610+
reject_description(QNameBin, down) ->
2611+
<<"queue '", QNameBin/binary, "' is unavailable">>.
2612+
26062613
reject_reason_to_binary(maxlen) ->
26072614
<<"maxlen">>;
26082615
reject_reason_to_binary(down) ->

deps/rabbit/test/amqp_client_SUITE.erl

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3607,8 +3607,10 @@ target_quorum_queue_rejects(Config) ->
36073607
ok = amqp10_client:send_msg(Sender, amqp10_msg:new(<<"tag d">>, <<>>, false)),
36083608

36093609
[receive {amqp10_disposition, {{rejected, Error}, DTag}} ->
3610-
?assertMatch(
3610+
?assertEqual(
36113611
#'v1_0.error'{
3612+
condition = ?V_1_0_AMQP_ERROR_PRECONDITION_FAILED,
3613+
description = {utf8, <<"queue '🎄' exceeded maximum length"/utf8>>},
36123614
info = {map, [{{symbol, <<"queue">>}, {utf8, QName}},
36133615
{{symbol, <<"reason">>}, {symbol, <<"maxlen">>}}]}},
36143616
Error)
@@ -3667,6 +3669,7 @@ target_classic_queue_rejects(Config) ->
36673669
ok = amqp10_client:send_msg(Sender, amqp10_msg:new(<<"t2">>, <<"m2">>)),
36683670
ExpectedErr1 = #'v1_0.error'{
36693671
condition = ?V_1_0_AMQP_ERROR_PRECONDITION_FAILED,
3672+
description = {utf8, <<"queue '", QName1/binary, "' exceeded maximum length">>},
36703673
info = {map, [{{symbol, <<"queue">>}, {utf8, QName1}},
36713674
{{symbol, <<"reason">>}, {symbol, <<"maxlen">>}}]}},
36723675
ok = wait_for_settlement(<<"t2">>, {rejected, ExpectedErr1}),
@@ -3693,6 +3696,7 @@ target_classic_queue_rejects(Config) ->
36933696
ok = amqp10_client:send_msg(Sender, amqp10_msg:new(<<"t3">>, <<"m3">>)),
36943697
ExpectedErr3 = #'v1_0.error'{
36953698
condition = ?V_1_0_AMQP_ERROR_PRECONDITION_FAILED,
3699+
description = {utf8, <<"queue '", QName2/binary, "' is unavailable">>},
36963700
info = {map, [{{symbol, <<"queue">>}, {utf8, QName2}},
36973701
{{symbol, <<"reason">>}, {symbol, <<"unavailable">>}}]}},
36983702
ok = wait_for_settlement(<<"t3">>, {rejected, ExpectedErr3}),

0 commit comments

Comments
 (0)