Fix bug in prioritization (#63)
The stream buffered data counter was never decremented.
This commit is contained in:
		| @@ -54,6 +54,7 @@ pub use self::window_update::WindowUpdate; | ||||
| // Re-export some constants | ||||
| pub use self::settings::{ | ||||
|     DEFAULT_SETTINGS_HEADER_TABLE_SIZE, | ||||
|     DEFAULT_INITIAL_WINDOW_SIZE, | ||||
|     DEFAULT_MAX_FRAME_SIZE, | ||||
|     MAX_INITIAL_WINDOW_SIZE, | ||||
|     MAX_MAX_FRAME_SIZE, | ||||
|   | ||||
| @@ -12,6 +12,7 @@ pub struct Ping { | ||||
| } | ||||
|  | ||||
| impl Ping { | ||||
|     #[cfg(feature = "unstable")] | ||||
|     pub fn new() -> Ping { | ||||
|         Ping { | ||||
|             ack: false, | ||||
|   | ||||
| @@ -36,6 +36,9 @@ const ALL: u8 = ACK; | ||||
| /// The default value of SETTINGS_HEADER_TABLE_SIZE | ||||
| pub const DEFAULT_SETTINGS_HEADER_TABLE_SIZE: usize = 4_096; | ||||
|  | ||||
| /// The default value of SETTINGS_INITIAL_WINDOW_SIZE | ||||
| pub const DEFAULT_INITIAL_WINDOW_SIZE: u32 = 65_535; | ||||
|  | ||||
| /// The default value of MAX_FRAME_SIZE | ||||
| pub const DEFAULT_MAX_FRAME_SIZE: FrameSize = 16_384; | ||||
|  | ||||
|   | ||||
| @@ -2,6 +2,7 @@ use {client, frame, server, proto}; | ||||
| use frame::Reason; | ||||
| use codec::{SendError, RecvError}; | ||||
|  | ||||
| use frame::DEFAULT_INITIAL_WINDOW_SIZE; | ||||
| use proto::*; | ||||
|  | ||||
| use http::Request; | ||||
|   | ||||
| @@ -30,6 +30,4 @@ pub type PingPayload = [u8; 8]; | ||||
| pub type WindowSize = u32; | ||||
|  | ||||
| // Constants | ||||
| // TODO: Move these into `frame` | ||||
| pub const DEFAULT_INITIAL_WINDOW_SIZE: WindowSize = 65_535; | ||||
| pub const MAX_WINDOW_SIZE: WindowSize = (1 << 31) - 1; | ||||
|   | ||||
| @@ -281,6 +281,8 @@ impl<B, P> Prioritize<B, P> | ||||
|         // If data is buffered, then schedule the stream for execution | ||||
|         if stream.buffered_send_data > 0 { | ||||
|             debug_assert!(stream.send_flow.available() > 0); | ||||
|             debug_assert!(!stream.pending_send.is_empty()); | ||||
|  | ||||
|             self.pending_send.push(stream); | ||||
|         } | ||||
|     } | ||||
| @@ -382,6 +384,7 @@ impl<B, P> Prioritize<B, P> | ||||
|  | ||||
|         // If needed, schedule the sender | ||||
|         if stream.send_flow.available() > 0 { | ||||
|             debug_assert!(!stream.pending_send.is_empty()); | ||||
|             self.pending_send.push(stream); | ||||
|         } | ||||
|     } | ||||
| @@ -404,6 +407,7 @@ impl<B, P> Prioritize<B, P> | ||||
|             match self.pending_send.pop(store) { | ||||
|                 Some(mut stream) => { | ||||
|                     trace!("pop_frame; stream={:?}", stream.id); | ||||
|                     debug_assert!(!stream.pending_send.is_empty()); | ||||
|  | ||||
|                     let frame = match stream.pending_send.pop_front(&mut self.buffer).unwrap() { | ||||
|                         Frame::Data(mut frame) => { | ||||
| @@ -456,6 +460,10 @@ impl<B, P> Prioritize<B, P> | ||||
|                             trace!(" -- updating stream flow --"); | ||||
|                             stream.send_flow.send_data(len as WindowSize); | ||||
|  | ||||
|                             // Decrement the stream's buffered data counter | ||||
|                             debug_assert!(stream.buffered_send_data >= len as u32); | ||||
|                             stream.buffered_send_data -= len as u32; | ||||
|  | ||||
|                             // Assign the capacity back to the connection that | ||||
|                             // was just consumed from the stream in the previous | ||||
|                             // line. | ||||
|   | ||||
		Reference in New Issue
	
	Block a user