Bedrock.Internal.WaitingList (bedrock v0.5.3)
View SourceUnified waiting list for version-based out-of-order request handling.
Supports both single-waiter (Resolver) and multi-waiter (LongPulls) patterns using a map of deadline-sorted lists.
Structure: %{version => [{deadline, reply_fn, data}, ...]} Lists are sorted by deadline (earliest first).
Summary
Functions
Expire entries past their deadline from waiting list. Returns {new_map, expired_entries}.
Expire entries past their deadline from waiting list using provided time function. Returns {new_map, expired_entries}.
Find first entry for a version without removing it. Returns entry or nil.
Add entry to waiting list with deadline. Lists are kept sorted by deadline (earliest first). Returns {new_map, timeout_for_next_deadline}.
Add entry to waiting list with deadline using provided time function. Lists are kept sorted by deadline (earliest first). Returns {new_map, timeout_for_next_deadline}.
Calculate timeout for next deadline in waiting list.
Calculate timeout for next deadline in waiting list using provided time function.
Remove first entry for a version from waiting list. For single-waiter patterns (Resolver). Returns {new_map, removed_entry | nil}.
Remove all entries for a version from waiting list. For multi-waiter patterns (LongPulls). Returns {new_map, removed_entries}.
Remove all entries where version is less than the given threshold. For range-match patterns (Demux/ShardServer long-pull). Returns {new_map, removed_entries} where entries are flattened across all matching versions.
Reply to expired entries with error response.
Types
@type reply_fn() :: (any() -> :ok)
@type timeout_ms() :: non_neg_integer()
@type version() :: Bedrock.version()
Functions
Expire entries past their deadline from waiting list. Returns {new_map, expired_entries}.
Expire entries past their deadline from waiting list using provided time function. Returns {new_map, expired_entries}.
Find first entry for a version without removing it. Returns entry or nil.
Add entry to waiting list with deadline. Lists are kept sorted by deadline (earliest first). Returns {new_map, timeout_for_next_deadline}.
Add entry to waiting list with deadline using provided time function. Lists are kept sorted by deadline (earliest first). Returns {new_map, timeout_for_next_deadline}.
Calculate timeout for next deadline in waiting list.
Calculate timeout for next deadline in waiting list using provided time function.
Remove first entry for a version from waiting list. For single-waiter patterns (Resolver). Returns {new_map, removed_entry | nil}.
Remove all entries for a version from waiting list. For multi-waiter patterns (LongPulls). Returns {new_map, removed_entries}.
Remove all entries where version is less than the given threshold. For range-match patterns (Demux/ShardServer long-pull). Returns {new_map, removed_entries} where entries are flattened across all matching versions.
Example
iex> map = %{5 => [{...}], 10 => [{...}], 15 => [{...}]}
iex> {new_map, removed} = WaitingList.remove_all_less_than(map, 12)
iex> Map.keys(new_map)
[15] # only version 15 remains
Reply to expired entries with error response.