Skip to content

Commit

Permalink
fix: panic in when there is connection window available, but not stre…
Browse files Browse the repository at this point in the history
…am (#657)

We met the panic in our production environment, so handle this panic
    condition before panic. The stack backtrace:

Co-authored-by: winters.zc <winters.zc@antfin.com>
  • Loading branch information
aftersnow and winters.zc committed Feb 13, 2023
1 parent b84c244 commit 73bea23
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 6 deletions.
15 changes: 9 additions & 6 deletions src/proto/streams/flow_control.rs
Expand Up @@ -173,12 +173,15 @@ impl FlowControl {
self.available
);

// Ensure that the argument is correct
assert!(self.window_size >= sz as usize);

// Update values
self.window_size -= sz;
self.available -= sz;
// If send size is zero it's meaningless to update flow control window
if sz > 0 {
// Ensure that the argument is correct
assert!(self.window_size >= sz as usize);

// Update values
self.window_size -= sz;
self.available -= sz;
}
}
}

Expand Down
8 changes: 8 additions & 0 deletions src/proto/streams/prioritize.rs
Expand Up @@ -744,6 +744,14 @@ impl Prioritize {
// capacity at this point.
debug_assert!(len <= self.flow.window_size());

// Check if the stream level window the peer knows is available. In some
// scenarios, maybe the window we know is available but the window which
// peer knows is not.
if len > 0 && len > stream.send_flow.window_size() {
stream.pending_send.push_front(buffer, frame.into());
continue;
}

tracing::trace!(len, "sending data frame");

// Update the flow control
Expand Down

0 comments on commit 73bea23

Please sign in to comment.