fix(gateway): always trim the connect snapshot for guild connects (#2943)

This commit is contained in:
Hampus authored and GitHub committed 2026-09-24 17:09:48 +02:00
1 parent b8e3807262
commit 43741cdad8
1 file changed
+16 -62
+16 -62
View File
@@ -26,7 +26,6 @@
<<"members">>, members_normalized, <<"member_role_index">>, members_sorted_ids
]).
-define(CONNECT_SNAPSHOT_HEAVY_SESSION_KEYS, [active_guilds, user_roles, viewable_channels]).
-define(DEFAULT_CONNECT_SNAPSHOT_TRIM_MEMBERS, 5000).
-export_type([guild_state/0, guild_reply/1, user_id/0]).
@@ -196,32 +195,7 @@ maybe_trim_connect_snapshot(Item, Base, State) ->
-spec should_trim_connect_snapshot(guild_state()) -> boolean().
should_trim_connect_snapshot(State) ->
case connect_snapshot_trim_member_threshold() of
undefined ->
false;
Threshold ->
member_count_at_least(Threshold, State) andalso has_members_ets(State)
end.
-spec member_count_at_least(pos_integer(), guild_state()) -> boolean().
member_count_at_least(Threshold, State) ->
case maps:get(member_count, State, undefined) of
Count when is_integer(Count) -> Count >= Threshold;
_ -> false
end.
-spec connect_snapshot_trim_member_threshold() -> pos_integer() | undefined.
connect_snapshot_trim_member_threshold() ->
case
application:get_env(
fluxer_gateway,
connect_snapshot_trim_member_threshold,
?DEFAULT_CONNECT_SNAPSHOT_TRIM_MEMBERS
)
of
N when is_integer(N), N > 0 -> N;
_ -> undefined
end.
has_members_ets(State).
-spec has_members_ets(guild_state()) -> boolean().
has_members_ets(#{data := #{members_ets := Tab}}) -> is_reference(Tab);
@@ -549,47 +523,27 @@ projection_keeps_snapshot_without_sessions_test() ->
trim_state(MemberCount) ->
#{id => 42, member_count => MemberCount, data => #{members_ets => make_ref()}}.
with_trim_threshold(Threshold, Fun) ->
application:set_env(fluxer_gateway, connect_snapshot_trim_member_threshold, Threshold),
trim_applies_at_every_member_count_test() ->
?assertEqual(true, should_trim_connect_snapshot(trim_state(49435))),
?assertEqual(true, should_trim_connect_snapshot(trim_state(5000))),
?assertEqual(true, should_trim_connect_snapshot(trim_state(1))),
?assertEqual(true, should_trim_connect_snapshot(maps:remove(member_count, trim_state(1)))).
trim_ignores_threshold_env_test() ->
application:set_env(fluxer_gateway, connect_snapshot_trim_member_threshold, 20000),
try
Fun()
?assertEqual(true, should_trim_connect_snapshot(trim_state(1)))
after
application:unset_env(fluxer_gateway, connect_snapshot_trim_member_threshold)
end.
trim_defaults_to_large_guilds_test() ->
application:unset_env(fluxer_gateway, connect_snapshot_trim_member_threshold),
Default = ?DEFAULT_CONNECT_SNAPSHOT_TRIM_MEMBERS,
?assertEqual(true, should_trim_connect_snapshot(trim_state(49435))),
?assertEqual(true, should_trim_connect_snapshot(trim_state(Default))),
?assertEqual(false, should_trim_connect_snapshot(trim_state(Default - 1))).
trim_needs_member_count_at_threshold_test() ->
with_trim_threshold(20000, fun() ->
?assertEqual(true, should_trim_connect_snapshot(trim_state(49435))),
?assertEqual(true, should_trim_connect_snapshot(trim_state(20000))),
?assertEqual(false, should_trim_connect_snapshot(trim_state(19999))),
NoCount = maps:remove(member_count, trim_state(1)),
?assertEqual(false, should_trim_connect_snapshot(NoCount))
end).
trim_needs_members_ets_test() ->
with_trim_threshold(1, fun() ->
?assertEqual(false, should_trim_connect_snapshot(#{member_count => 10, data => #{}})),
?assertEqual(
false,
should_trim_connect_snapshot(#{member_count => 10, data => #{members_ets => 7}})
),
?assertEqual(false, should_trim_connect_snapshot(#{member_count => 10}))
end).
trim_ignores_invalid_threshold_test() ->
with_trim_threshold(0, fun() ->
?assertEqual(false, should_trim_connect_snapshot(trim_state(49435)))
end),
with_trim_threshold(not_an_integer, fun() ->
?assertEqual(false, should_trim_connect_snapshot(trim_state(49435)))
end).
?assertEqual(false, should_trim_connect_snapshot(#{member_count => 10, data => #{}})),
?assertEqual(
false,
should_trim_connect_snapshot(#{member_count => 10, data => #{members_ets => 7}})
),
?assertEqual(false, should_trim_connect_snapshot(#{member_count => 10})).
trim_and_projection_target_disjoint_keys_test() ->
?assertEqual(