diff options
| author | andreykproductengine <akleshchev@productengine.com> | 2014-12-18 20:05:36 +0200 | 
|---|---|---|
| committer | andreykproductengine <akleshchev@productengine.com> | 2014-12-18 20:05:36 +0200 | 
| commit | 797f221e6715f5b2423cd68e970b1f2ec2af7015 (patch) | |
| tree | 8166ea192f1eb7aca7a7539d5b2f2b69cfa830b1 /indra/llmessage | |
| parent | bab0cf6e9f7f8f30f325b48f550d0c7eedaee112 (diff) | |
MAINT-4708 better grouping of ack messages between viewer and server
Diffstat (limited to 'indra/llmessage')
| -rwxr-xr-x | indra/llmessage/llcircuit.cpp | 80 | ||||
| -rwxr-xr-x | indra/llmessage/llcircuit.h | 5 | ||||
| -rwxr-xr-x | indra/llmessage/message.cpp | 4 | ||||
| -rwxr-xr-x | indra/llmessage/message.h | 2 | 
4 files changed, 54 insertions, 37 deletions
| diff --git a/indra/llmessage/llcircuit.cpp b/indra/llmessage/llcircuit.cpp index 5aaada63b1..9538c4c6db 100755 --- a/indra/llmessage/llcircuit.cpp +++ b/indra/llmessage/llcircuit.cpp @@ -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();  } diff --git a/indra/llmessage/llcircuit.h b/indra/llmessage/llcircuit.h index 5b109fc218..b8021bc9f0 100755 --- a/indra/llmessage/llcircuit.h +++ b/indra/llmessage/llcircuit.h @@ -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 diff --git a/indra/llmessage/message.cpp b/indra/llmessage/message.cpp index cc2d5d66ad..3d81bf31d5 100755 --- a/indra/llmessage/message.cpp +++ b/indra/llmessage/message.cpp @@ -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())  		{ diff --git a/indra/llmessage/message.h b/indra/llmessage/message.h index da06b64506..348b09b992 100755 --- a/indra/llmessage/message.h +++ b/indra/llmessage/message.h @@ -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) | 
