v5.1.18
Blob replication reliability
- Blob apply loop could freeze on wire-carried save flags (#1641) — the apply path gated a receiver's commit on the sender's in-flight save state, which could freeze the whole apply loop if that stream stalled. Apply commits are no longer gated on those flags at all; instead, a local write with a fresh blob now gates its own commit on the blob's durable save, so a record can no longer commit (and replicate) a not-yet-durable blob reference.
- Cache record headers could be corrupted after a shared response body (#1709) — mutating a cached record's headers/status in
finalizeResponsecould mutate the live cached record itself when the response body was shared, corrupting future reads of that record. The response path now copies before mutating.
Fleet upgrade & deployment
- Graceful worker-shutdown drain hook (#1621) — adds a registry (
registerShutdownDrain) that lets in-flight work (e.g. in-progress blob sends) finish before a worker thread exits, instead of being cut off mid-transfer during a rolling restart or upgrade. - Deploy could silently truncate the tarball on a dangling symlink (#1718) —
deploy_componentreported success even when a dangling symlink caused the packaging walker to stop early and drop every entry queued after it. The packager now pre-scans for dangling symlinks and excludes just those, instead of the walk bailing out silently. - Docker entrypoint exec-format error on 5.1.x (#1619) — the container entrypoint could be written empty via a
RUNheredoc redirect, producing anexec format errorat startup. It's now written via aCOPYheredoc so the image boots reliably. - npm
latest/nextdist-tags could be stolen by an older release line (#1690) — publishing any release moved thelatest/nexttag regardless of version, so a 5.0.x patch published after a 5.1.x release could steallatestback onto 5.0.x. The tag now only moves forward for the line it belongs to. - Periodic re-read safety net for the TLS cert watcher (#1394) — adds a polling fallback alongside the filesystem watcher so a missed cert-rotation event (e.g. from certain volume mounts) doesn't leave a node running on a stale certificate indefinitely.
MQTT
- Shared MQTT port across workers (#1603) — workers now share the MQTT listener port (except on macOS), so MQTT works correctly on multi-worker instances.
MCP
- Missing
MCP-Protocol-Versionheader on an established session no longer 400s (#1694) — clients that negotiated a newer protocol version but omit the header on individual requests (permitted by spec) were incorrectly rejected. The session's already-negotiated version is now used when the header is absent. - Static plugin serving nothing when
urlPathis configured (#1584) — fixes a static-file plugin regression where a configuredurlPathresulted in no files being served.
Also in this release
threads.preloadconfig to preload modules (e.g. APM agents) on worker threads (#1569).fix(queue):waitForDrainno longer hangs if the queue empties without emitting adrainedevent (#1643).
Full Changelog: v5.1.17...v5.1.18