Baby
Bushbaby Automated Bamboo Yields
Sync for Bamboo stores using the Bushbaby protocol
Connection tuning
The per-connection idle timeout is governed by four settings, all read from
Application config (config :baby, ...) at connection startup, and overridable
per-connection:
:outrate— milliseconds between outbox ticks. Default: a random prime near 75 (jittered so connections don't tick in lockstep).:handshake_spins— idle budget, in outbox intervals, before a validHELLOhas been received. A connection that never proves itself is dropped quickly so an anonymous flood cannot pin the listener's connection slots. Default: a random prime near 375 (~30s at the default outrate).:max_spins— idle budget, in outbox intervals, once the initial replication sync has completed. Default: a random prime near 1200.:bootstrap_spins— idle budget while the initial sync is still in progress, giving the peer time to compute its WANT list before being dropped. Default: a random prime near 3000.
The idle counter resets on any send or receive, so the budgets measure consecutive silence rather than wall-clock time on a busy link. A connection that exceeds its budget is dropped and re-established on the next cryout.
To estimate wall-clock time, multiply the budget by :outrate — e.g. a
default max_spins of ~1193 at a default outrate of ~80ms is roughly 95
seconds, and a default bootstrap_spins of ~2969 is roughly 4 minutes.
config :baby,
outrate: 100,
handshake_spins: 375,
max_spins: 1200,
bootstrap_spins: 5000
Wire buffer
Inbound bytes that have not yet formed a complete protocol frame are buffered
in the connection's wire state. A peer that dribbles undecodable bytes could
otherwise grow this buffer without bound, so it is capped:
:wire_cap— maximum buffered bytes per connection before the connection is dropped. Read from Application config (config :baby, wire_cap: ...) at connection startup, overridable per-connection. Default: 32MB.
The cap sits comfortably above the largest legitimate frame (a single message may carry an entire log), so it should only trip for garbage; note the protocol spec guidance on authoring log entries that fit within peers' limits.
Listener
The ranch listener that accepts peer connections has a deliberate ceiling on concurrent connections, so a flood of anonymous connections cannot exhaust file descriptors or slot-bound the legitimate peer:
:max_connections— maximum concurrent connections accepted per listener. Read from Application config (config :baby, max_connections: ...) at startup, overridable per-clump. Default: 256 (ranch's own default is 1024).
config :baby, max_connections: 256