Compare commits

...

2 Commits

5 changed files with 20 additions and 12 deletions

View File

@@ -1,5 +1,11 @@
# Changelog # Changelog
## 2026-03-15 - 4.5.2 - fix(remoteingress-core)
improve stream flow control retries and increase channel buffer capacity
- increase per-stream mpsc channel capacity from 128 to 256 on both edge and hub paths
- only reset accumulated window update bytes after a successful try_send to avoid dropping flow-control credits when the update channel is busy
## 2026-03-15 - 4.5.1 - fix(protocol) ## 2026-03-15 - 4.5.1 - fix(protocol)
increase per-stream flow control window and channel buffers to improve high-RTT throughput increase per-stream flow control window and channel buffers to improve high-RTT throughput

View File

@@ -1,6 +1,6 @@
{ {
"name": "@serve.zone/remoteingress", "name": "@serve.zone/remoteingress",
"version": "4.5.1", "version": "4.5.2",
"private": false, "private": false,
"description": "Edge ingress tunnel for DcRouter - accepts incoming TCP connections at network edge and tunnels them to DcRouter SmartProxy preserving client IP via PROXY protocol v1.", "description": "Edge ingress tunnel for DcRouter - accepts incoming TCP connections at network edge and tunnels them to DcRouter SmartProxy preserving client IP via PROXY protocol v1.",
"main": "dist_ts/index.js", "main": "dist_ts/index.js",

View File

@@ -625,7 +625,7 @@ async fn handle_client_connection(
} }
// Set up channel for data coming back from hub (capacity 16 is sufficient with flow control) // Set up channel for data coming back from hub (capacity 16 is sufficient with flow control)
let (back_tx, mut back_rx) = mpsc::channel::<Vec<u8>>(128); let (back_tx, mut back_rx) = mpsc::channel::<Vec<u8>>(256);
let send_window = Arc::new(AtomicU32::new(INITIAL_STREAM_WINDOW)); let send_window = Arc::new(AtomicU32::new(INITIAL_STREAM_WINDOW));
let window_notify = Arc::new(Notify::new()); let window_notify = Arc::new(Notify::new());
{ {
@@ -657,10 +657,11 @@ async fn handle_client_connection(
// Track consumption for flow control // Track consumption for flow control
consumed_since_update += len; consumed_since_update += len;
if consumed_since_update >= WINDOW_UPDATE_THRESHOLD { if consumed_since_update >= WINDOW_UPDATE_THRESHOLD {
let increment = consumed_since_update; let frame = encode_window_update(stream_id, FRAME_WINDOW_UPDATE, consumed_since_update);
consumed_since_update = 0; if wu_tx.try_send(frame).is_ok() {
let frame = encode_window_update(stream_id, FRAME_WINDOW_UPDATE, increment); consumed_since_update = 0;
let _ = wu_tx.try_send(frame); }
// If try_send fails, keep accumulating — retry on next threshold
} }
} }
None => break, None => break,

View File

@@ -477,7 +477,7 @@ async fn handle_edge_connection(
}); });
// Create channel for data from edge to this stream (capacity 16 is sufficient with flow control) // Create channel for data from edge to this stream (capacity 16 is sufficient with flow control)
let (data_tx, mut data_rx) = mpsc::channel::<Vec<u8>>(128); let (data_tx, mut data_rx) = mpsc::channel::<Vec<u8>>(256);
let send_window = Arc::new(AtomicU32::new(INITIAL_STREAM_WINDOW)); let send_window = Arc::new(AtomicU32::new(INITIAL_STREAM_WINDOW));
let window_notify = Arc::new(Notify::new()); let window_notify = Arc::new(Notify::new());
{ {
@@ -528,10 +528,11 @@ async fn handle_edge_connection(
// Track consumption for flow control // Track consumption for flow control
consumed_since_update += len; consumed_since_update += len;
if consumed_since_update >= WINDOW_UPDATE_THRESHOLD { if consumed_since_update >= WINDOW_UPDATE_THRESHOLD {
let increment = consumed_since_update; let frame = encode_window_update(stream_id, FRAME_WINDOW_UPDATE_BACK, consumed_since_update);
consumed_since_update = 0; if wub_tx.try_send(frame).is_ok() {
let frame = encode_window_update(stream_id, FRAME_WINDOW_UPDATE_BACK, increment); consumed_since_update = 0;
let _ = wub_tx.try_send(frame); }
// If try_send fails, keep accumulating — retry on next threshold
} }
} }
None => break, None => break,

View File

@@ -3,6 +3,6 @@
*/ */
export const commitinfo = { export const commitinfo = {
name: '@serve.zone/remoteingress', name: '@serve.zone/remoteingress',
version: '4.5.1', version: '4.5.2',
description: 'Edge ingress tunnel for DcRouter - accepts incoming TCP connections at network edge and tunnels them to DcRouter SmartProxy preserving client IP via PROXY protocol v1.' description: 'Edge ingress tunnel for DcRouter - accepts incoming TCP connections at network edge and tunnels them to DcRouter SmartProxy preserving client IP via PROXY protocol v1.'
} }