From b6f551000f611d493e45261bab0fe431efcfcf9f Mon Sep 17 00:00:00 2001 From: sh <37271604+shumvgolove@users.noreply.github.com> Date: Mon, 18 May 2026 13:35:47 +0000 Subject: [PATCH] ntf server: concurrent APNS push via sendRequestDirect (#1780) The per-(srvHost, provider) worker shards added in #1779 still funnel all APNS sends through one HTTP2Client's reqQ, where a single process thread calls sendRequest serially - one in-flight HTTP/2 stream at a time, capping APNS throughput at 1/RTT. sendRequestDirect bypasses the queue and invokes sendReq directly from the calling worker, so concurrent workers open parallel HTTP/2 streams on the shared APNS connection and the multiplexing happens on the wire. --- src/Simplex/Messaging/Notifications/Server/Push/APNS.hs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Simplex/Messaging/Notifications/Server/Push/APNS.hs b/src/Simplex/Messaging/Notifications/Server/Push/APNS.hs index 47dc435c2..0657e5cec 100644 --- a/src/Simplex/Messaging/Notifications/Server/Push/APNS.hs +++ b/src/Simplex/Messaging/Notifications/Server/Push/APNS.hs @@ -346,7 +346,7 @@ apnsPushProviderClient c@APNSPushClient {nonceDrg, apnsCfg} tkn@NtfTknRec {token nonce <- atomically $ C.randomCbNonce nonceDrg apnsNtf <- liftEither $ first PPCryptoError $ apnsNotification tkn nonce (paddedNtfLength apnsCfg) pn req <- liftIO $ apnsRequest c tknStr apnsNtf - HTTP2Response {response, respBody = HTTP2Body {bodyHead}} <- liftHTTPS2 $ sendRequest http2 req Nothing + HTTP2Response {response, respBody = HTTP2Body {bodyHead}} <- liftHTTPS2 $ sendRequestDirect http2 req Nothing let status = H.responseStatus response reason' = maybe "" reason $ J.decodeStrict' bodyHead if status == Just N.ok200