MAINT-4708 better grouping of ack messages between viewer and server
parent
bab0cf6e9f
commit
797f221e67
|
|
@ -103,6 +103,7 @@ LLCircuitData::LLCircuitData(const LLHost &host, TPACKETID in_id,
|
|||
mPeakBPSOut(0.f),
|
||||
mPeriodTime(0.0),
|
||||
mExistenceTimer(),
|
||||
mAckCreationTime(0.f),
|
||||
mCurrentResendCount(0),
|
||||
mLastPacketGap(0),
|
||||
mHeartbeatInterval(circuit_heartbeat_interval),
|
||||
|
|
@ -1078,60 +1079,73 @@ BOOL LLCircuitData::collectRAck(TPACKETID packet_num)
|
|||
}
|
||||
|
||||
mAcks.push_back(packet_num);
|
||||
if (mAckCreationTime == 0)
|
||||
{
|
||||
mAckCreationTime = getAgeInSeconds();
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
// this method is called during the message system processAcks() to
|
||||
// send out any acks that did not get sent already.
|
||||
void LLCircuit::sendAcks()
|
||||
void LLCircuit::sendAcks(F32 collect_time)
|
||||
{
|
||||
collect_time = llclamp(collect_time, 0.f, LL_COLLECT_ACK_TIME_MAX);
|
||||
LLCircuitData* cd;
|
||||
circuit_data_map::iterator end = mSendAckMap.end();
|
||||
for(circuit_data_map::iterator it = mSendAckMap.begin(); it != end; ++it)
|
||||
circuit_data_map::iterator it = mSendAckMap.begin();
|
||||
while (it != mSendAckMap.end())
|
||||
{
|
||||
cd = (*it).second;
|
||||
|
||||
S32 count = (S32)cd->mAcks.size();
|
||||
if(count > 0)
|
||||
F32 age = cd->getAgeInSeconds() - cd->mAckCreationTime;
|
||||
if (age > collect_time || count == 0)
|
||||
{
|
||||
// send the packet acks
|
||||
S32 acks_this_packet = 0;
|
||||
for(S32 i = 0; i < count; ++i)
|
||||
if (count>0)
|
||||
{
|
||||
if(acks_this_packet == 0)
|
||||
// send the packet acks
|
||||
S32 acks_this_packet = 0;
|
||||
for(S32 i = 0; i < count; ++i)
|
||||
{
|
||||
gMessageSystem->newMessageFast(_PREHASH_PacketAck);
|
||||
if(acks_this_packet == 0)
|
||||
{
|
||||
gMessageSystem->newMessageFast(_PREHASH_PacketAck);
|
||||
}
|
||||
gMessageSystem->nextBlockFast(_PREHASH_Packets);
|
||||
gMessageSystem->addU32Fast(_PREHASH_ID, cd->mAcks[i]);
|
||||
++acks_this_packet;
|
||||
if(acks_this_packet > 250)
|
||||
{
|
||||
gMessageSystem->sendMessage(cd->mHost);
|
||||
acks_this_packet = 0;
|
||||
}
|
||||
}
|
||||
gMessageSystem->nextBlockFast(_PREHASH_Packets);
|
||||
gMessageSystem->addU32Fast(_PREHASH_ID, cd->mAcks[i]);
|
||||
++acks_this_packet;
|
||||
if(acks_this_packet > 250)
|
||||
if(acks_this_packet > 0)
|
||||
{
|
||||
gMessageSystem->sendMessage(cd->mHost);
|
||||
acks_this_packet = 0;
|
||||
}
|
||||
}
|
||||
if(acks_this_packet > 0)
|
||||
{
|
||||
gMessageSystem->sendMessage(cd->mHost);
|
||||
}
|
||||
|
||||
if(gMessageSystem->mVerboseLog)
|
||||
{
|
||||
std::ostringstream str;
|
||||
str << "MSG: -> " << cd->mHost << "\tPACKET ACKS:\t";
|
||||
std::ostream_iterator<TPACKETID> append(str, " ");
|
||||
std::copy(cd->mAcks.begin(), cd->mAcks.end(), append);
|
||||
LL_INFOS() << str.str() << LL_ENDL;
|
||||
}
|
||||
if(gMessageSystem->mVerboseLog)
|
||||
{
|
||||
std::ostringstream str;
|
||||
str << "MSG: -> " << cd->mHost << "\tPACKET ACKS:\t";
|
||||
std::ostream_iterator<TPACKETID> append(str, " ");
|
||||
std::copy(cd->mAcks.begin(), cd->mAcks.end(), append);
|
||||
LL_INFOS() << str.str() << LL_ENDL;
|
||||
}
|
||||
|
||||
// empty out the acks list
|
||||
cd->mAcks.clear();
|
||||
// empty out the acks list
|
||||
cd->mAcks.clear();
|
||||
cd->mAckCreationTime = 0.f;
|
||||
}
|
||||
// remove data map
|
||||
it = mSendAckMap.erase(it);
|
||||
}
|
||||
else
|
||||
{
|
||||
//continue collecting acks for this map
|
||||
++it;
|
||||
}
|
||||
}
|
||||
|
||||
// All acks have been sent, clear the map
|
||||
mSendAckMap.clear();
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -60,6 +60,7 @@ const U8 LL_PACKET_ID_SIZE = 6;
|
|||
|
||||
const S32 LL_MAX_RESENT_PACKETS_PER_FRAME = 100;
|
||||
const S32 LL_MAX_ACKED_PACKETS_PER_FRAME = 200;
|
||||
const F32 LL_COLLECT_ACK_TIME_MAX = 2.f;
|
||||
|
||||
//
|
||||
// Prototypes and Predefines
|
||||
|
|
@ -237,6 +238,7 @@ protected:
|
|||
packet_time_map mPotentialLostPackets;
|
||||
packet_time_map mRecentlyReceivedReliablePackets;
|
||||
std::vector<TPACKETID> mAcks;
|
||||
F32 mAckCreationTime; // first ack creation time
|
||||
|
||||
typedef std::map<TPACKETID, LLReliablePacket *> reliable_map;
|
||||
typedef reliable_map::iterator reliable_iter;
|
||||
|
|
@ -302,7 +304,7 @@ public:
|
|||
|
||||
// this method is called during the message system processAcks()
|
||||
// to send out any acks that did not get sent already.
|
||||
void sendAcks();
|
||||
void sendAcks(F32 collect_time);
|
||||
|
||||
friend std::ostream& operator<<(std::ostream& s, LLCircuit &circuit);
|
||||
void getInfo(LLSD& info) const;
|
||||
|
|
@ -333,6 +335,7 @@ protected:
|
|||
circuit_data_map mCircuitData;
|
||||
|
||||
typedef std::set<LLCircuitData *, LLCircuitData::less> ping_set_t; // Circuits sorted by next ping time
|
||||
|
||||
ping_set_t mPingSet;
|
||||
|
||||
// This variable points to the last circuit data we found to
|
||||
|
|
|
|||
|
|
@ -787,7 +787,7 @@ S32 LLMessageSystem::getReceiveBytes() const
|
|||
}
|
||||
|
||||
|
||||
void LLMessageSystem::processAcks()
|
||||
void LLMessageSystem::processAcks(F32 collect_time)
|
||||
{
|
||||
F64Seconds mt_sec = getMessageTimeSeconds();
|
||||
{
|
||||
|
|
@ -813,7 +813,7 @@ void LLMessageSystem::processAcks()
|
|||
mCircuitInfo.resendUnackedPackets(mUnackedListDepth, mUnackedListSize);
|
||||
|
||||
//cycle through ack list for each host we need to send acks to
|
||||
mCircuitInfo.sendAcks();
|
||||
mCircuitInfo.sendAcks(collect_time);
|
||||
|
||||
if (!mDenyTrustedCircuitSet.empty())
|
||||
{
|
||||
|
|
|
|||
|
|
@ -331,7 +331,7 @@ public:
|
|||
|
||||
BOOL poll(F32 seconds); // Number of seconds that we want to block waiting for data, returns if data was received
|
||||
BOOL checkMessages( S64 frame_count = 0 );
|
||||
void processAcks();
|
||||
void processAcks(F32 collect_time = 0.f);
|
||||
|
||||
BOOL isMessageFast(const char *msg);
|
||||
BOOL isMessage(const char *msg)
|
||||
|
|
|
|||
|
|
@ -49,6 +49,17 @@
|
|||
<key>Value</key>
|
||||
<real>300</real>
|
||||
</map>
|
||||
<key>AckCollectTime</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>Ack messages collection and grouping time</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>F32</string>
|
||||
<key>Value</key>
|
||||
<real>0.1</real>
|
||||
</map>
|
||||
<key>AdminMenu</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
|
|
|
|||
|
|
@ -5378,7 +5378,7 @@ void LLAppViewer::idleNetwork()
|
|||
}
|
||||
|
||||
// Handle per-frame message system processing.
|
||||
gMessageSystem->processAcks();
|
||||
gMessageSystem->processAcks(gSavedSettings.getF32("AckCollectTime"));
|
||||
|
||||
#ifdef TIME_THROTTLE_MESSAGES
|
||||
if (total_time >= CheckMessagesMaxTime)
|
||||
|
|
|
|||
Loading…
Reference in New Issue