fix for infinite loop in OctreeeInboundPacketProcessor

This commit is contained in:
Stephen Birarda 2015-12-01 10:40:43 -08:00
parent 7dbf29821a
commit 27227181f0
3 changed files with 10 additions and 5 deletions

View file

@ -43,6 +43,7 @@ void OctreeInboundPacketProcessor::resetStats() {
_totalPackets = 0; _totalPackets = 0;
_lastNackTime = usecTimestampNow(); _lastNackTime = usecTimestampNow();
QWriteLocker locker(&_senderStatsLock);
_singleSenderStats.clear(); _singleSenderStats.clear();
} }
@ -220,6 +221,8 @@ void OctreeInboundPacketProcessor::trackInboundPacket(const QUuid& nodeUUID, uns
_totalElementsInPacket += editsInPacket; _totalElementsInPacket += editsInPacket;
_totalPackets++; _totalPackets++;
QWriteLocker locker(&_senderStatsLock);
// find the individual senders stats and track them there too... // find the individual senders stats and track them there too...
// see if this is the first we've heard of this node... // see if this is the first we've heard of this node...
if (_singleSenderStats.find(nodeUUID) == _singleSenderStats.end()) { if (_singleSenderStats.find(nodeUUID) == _singleSenderStats.end()) {
@ -242,6 +245,8 @@ int OctreeInboundPacketProcessor::sendNackPackets() {
int packetsSent = 0; int packetsSent = 0;
int totalBytesSent = 0; int totalBytesSent = 0;
QWriteLocker locker(&_senderStatsLock);
NodeToSenderStatsMapIterator i = _singleSenderStats.begin(); NodeToSenderStatsMapIterator i = _singleSenderStats.begin();
while (i != _singleSenderStats.end()) { while (i != _singleSenderStats.end()) {
@ -262,10 +267,9 @@ int OctreeInboundPacketProcessor::sendNackPackets() {
} }
const SharedNodePointer& destinationNode = DependencyManager::get<NodeList>()->nodeWithUUID(nodeUUID); const SharedNodePointer& destinationNode = DependencyManager::get<NodeList>()->nodeWithUUID(nodeUUID);
// If the node no longer exists, wait until the ReceivedPacketProcessor has cleaned up the node // if the node no longer exists, remove its stats
// to remove it from our stats list.
// FIXME Is it safe to clean it up here before ReceivedPacketProcess has?
if (!destinationNode) { if (!destinationNode) {
i = _singleSenderStats.erase(i);
continue; continue;
} }

View file

@ -72,7 +72,7 @@ public:
void resetStats(); void resetStats();
NodeToSenderStatsMap& getSingleSenderStats() { return _singleSenderStats; } NodeToSenderStatsMap getSingleSenderStats() { QReadLocker locker(&_senderStatsLock); return _singleSenderStats; }
virtual void terminating() { _shuttingDown = true; ReceivedPacketProcessor::terminating(); } virtual void terminating() { _shuttingDown = true; ReceivedPacketProcessor::terminating(); }
@ -101,6 +101,7 @@ private:
quint64 _totalPackets; quint64 _totalPackets;
NodeToSenderStatsMap _singleSenderStats; NodeToSenderStatsMap _singleSenderStats;
QReadWriteLock _senderStatsLock;
quint64 _lastNackTime; quint64 _lastNackTime;
bool _shuttingDown; bool _shuttingDown;

View file

@ -711,7 +711,7 @@ bool OctreeServer::handleHTTPRequest(HTTPConnection* connection, const QUrl& url
int senderNumber = 0; int senderNumber = 0;
NodeToSenderStatsMap& allSenderStats = _octreeInboundPacketProcessor->getSingleSenderStats(); NodeToSenderStatsMap allSenderStats = _octreeInboundPacketProcessor->getSingleSenderStats();
for (NodeToSenderStatsMapConstIterator i = allSenderStats.begin(); i != allSenderStats.end(); i++) { for (NodeToSenderStatsMapConstIterator i = allSenderStats.begin(); i != allSenderStats.end(); i++) {
senderNumber++; senderNumber++;
QUuid senderID = i.key(); QUuid senderID = i.key();