Use smaller windows and try to calculate at least one window per ack packet;
and change to a regular moving average to accumulate windows. This improves
the timeliness of ack rate estimates, significantly reducing overcorrection
when delay increases at the same time as a large increase in sending
bandwidth.
Remove the IceTransactionTable, track ping ids in Candidate
Change TimerHeap value to be Arc<Connection>
Mark when a Connection is closed and drop packets related to the Connection if they come in late
Packet servers keep the mapping of socket fd (epoll) or socket address (generic) to Arc<Connection>
Refactor packet_server::epoll::loop into helper functions
When client sends rtp leave, packet server closes connection right away
During tick, SFU informs packet server of connections and candidates to remove
Candidate activity is now inactivity_timeout since the last successful ping and dead candidates are removed
CPU pin epoll threads, per thread cpu-pinned listen sockets, client sockets epolled by single thread, one TimerHeap per thread
Epoll threads will only check and add dequeue timers into their own
TimerHeap. Tick inserts dequeue timers distributed across all threads.
Also eliminate use of deprecated epoll api
Simplify making changes to the calling service by moving the responsibility for lock management into the objects that contain the data that needs to be protected.
Reduce lock contention by converting Mutexes to RwLocks where appropriate and by carefully introducing more locks so that a more fine grained locking strategy can be employed.
Additionally, make Sfu::tick more friendly to concurrency by holding the lock in smaller scopes rather than holding a single lock for the entirety of the tick.