From 43741cdad833b873acaa8752fd75ec4a96c0e03b Mon Sep 17 00:00:00 2001 From: Hampus Date: Thu, 24 Sep 2026 17:09:48 +0200 Subject: [PATCH] fix(gateway): always trim the connect snapshot for guild connects (#2943) --- fluxer_gateway/src/guild/guild_data.erl | 78 +++++-------------------- 1 file changed, 16 insertions(+), 62 deletions(-) diff --git a/fluxer_gateway/src/guild/guild_data.erl b/fluxer_gateway/src/guild/guild_data.erl index 115059f99..5cff751af 100644 --- a/fluxer_gateway/src/guild/guild_data.erl +++ b/fluxer_gateway/src/guild/guild_data.erl @@ -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(