Packages
snakepit
0.8.2
0.13.0
0.12.0
0.11.1
0.11.0
0.10.1
0.10.0
0.9.1
0.9.0
0.8.9
0.8.8
0.8.7
0.8.6
0.8.5
0.8.4
0.8.3
0.8.2
0.8.1
0.8.0
0.7.7
0.7.6
0.7.5
0.7.4
0.7.3
0.7.2
0.7.1
0.7.0
0.6.11
0.6.10
0.6.9
0.6.8
0.6.7
0.6.6
0.6.5
0.6.4
0.6.3
0.6.2
0.6.1
0.6.0
0.5.1
0.5.0
0.4.3
0.4.2
0.4.1
0.4.0
0.3.3
0.3.2
0.3.1
0.3.0
0.2.1
0.2.0
0.1.2
0.1.1
0.1.0
High-performance pooler and session manager for external language integrations. Supports Python, Node.js, Ruby, and more with gRPC streaming, session management, and production-ready process cleanup.
Current section
Files
Jump to
Current section
Files
lib/snakepit/supervisor_tree.md
# Snakepit Supervision Tree
The following Mermaid diagram captures the runtime supervision tree that
`Snakepit.Application` boots. Two sets of children exist:
- **Base services** always start (session store + tool registry).
- **Pooling branch** activates when `:pooling_enabled` is true, which is the
typical production configuration.
```mermaid
flowchart TD
A["Snakepit.Supervisor\n(strategy: one_for_one)"]
A --> B["Snakepit.Bridge.SessionStore\n(GenServer)"]
A --> C["Snakepit.Bridge.ToolRegistry\n(GenServer)"]
subgraph "Pooling Enabled (:pooling_enabled == true)"
direction TB
A --> D["GRPC.Server.Supervisor\nSnakepit.GRPC.Endpoint"]
D --> D1["Cowboy/Ranch Acceptors"]
A --> E["Task.Supervisor\n(Snakepit.TaskSupervisor)"]
A --> F["Snakepit.Pool.Registry\n(Registry)"]
A --> G["Snakepit.Pool.Worker.StarterRegistry\n(Registry)"]
A --> H["Snakepit.Pool.ProcessRegistry\n(GenServer + ETS)"]
A --> I["Snakepit.Pool.WorkerSupervisor\n(DynamicSupervisor)"]
A --> J["Snakepit.Worker.LifecycleManager\n(GenServer)"]
A --> K["Snakepit.Pool\n(GenServer)\nrequest routing"]
A --> L["Snakepit.Pool.ApplicationCleanup\n(GenServer)\nfirst to stop"]
end
subgraph "Pooling Disabled (:pooling_enabled == false)"
direction TB
A --> M["(no additional children)\nuseful for tests"]
end
```
**Notes**
- `GRPC.Server.Supervisor` encapsulates `Snakepit.GRPC.Endpoint` which exposes
the Elixir bridge services.
- `Snakepit.Pool.WorkerSupervisor` dynamically supervises worker GenServers
(`Snakepit.GRPCWorker` et al.) under a `:one_for_one` strategy.
- `Snakepit.Pool.ProcessRegistry` tracks external OS PIDs and run IDs to ensure
cleanup routines know which processes belong to the current BEAM instance.
- `Snakepit.Pool.ApplicationCleanup` is intentionally listed last so it
terminates first and can reap external processes before other supervisors
shut down.