-
Notifications
You must be signed in to change notification settings - Fork 1
Technical Queues and Memory
Rylan Meilutis edited this page Feb 17, 2026
·
5 revisions
This page documents the bounded queue implementation in src/queue.rs (source | mirror) and how it affects router and relay behavior.
BoundedDeque<T> is a byte‑budgeted queue used by both Router and Relay.
Key properties:
-
Byte budget: each item reports its
byte_costvia theByteCosttrait. -
Hard element cap: capacity never exceeds
max_elems, derived fromsize_of::<T>(). - Eviction policy: evict from the front until a new item fits in the byte budget.
-
Growth policy: multiplicative growth using
QUEUE_GROW_STEP.
This keeps memory use bounded and avoids unbounded VecDeque growth in embedded builds.
Growth uses a rational multiplier instead of floats:
-
float_to_ratioclamps the multiplier (1.01 to 16.0). - Capacity growth is
ceil(cap * grow_num / grow_den). - If the queue is at its hard cap, it evicts instead of growing.
ByteCost is used throughout:
-
RouterTxItem::Broadcast/RouterTxItem::ToSideinclude packet byte cost plus metadata. -
QueueItem::SerializedincludesArc<[u8]>overhead and length. -
RelayRxItemandRelayTxItemaccount for their payload sizes. -
SmallPayloadaccounts for inline vs heap sizes.
Because ByteCost is approximate, the max_elems hard cap prevents pathological growth.
Router:
- RX queue: holds incoming items before processing.
- TX queue: holds items queued for sending.
- Recent‑ID cache:
BoundedDeque<u64>used for dedupe.
Relay:
- RX queue: items received from any side.
- TX queue: items to send to all other sides.
- Recent‑ID cache: similar to Router.
These values are set at compile time via src/config.rs (source | mirror):
STARTING_QUEUE_SIZEMAX_QUEUE_SIZEQUEUE_GROW_STEPMAX_RECENT_RX_IDSSTARTING_RECENT_RX_IDS
They can be overridden using build.py env:KEY=VALUE (
build.py: source | mirror)
or .cargo/config.toml. (
build.py: source | mirror)
- Increase
MAX_QUEUE_SIZEif you see dropped packets under bursty traffic. - Increase
MAX_RECENT_RX_IDSif you have many duplicates across links. - Reduce
QUEUE_GROW_STEPif you want smaller memory spikes.
- If a single item exceeds
MAX_QUEUE_SIZE, it is rejected. - If the queue is full, the oldest item is evicted to make room.
- If handlers are slow, RX queues may accumulate and evict earlier items.