Per-node concurrency limiter for runtime module compilation.
Compiling is CPU-bound, so allowing more compiles at once than the node has cores only
thrashes the scheduler and the (single) code server — it does NOT add resources. This gate
caps concurrent compiles to System.schedulers_online() (one per core, the measured sweet
spot); extra compiles wait in a FIFO queue and start as slots free. So a cold-start burst of
many distinct pages can't saturate the node and stall live requests.
Every compile funnels through run/1, called by the one
MishkaCmsCore.Runtime.Handlers.ModuleCompilerHandler worker a module has — covering boot,
lazy first-request, and Oban-worker compiles. The callers waiting for that worker hold no slot.
Per-node by design: CPU is a per-node resource, so each node throttles its own compiles with
zero cluster coordination. The limit is overridable via
config :mishka_cms_core, :compile_gate_limit.
Summary
Functions
Returns a specification to start this module under a supervisor.
How many compiles this node runs at once.
Run fun once a compile slot is free — blocking the caller until one opens — then release the
slot. The holder is monitored, so if fun raises or the caller is killed the slot is still
reclaimed (see handle_info/2); a slot is never leaked.
Functions
Returns a specification to start this module under a supervisor.
See Supervisor.
@spec limit() :: pos_integer()
How many compiles this node runs at once.
Run fun once a compile slot is free — blocking the caller until one opens — then release the
slot. The holder is monitored, so if fun raises or the caller is killed the slot is still
reclaimed (see handle_info/2); a slot is never leaked.