What's New
⚠️ Breaking Changes
- Client-pool reconcile interval is no longer configurable —
SandboxPool.Builder.reconcileInterval(...)and the correspondingPoolConfigsetting have been removed. Pool reconciliation now runs on a fixed one-second cadence, while new sandbox creation is bounded bywarmupCreateQps; callers should delete uses ofreconcileIntervalwith no replacement. #1575
✨ Features
- Scalable asynchronous client-pool warmup — Pool refill now separates create, readiness, prepare, post-prepare health checking, renewal, and commit into a staged asynchronous pipeline. Create admission is rate-limited per pool, delayed retries no longer occupy worker threads, and staged warmups use a single create transport attempt while direct create and other non-pool paths retain their existing retry behavior. #1575
- Pool warmup tracing and operational summaries — Applications can opt in with
ConnectionConfig.enableTracing(true)to emit OpenTelemetry traces covering queue wait and every warmup phase, using the application's global SDK, exporter, sampler, and propagators. Warmups now also expose bounded terminal outcome attributes, rate-limited failure logs, and active-pool summaries without allowing telemetry failures to affect pool behavior. #1524 #1604 - Lifecycle hook models — Sandbox creation now accepts additive
preStartandperiodiclifecycle hook models. Hook timeout validation remains authoritative on the server rather than being duplicated in stable Kotlin models; Docker support, PATCH operations, and additional hook types remain outside this release's scope. #1588 #1605 - Detached runs in isolated sessions — Kotlin consumers can start background work inside a persistent isolated session, poll its status, and read logs incrementally. Background runs are bounded by the session lifetime, do not support per-run timeouts, and are rejected for read-only workspaces because they require a host-visible writable log location. #1456
- Richer runtime metadata — The SDK now models execd hardening capability results and exposes an optional
Sandbox.allocationsummary for confirmed Kubernetes Pool allocations. Allocation metadata is omitted when evidence is incomplete or inconsistent and does not expose Pod, node, namespace, or internal controller details. #1474 #1481 - Shared HTTP connections for client pools — When callers do not provide an OkHttp connection pool,
SandboxPoolnow creates and owns one sized fromwarmupConcurrency, reuses it across warmup, acquire, and direct-create paths, and evicts it on shutdown. User-supplied connection pools retain their existing ownership semantics. #1517
🐛 Bug Fixes
- Stable warmup pacing under failures and throttling — Fast create failures can no longer drive a self-sustaining reconcile loop, and pool warmups now honor
Retry-Afterwithout counting rate limits as degraded failures. Stale-sandbox cleanup triggers prompt replenishment, while concurrent warmup commits no longer serialize behind a single JVM mutex or starve health-check work. #1494 #1512 #1519 #1621 - More actionable client errors — Kotlin
ClientExceptionmessages now retain response bodies for caller-fixable 4xx responses across generated and handwritten paths. Readiness timeout messages no longer suggest Docker bridge, remote-network, or server-proxy settings that may not apply, while preserving timeout and last-error context. #1496 #1493 - Faster bounded idle cleanup —
releaseAllIdle()now deletes idle sandboxes with bounded concurrency instead of serially, preserving best-effort cleanup semantics while substantially reducing drain time for large pools. #1475
📦 Misc
- Published Kotlin/JVM sandbox, code-interpreter, Redis pool, and BOM artifacts at version
1.0.19under the existingcom.alibaba.opensandboxcoordinates.