fix(gateway): reconcile hotpatched member-list and push fixes (#2425)

This commit is contained in:
Hampus
2026-09-03 17:04:32 +02:00
committed by GitHub
parent 9c1b38aeaf
commit dd1d554cc6
51 changed files with 10273 additions and 847 deletions
@@ -118,6 +118,7 @@ run_broadcast_channel_list_dispatches_sync_immediately() ->
<<"user">> => #{<<"id">> => <<"1">>, <<"username">> => <<"one">>},
<<"roles">> => []
},
ok = guild_member_list_engine:bulk_load(Ref, [{1, <<"one">>, [], true}], []),
OldState = channel_list_state(Ref, make_subs_tab([{<<"500">>, <<"s1">>, [{0, 99}]}]), [
Member
]),
@@ -144,6 +145,9 @@ run_broadcast_channel_list_fans_out_repeated_syncs() ->
#{<<"user">> => #{<<"id">> => <<"1">>, <<"username">> => <<"one">>}},
#{<<"user">> => #{<<"id">> => <<"2">>, <<"username">> => <<"two">>}}
],
ok = guild_member_list_engine:bulk_load(
Ref, [{1, <<"one">>, [], true}, {2, <<"two">>, [], true}], []
),
OldState = channel_list_state(
Ref, make_subs_tab([{<<"500">>, <<"s1">>, [{0, 99}]}]), Members
),
@@ -408,6 +412,7 @@ presence_delta_state(Ref) ->
<<"user">> => #{<<"id">> => <<"1">>, <<"username">> => <<"one">>},
<<"roles">> => []
},
ok = guild_member_list_engine:bulk_load(Ref, [{1, <<"one">>, [], true}], []),
channel_list_state(Ref, make_subs_tab([{<<"500">>, <<"s1">>, [{0, 99}]}]), [Member]).
presence_map(Status, Mobile, CustomStatus) ->
@@ -271,6 +271,9 @@ guild_server_stub(StateData, TestPid) ->
guild_server_stub_loop(StateData, TestPid) ->
receive
{'$gen_call', From, {get_voice_guild_state}} ->
gen:reply(From, undefined),
guild_server_stub_loop(StateData, TestPid);
{'$gen_call', From, {get_sessions}} ->
gen:reply(From, StateData),
guild_server_stub_loop(StateData, TestPid);
@@ -171,8 +171,8 @@ handle_resume_clamps_truncated_gap_in_replay_buffer_test() ->
#{seq => 5, event => message_create, data => #{}}
]
}),
{reply, {ok, Missed, 5}, State1} = session_lifecycle:handle_resume(2, self(), State0),
?assertEqual([4, 5], [maps:get(seq, Event) || Event <- Missed]),
{reply, {ok, [], 5}, State1} = session_lifecycle:handle_resume(2, self(), State0),
?assertEqual([4, 5], collect_dispatched_seqs(2)),
?assertEqual(self(), maps:get(socket_pid, State1)).
handle_resume_clamps_skipped_event_hole_test() ->
@@ -183,8 +183,8 @@ handle_resume_clamps_skipped_event_hole_test() ->
#{seq => 5, event => message_create, data => #{}}
]
}),
{reply, {ok, Missed, 5}, _State1} = session_lifecycle:handle_resume(2, self(), State0),
?assertEqual([3, 5], [maps:get(seq, Event) || Event <- Missed]).
{reply, {ok, [], 5}, _State1} = session_lifecycle:handle_resume(2, self(), State0),
?assertEqual([3, 5], collect_dispatched_seqs(2)).
handle_resume_rejects_seq_ahead_of_current_test() ->
State0 = resume_test_state(#{
@@ -211,8 +211,8 @@ handle_resume_accepts_seq_at_ack_seq_test() ->
#{seq => 10, event => message_create, data => #{}}
]
}),
{reply, {ok, Missed, 10}, _State1} = session_lifecycle:handle_resume(8, self(), State0),
?assertEqual([9, 10], [maps:get(seq, Event) || Event <- Missed]).
{reply, {ok, [], 10}, _State1} = session_lifecycle:handle_resume(8, self(), State0),
?assertEqual([9, 10], collect_dispatched_seqs(2)).
handle_resume_accepts_contiguous_replay_buffer_test() ->
State0 = resume_test_state(#{
@@ -223,8 +223,8 @@ handle_resume_accepts_contiguous_replay_buffer_test() ->
#{seq => 5, event => message_create, data => #{}}
]
}),
{reply, {ok, Missed, 5}, State1} = session_lifecycle:handle_resume(2, self(), State0),
?assertEqual([3, 4, 5], [maps:get(seq, Event) || Event <- Missed]),
{reply, {ok, [], 5}, State1} = session_lifecycle:handle_resume(2, self(), State0),
?assertEqual([3, 4, 5], collect_dispatched_seqs(3)),
?assertEqual(self(), maps:get(socket_pid, State1)).
handle_resume_cancels_pending_resume_timer_test() ->
@@ -445,6 +445,19 @@ resume_test_state(Overrides) ->
Overrides
).
%% Small replay buffers are delivered inline (dispatched straight to the socket) rather
%% than returned in the resume reply, so these tests read the missed events back off
%% self()'s mailbox instead of the (now empty) reply list.
collect_dispatched_seqs(Count) ->
lists:sort([collect_dispatched_seq() || _ <- lists:seq(1, Count)]).
collect_dispatched_seq() ->
receive
{dispatch, _Event, _Payload, Seq} -> Seq
after 200 ->
?assert(false)
end.
fenced_terminate_releases_the_user_session_count_test() ->
ok = session_abuse_protection:ensure_tables(),
UserId = 900201,