Merge pull request #13922 from rabbitmq/mergify/bp/v4.1.x/pr-13920
Trigger a 4.1.x alpha release build / trigger_alpha_build (push) Has been cancelled Details
Test (make) / Build and Xref (1.17, 26) (push) Has been cancelled Details
Test (make) / Build and Xref (1.17, 27) (push) Has been cancelled Details
Test (make) / Test (1.17, 27, khepri) (push) Has been cancelled Details
Test (make) / Test (1.17, 27, mnesia) (push) Has been cancelled Details
Test (make) / Test mixed clusters (1.17, 27, khepri) (push) Has been cancelled Details
Test (make) / Test mixed clusters (1.17, 27, mnesia) (push) Has been cancelled Details
Test (make) / Type check (1.17, 27) (push) Has been cancelled Details

Add a proptest checking `ra_indexes` indices (backport #13920)
This commit is contained in:
Michael Klishin 2025-05-21 05:20:29 +04:00 committed by GitHub
commit c1086b98ff
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 63 additions and 1 deletions

View File

@ -7,7 +7,8 @@
delete/2, delete/2,
size/1, size/1,
smallest/1, smallest/1,
map/2 map/2,
to_list/1
]). ]).
-compile({no_auto_import, [size/1]}). -compile({no_auto_import, [size/1]}).
@ -87,6 +88,10 @@ smallest(#?MODULE{smallest = Smallest}) ->
map(F, #?MODULE{data = Data} = State) -> map(F, #?MODULE{data = Data} = State) ->
State#?MODULE{data = maps:map(F, Data)}. State#?MODULE{data = maps:map(F, Data)}.
% Note: the ordering of the list is undefined. Sort the list for ordering.
-spec to_list(state()) -> [integer()].
to_list(#?MODULE{data = Data}) ->
maps:keys(Data).
%% internal %% internal

View File

@ -64,6 +64,7 @@ all_tests() ->
scenario32, scenario32,
upgrade, upgrade,
messages_total, messages_total,
ra_indexes,
simple_prefetch, simple_prefetch,
simple_prefetch_without_checkout_cancel, simple_prefetch_without_checkout_cancel,
simple_prefetch_01, simple_prefetch_01,
@ -910,6 +911,30 @@ messages_total(_Config) ->
end) end)
end, [], Size). end, [], Size).
ra_indexes(_Config) ->
meck:expect(rabbit_feature_flags, is_enabled, fun (_) -> false end),
Size = 256,
run_proper(
fun () ->
?FORALL({Length, Bytes, DeliveryLimit, SingleActive},
frequency([{5, {undefined, undefined, undefined, false}},
{5, {oneof([range(1, 10), undefined]),
oneof([range(1, 1000), undefined]),
oneof([range(1, 3), undefined]),
oneof([true, false])
}}]),
begin
Config = config(?FUNCTION_NAME,
Length,
Bytes,
SingleActive,
DeliveryLimit),
?FORALL(O, ?LET(Ops, log_gen(Size), expand(Ops, Config)),
collect({log_size, length(O)},
ra_indexes_prop(Config, O)))
end)
end, [], Size).
simple_prefetch(_Config) -> simple_prefetch(_Config) ->
Size = 500, Size = 500,
meck:expect(rabbit_feature_flags, is_enabled, fun (_) -> true end), meck:expect(rabbit_feature_flags, is_enabled, fun (_) -> true end),
@ -1464,6 +1489,38 @@ messages_total_invariant() ->
end end
end. end.
ra_indexes_prop(Conf0, Commands) ->
Conf = Conf0#{release_cursor_interval => 100},
Indexes = lists:seq(1, length(Commands)),
Entries = lists:zip(Indexes, Commands),
InitState = test_init(Conf),
run_log(InitState, Entries, ra_indexes_invariant()),
true.
ra_indexes_invariant() ->
%% The raft indexes contained in the `ra_indexes` `rabbit_fifo_index` must
%% be the same as all indexes checked out by consumers plus those in the
%% `returns` queue.
fun(#rabbit_fifo{ra_indexes = Index,
consumers = C,
returns = R}) ->
RIdxs = lqueue:fold(fun(?MSG(I, _), Acc) -> [I | Acc] end, [], R),
CIdxs = maps:fold(fun(_, #consumer{checked_out = Ch}, Acc0) ->
maps:fold(fun(_, ?MSG(I, _), Acc) ->
[I | Acc]
end, Acc0, Ch)
end, [], C),
ActualIdxs = lists:sort(RIdxs ++ CIdxs),
IndexIdxs = lists:sort(rabbit_fifo_index:to_list(Index)),
case ActualIdxs == IndexIdxs of
true -> true;
false ->
ct:pal("ra_indexes invariant failed Expected ~b Got ~b",
[ActualIdxs, IndexIdxs]),
false
end
end.
simple_prefetch_prop(Conf0, Commands, WithCheckoutCancel) -> simple_prefetch_prop(Conf0, Commands, WithCheckoutCancel) ->
Conf = Conf0#{release_cursor_interval => 100}, Conf = Conf0#{release_cursor_interval => 100},
Indexes = lists:seq(1, length(Commands)), Indexes = lists:seq(1, length(Commands)),