scaling fix: coalesce session push notifications

This commit is contained in:
Alain Zscheile 2022-11-27 19:04:15 +01:00
parent d97a7bff81
commit 85e31bbca0
2 changed files with 15 additions and 2 deletions

View file

@ -95,7 +95,11 @@ defmodule Floof do
{backlog, sesskey}
{:SessionPushed, sesskey} ->
:ok = send_summary(client, :requestpull, Floof.SessionManager.peek(sesskey))
sesskeys = coalesce_sesspushes([sesskey])
[sesskey | _] = sesskeys
dcdids = Enum.map(MapSet.new(sesskeys), &MapSet.new(Floof.SessionManager.peek(&1)))
dcdids = Enum.reduce(dcdids, &MapSet.union(&1, &2))
:ok = send_summary(client, :requestpull, dcdids)
{backlog, sesskey}
{:SessionDetached, old_sesskey} ->
@ -198,6 +202,14 @@ defmodule Floof do
:ok = Floof.PacketSpool.store_new_multi(backlog)
end
defp coalesce_sesspushes(sesskeys) do
receive do
{:SessionPushed, sesskey} -> coalesce_sesspushes([sesskey | sesskeys])
after
10 -> sesskeys
end
end
defp partition_hashes(xs) do
xs
|> Floof.DistributorSeen.have_we_multi()

View file

@ -105,7 +105,8 @@ defmodule Floof.SessionManager do
&case :dets.lookup(&1.dets_file, key) do
{:error, _} -> []
items -> Enum.map(items, fn {_, x} -> x end)
end
end,
:infinity
)
end