Improve lossy connections by sending diff from "known" state if it's easy
This commit is contained in:
@@ -117,8 +117,8 @@ void Transport<MyState, RemoteState>::recv( void )
|
||||
}
|
||||
}
|
||||
if ( verbose ) {
|
||||
fprintf( stderr, "[%u] Received state %d [ack %d]\n",
|
||||
(unsigned int)(timestamp() % 100000), (int)new_state.num, (int)inst.ack_num() );
|
||||
fprintf( stderr, "[%u] Received state %d [coming from %d, ack %d]\n",
|
||||
(unsigned int)(timestamp() % 100000), (int)new_state.num, (int)inst.old_num(), (int)inst.ack_num() );
|
||||
}
|
||||
received_states.push_back( new_state );
|
||||
sender.set_ack_num( received_states.back().num );
|
||||
|
||||
@@ -150,6 +150,8 @@ void TransportSender<MyState>::tick( void )
|
||||
|
||||
string diff = current_state.diff_from( assumed_receiver_state->state );
|
||||
|
||||
attempt_prospective_resend_optimization( diff );
|
||||
|
||||
/* verify diff has round-trip identity (modulo Unicode fallback rendering) */
|
||||
/*
|
||||
MyState newstate( assumed_receiver_state->state );
|
||||
@@ -349,3 +351,26 @@ void TransportSender<MyState>::set_ack_num( uint64_t s_ack_num )
|
||||
{
|
||||
ack_num = s_ack_num;
|
||||
}
|
||||
|
||||
/* Investigate diff against known receiver state instead */
|
||||
/* Mutates proposed_diff */
|
||||
template <class MyState>
|
||||
void TransportSender<MyState>::attempt_prospective_resend_optimization( string &proposed_diff )
|
||||
{
|
||||
if ( assumed_receiver_state == sent_states.begin() ) {
|
||||
return;
|
||||
}
|
||||
|
||||
string resend_diff = current_state.diff_from( sent_states.front().state );
|
||||
|
||||
/* We do a prophylactic resend if it would make the diff shorter,
|
||||
or if it would lengthen it by no more than 100 bytes and still be
|
||||
less than 1000 bytes. */
|
||||
|
||||
if ( (resend_diff.size() <= proposed_diff.size())
|
||||
|| ( (resend_diff.size() < 1000)
|
||||
&& (resend_diff.size() - proposed_diff.size() < 100) ) ) {
|
||||
assumed_receiver_state = sent_states.begin();
|
||||
proposed_diff = resend_diff;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -48,6 +48,7 @@ namespace Network {
|
||||
|
||||
/* helper methods for tick() */
|
||||
void update_assumed_receiver_state( void );
|
||||
void attempt_prospective_resend_optimization( string &proposed_diff );
|
||||
void rationalize_states( void );
|
||||
void send_to_receiver( string diff );
|
||||
void send_empty_ack( void );
|
||||
|
||||
Reference in New Issue
Block a user