@@ -924,7 +924,7 @@ UDPPeer::UDPPeer(u16 a_id, Address a_address, Connection* connection) :
924
924
Peer (a_address,a_id,connection)
925
925
{
926
926
for (Channel &channel : channels)
927
- channel.setWindowSize (g_settings-> getU16 ( " max_packets_per_iteration " ) );
927
+ channel.setWindowSize (START_RELIABLE_WINDOW_SIZE );
928
928
}
929
929
930
930
bool UDPPeer::getAddress (MTProtocols type,Address& toset)
@@ -975,22 +975,29 @@ void UDPPeer::PutReliableSendCommand(ConnectionCommand &c,
975
975
if (m_pending_disconnect)
976
976
return ;
977
977
978
- if ( channels[c.channelnum ].queued_commands .empty () &&
978
+ Channel &chan = channels[c.channelnum ];
979
+
980
+ if (chan.queued_commands .empty () &&
979
981
/* don't queue more packets then window size */
980
- (channels[c.channelnum ].queued_reliables .size ()
981
- < (channels[c.channelnum ].getWindowSize ()/2 ))) {
982
+ (chan.queued_reliables .size () < chan.getWindowSize () / 2 )) {
982
983
LOG (dout_con<<m_connection->getDesc ()
983
984
<<" processing reliable command for peer id: " << c.peer_id
984
985
<<" data size: " << c.data .getSize () << std::endl);
985
986
if (!processReliableSendCommand (c,max_packet_size)) {
986
- channels[c. channelnum ] .queued_commands .push_back (c);
987
+ chan .queued_commands .push_back (c);
987
988
}
988
989
}
989
990
else {
990
991
LOG (dout_con<<m_connection->getDesc ()
991
992
<<" Queueing reliable command for peer id: " << c.peer_id
992
993
<<" data size: " << c.data .getSize () <<std::endl);
993
- channels[c.channelnum ].queued_commands .push_back (c);
994
+ chan.queued_commands .push_back (c);
995
+ if (chan.queued_commands .size () >= chan.getWindowSize () / 2 ) {
996
+ LOG (derr_con << m_connection->getDesc ()
997
+ << " Possible packet stall to peer id: " << c.peer_id
998
+ << " queued_commands=" << chan.queued_commands .size ()
999
+ << std::endl);
1000
+ }
994
1001
}
995
1002
}
996
1003
@@ -1001,20 +1008,22 @@ bool UDPPeer::processReliableSendCommand(
1001
1008
if (m_pending_disconnect)
1002
1009
return true ;
1003
1010
1011
+ Channel &chan = channels[c.channelnum ];
1012
+
1004
1013
u32 chunksize_max = max_packet_size
1005
1014
- BASE_HEADER_SIZE
1006
1015
- RELIABLE_HEADER_SIZE;
1007
1016
1008
1017
sanity_check (c.data .getSize () < MAX_RELIABLE_WINDOW_SIZE*512 );
1009
1018
1010
1019
std::list<SharedBuffer<u8>> originals;
1011
- u16 split_sequence_number = channels[c. channelnum ] .readNextSplitSeqNum ();
1020
+ u16 split_sequence_number = chan .readNextSplitSeqNum ();
1012
1021
1013
1022
if (c.raw ) {
1014
1023
originals.emplace_back (c.data );
1015
1024
} else {
1016
1025
makeAutoSplitPacket (c.data , chunksize_max,split_sequence_number, &originals);
1017
- channels[c. channelnum ] .setNextSplitSeqNum (split_sequence_number);
1026
+ chan .setNextSplitSeqNum (split_sequence_number);
1018
1027
}
1019
1028
1020
1029
bool have_sequence_number = true ;
@@ -1023,7 +1032,7 @@ bool UDPPeer::processReliableSendCommand(
1023
1032
volatile u16 initial_sequence_number = 0 ;
1024
1033
1025
1034
for (SharedBuffer<u8> &original : originals) {
1026
- u16 seqnum = channels[c. channelnum ] .getOutgoingSequenceNumber (have_sequence_number);
1035
+ u16 seqnum = chan .getOutgoingSequenceNumber (have_sequence_number);
1027
1036
1028
1037
/* oops, we don't have enough sequence numbers to send this packet */
1029
1038
if (!have_sequence_number)
@@ -1055,10 +1064,10 @@ bool UDPPeer::processReliableSendCommand(
1055
1064
// << " channel: " << (c.channelnum&0xFF)
1056
1065
// << " seqnum: " << readU16(&p.data[BASE_HEADER_SIZE+1])
1057
1066
// << std::endl)
1058
- channels[c. channelnum ] .queued_reliables .push (p);
1067
+ chan .queued_reliables .push (p);
1059
1068
pcount++;
1060
1069
}
1061
- sanity_check (channels[c. channelnum ] .queued_reliables .size () < 0xFFFF );
1070
+ sanity_check (chan .queued_reliables .size () < 0xFFFF );
1062
1071
return true ;
1063
1072
}
1064
1073
@@ -1073,15 +1082,15 @@ bool UDPPeer::processReliableSendCommand(
1073
1082
toadd.pop ();
1074
1083
1075
1084
bool successfully_put_back_sequence_number
1076
- = channels[c. channelnum ] .putBackSequenceNumber (
1085
+ = chan .putBackSequenceNumber (
1077
1086
(initial_sequence_number+toadd.size () % (SEQNUM_MAX+1 )));
1078
1087
1079
1088
FATAL_ERROR_IF (!successfully_put_back_sequence_number, " error" );
1080
1089
}
1081
1090
1082
1091
// DO NOT REMOVE n_queued! It avoids a deadlock of async locked
1083
1092
// 'log_message_mutex' and 'm_list_mutex'.
1084
- u32 n_queued = channels[c. channelnum ] .outgoing_reliables_sent .size ();
1093
+ u32 n_queued = chan .outgoing_reliables_sent .size ();
1085
1094
1086
1095
LOG (dout_con<<m_connection->getDesc ()
1087
1096
<< " Windowsize exceeded on reliable sending "
0 commit comments