Airframe 2026.2.5: sendSafe throws on connection failures
2 hours ago
Airframe 2026.2.5 is a small release built around one fix. When a request fails before the server responds, sendSafe and RPC calls now report an error with the real cause attached, instead of a made-up 500 response. On the server side, Netty streams of server-sent events now tell clients to close the connection. The rest is dependency updates, and one of those changes how Parquet writers behave.
Ask about this presentation
Chapters
Show transcriptHide transcript
Airframe 2026.2.5 is a small release built around one fix. When a request fails before the server responds, sendSafe and RPC calls now report an error with the real cause attached, instead of a made-up 500 response. On the server side, Netty streams of server-sent events now tell clients to close the connection. The rest is dependency updates, and one of those changes how Parquet writers behave.
This is the change you are most likely to notice. Until now, a refused connection made sendSafe return a status 500 response that the client invented, so an unreachable server looked like a crashing one. Now sendSafe throws an HttpClientException with the connection error as its cause, and the async client fails its stream the same way. A real answer, even a 503 after retries, still comes back as the response.
RPC calls used to report the same failure as an empty 500 response. Now they raise an RPCException with the UNAVAILABLE status, a message that starts with "No response from the server", and the original error as its cause. That holds for the sync and the async client, so error handling that checks the RPC status will see UNAVAILABLE here.
On the server, airframe-http-netty closes the channel once an event stream writes its last chunk. But the response headers still said keep-alive, which invited clients to reuse a connection that was about to close. Now the header says close, for HTTP 1.1 and HTTP 1.0 requests alike, and a successful stream keeps the channel open until it has sent everything.
Three libraries moved up: gRPC to 1.85.1, Jackson to 2.22.4, and Parquet to 1.18.1. The Parquet update matters if you use airframe-parquet. Since parquet-java 1.18, a writer is aborted after any write error, so once one write throws, the next write on that writer fails with an IOException. Open a new writer after a bad record.
Before you move to 2026.2.5, look at three places. Anywhere you call sendSafe and read a 500 as the server being down, catch HttpClientException instead. Anywhere you handle RPC errors, expect UNAVAILABLE when the server can't be reached. And if you write Parquet files, open a new writer after a failed write. The method signatures stay the same; what changes is how a failure reaches you.
This is a narrow release. It adds zero new APIs; the changes are in error reporting, one response header, and dependency versions. If your code counts on sendSafe returning a response for every failure, read pull request 4274 before you upgrade. Otherwise, Airframe 2026.2.5 reports connection failures as errors, with the real cause attached.






