Skip to content

Commit da2255d

Browse files
authored
Merge pull request #14238 from rabbitmq/optimise-amqp-parser
Make AMQP 1.0 faster
2 parents f8eac1d + 80a687f commit da2255d

File tree

11 files changed

+535
-58
lines changed

11 files changed

+535
-58
lines changed

deps/amqp10_client/src/amqp10_client_internal.hrl

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77

88
-define(AMQP_PROTOCOL_HEADER, <<"AMQP", 0, 1, 0, 0>>).
99
-define(SASL_PROTOCOL_HEADER, <<"AMQP", 3, 1, 0, 0>>).
10-
-define(FRAME_HEADER_SIZE, 8).
1110

1211
-define(TIMEOUT, 5000).
1312

deps/amqp10_client/src/amqp10_client_session.erl

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -625,8 +625,8 @@ send_transfer(Transfer0, Sections0, FooterOpt, MaxMessageSize,
625625
channel = Channel,
626626
connection_config = Config}) ->
627627
OutMaxFrameSize = maps:get(outgoing_max_frame_size, Config),
628-
Transfer = amqp10_framing:encode_bin(Transfer0),
629-
TransferSize = iolist_size(Transfer),
628+
Transfer = Transfer0#'v1_0.transfer'{more = false},
629+
TransferSize = iolist_size(amqp10_framing:encode_bin(Transfer)),
630630
Sections = encode_sections(Sections0, FooterOpt),
631631
SectionsBin = iolist_to_binary(Sections),
632632
if is_integer(MaxMessageSize) andalso
@@ -636,8 +636,8 @@ send_transfer(Transfer0, Sections0, FooterOpt, MaxMessageSize,
636636
true ->
637637
% TODO: this does not take the extended header into account
638638
% see: 2.3
639-
MaxPayloadSize = OutMaxFrameSize - TransferSize - ?FRAME_HEADER_SIZE,
640-
Frames = build_frames(Channel, Transfer0, SectionsBin, MaxPayloadSize, []),
639+
MaxPayloadSize = OutMaxFrameSize - ?FRAME_HEADER_SIZE - TransferSize,
640+
Frames = build_frames(Channel, Transfer, SectionsBin, MaxPayloadSize, []),
641641
ok = socket_send(Socket, Frames),
642642
{ok, length(Frames)}
643643
end.
@@ -722,7 +722,7 @@ set_flow_session_fields(Flow, #state{next_incoming_id = NID,
722722

723723
build_frames(Channel, Trf, Bin, MaxPayloadSize, Acc)
724724
when byte_size(Bin) =< MaxPayloadSize ->
725-
T = amqp10_framing:encode_bin(Trf#'v1_0.transfer'{more = false}),
725+
T = amqp10_framing:encode_bin(Trf),
726726
Frame = amqp10_binary_generator:build_frame(Channel, [T, Bin]),
727727
lists:reverse([Frame | Acc]);
728728
build_frames(Channel, Trf, Payload, MaxPayloadSize, Acc) ->

deps/amqp10_common/include/amqp10_types.hrl

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22

33
% [1.6.5]
44
-type uint() :: 0..?UINT_MAX.
5+
6+
% [2.3.1]
7+
-define(FRAME_HEADER_SIZE, 8).
8+
59
% [2.8.4]
610
-type link_handle() :: uint().
711
% [2.8.8]

deps/amqp10_common/src/amqp10_binary_generator.erl

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -99,10 +99,10 @@ generate1({boolean, false}) -> [16#56, 16#00];
9999
%% bits set to zero and values < 256.
100100
generate1({ubyte, V}) -> [16#50, V];
101101
generate1({ushort, V}) -> <<16#60,V:16/unsigned>>;
102-
generate1({uint, V}) when V =:= 0 -> 16#43;
102+
generate1({uint, 0}) -> 16#43;
103103
generate1({uint, V}) when V < 256 -> [16#52, V];
104104
generate1({uint, V}) -> <<16#70,V:32/unsigned>>;
105-
generate1({ulong, V}) when V =:= 0 -> 16#44;
105+
generate1({ulong, 0}) -> 16#44;
106106
generate1({ulong, V}) when V < 256 -> [16#53, V];
107107
generate1({ulong, V}) -> <<16#80,V:64/unsigned>>;
108108
generate1({byte, V}) -> <<16#51,V:8/signed>>;
@@ -204,9 +204,9 @@ constructor(array) -> 16#f0; % use large array type for all nested arrays
204204
constructor({described, Descriptor, Primitive}) ->
205205
[16#00, generate1(Descriptor), constructor(Primitive)].
206206

207-
generate2(symbol, {symbol, V}) -> [<<(size(V)):32>>, V];
208-
generate2(utf8, {utf8, V}) -> [<<(size(V)):32>>, V];
209-
generate2(binary, {binary, V}) -> [<<(size(V)):32>>, V];
207+
generate2(symbol, {symbol, V}) -> [<<(byte_size(V)):32>>, V];
208+
generate2(utf8, {utf8, V}) -> [<<(byte_size(V)):32>>, V];
209+
generate2(binary, {binary, V}) -> [<<(byte_size(V)):32>>, V];
210210
generate2(boolean, true) -> 16#01;
211211
generate2(boolean, false) -> 16#00;
212212
generate2(boolean, {boolean, true}) -> 16#01;

0 commit comments

Comments
 (0)