Restrain growth of sent_states queue

This commit is contained in:
Keith Winstein
2011-09-27 00:36:04 -04:00
parent 14111f861e
commit 271e6b8fc2
3 changed files with 27 additions and 4 deletions
+1 -1
View File
@@ -6,7 +6,7 @@
[DONE] Graceful exit / server shutdown
Don't let sent_states grow without bound for long-sleeping clients
[DONE] Don't let sent_states grow without bound for long-sleeping clients
Make roaming much smoother (with error message placement)
+25 -3
View File
@@ -121,11 +121,25 @@ void TransportSender<MyState>::send_empty_ack( void )
new_num = uint64_t( -1 );
}
// sent_states.push_back( TimestampedState<MyState>( sent_states.back().timestamp, new_num, current_state ) );
add_sent_state( sent_states.back().timestamp, new_num, current_state );
send_in_fragments( "", new_num );
sent_states.push_back( TimestampedState<MyState>( sent_states.back().timestamp, new_num, current_state ) );
next_ack_time = timestamp() + ACK_INTERVAL;
}
template <class MyState>
void TransportSender<MyState>::add_sent_state( uint64_t the_timestamp, uint64_t num, MyState &state )
{
sent_states.push_back( TimestampedState<MyState>( the_timestamp, num, state ) );
if ( sent_states.size() > 32 ) { /* limit on state queue */
auto last = sent_states.end();
last--;
last--;
sent_states.erase( last ); /* erase penultimate state */
}
}
template <class MyState>
void TransportSender<MyState>::send_to_receiver( string diff )
{
@@ -153,7 +167,8 @@ void TransportSender<MyState>::send_to_receiver( string diff )
if ( new_num == sent_states.back().num ) {
sent_states.back().timestamp = timestamp();
} else {
sent_states.push_back( TimestampedState<MyState>( timestamp(), new_num, current_state ) );
// sent_states.push_back( TimestampedState<MyState>( timestamp(), new_num, current_state ) );
add_sent_state( timestamp(), new_num, current_state );
}
try {
@@ -243,6 +258,13 @@ void TransportSender<MyState>::send_in_fragments( string diff, uint64_t new_num
template <class MyState>
void TransportSender<MyState>::process_acknowledgment_through( uint64_t ack_num )
{
/* Check if state being acknowledged is one we have culled */
assert( !sent_states.empty() );
if ( sent_states.back().num < ack_num ) {
return;
}
typename list< TimestampedState<MyState> >::iterator i = sent_states.begin();
while ( i != sent_states.end() ) {
typename list< TimestampedState<MyState> >::iterator inext = i;
@@ -253,6 +275,6 @@ void TransportSender<MyState>::process_acknowledgment_through( uint64_t ack_num
i = inext;
}
assert( sent_states.size() > 0 );
assert( !sent_states.empty() );
}
+1
View File
@@ -32,6 +32,7 @@ namespace Network {
void send_to_receiver( string diff );
void send_empty_ack( void );
void send_in_fragments( string diff, uint64_t new_num );
void add_sent_state( uint64_t the_timestamp, uint64_t num, MyState &state );
/* state of sender */
Connection *connection;