From 15bd0878c407ede95f724009adadc81deeb7b4fd Mon Sep 17 00:00:00 2001 From: wangyix Date: Thu, 12 Jun 2014 11:37:05 -0700 Subject: [PATCH] added code for AC to send nack packets; no locking yet --- .../octree/OctreeInboundPacketProcessor.cpp | 2 +- .../src/octree/OctreeInboundPacketProcessor.h | 2 + .../src/octree/OctreeSendThread.cpp | 70 +++++++++++++++++++ .../src/octree/OctreeSendThread.h | 2 + assignment-client/src/octree/OctreeServer.h | 2 + libraries/networking/src/PacketHeaders.h | 3 +- 6 files changed, 79 insertions(+), 2 deletions(-) diff --git a/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp b/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp index 52407f78d5..c1c564b58c 100644 --- a/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp +++ b/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp @@ -212,4 +212,4 @@ void SingleSenderStats::trackInboundPacket(unsigned short int incomingSequence, _totalLockWaitTime += lockWaitTime; _totalElementsInPacket += editsInPacket; _totalPackets++; -} \ No newline at end of file +} diff --git a/assignment-client/src/octree/OctreeInboundPacketProcessor.h b/assignment-client/src/octree/OctreeInboundPacketProcessor.h index 82471bcddf..3e3f5f2dcb 100644 --- a/assignment-client/src/octree/OctreeInboundPacketProcessor.h +++ b/assignment-client/src/octree/OctreeInboundPacketProcessor.h @@ -35,6 +35,7 @@ public: void trackInboundPacket(unsigned short int incomingSequence, quint64 transitTime, int editsInPacket, quint64 processTime, quint64 lockWaitTime); + const QSet& getMissingSequenceNumbers() const { return _missingSequenceNumbers; } quint64 _totalTransitTime; @@ -71,6 +72,7 @@ public: void resetStats(); NodeToSenderStatsMap& getSingleSenderStats() { return _singleSenderStats; } + const NodeToSenderStatsMap& getSingleSenderStats() const { return _singleSenderStats; } protected: virtual void processPacket(const SharedNodePointer& sendingNode, const QByteArray& packet); diff --git a/assignment-client/src/octree/OctreeSendThread.cpp b/assignment-client/src/octree/OctreeSendThread.cpp index cb149b1d96..6b1119fca1 100644 --- a/assignment-client/src/octree/OctreeSendThread.cpp +++ b/assignment-client/src/octree/OctreeSendThread.cpp @@ -85,6 +85,7 @@ bool OctreeSendThread::process() { if (nodeData && !nodeData->isShuttingDown()) { bool viewFrustumChanged = nodeData->updateCurrentViewFrustum(); packetDistributor(nodeData, viewFrustumChanged); + sendNack(nodeData); } } } @@ -111,6 +112,75 @@ bool OctreeSendThread::process() { return isStillRunning(); // keep running till they terminate us } + +int OctreeSendThread::sendNack(OctreeQueryNode* nodeData) { + + // if we're shutting down, then exit early + if (nodeData->isShuttingDown()) { + return 0; + } + + const OctreeInboundPacketProcessor* myServerPacketProcessor = _myServer->getInboundPacketProcessor(); + + // if there are packets from _node that are waiting to be processed, + // don't send a NACK since the missing packets may be among those waiting packets. + if (myServerPacketProcessor->hasPacketsToProcessFrom(_node)) { + return 0; + } + + // lock unlock required ????????? prolly: _singleSenderStats may have our node's entry deleted during this or something + // maybe just make a copy instead!! + + // lock + + const QSet missingSequenceNumbersFromNode = myServerPacketProcessor + ->getSingleSenderStats().at(_node->getUUID()).getMissingSequenceNumbers(); + + // check if there are any sequence numbers that need to be nacked + int numSequenceNumbersAvailable = missingSequenceNumbersFromNode.size(); + if (numSequenceNumbersAvailable == 0) { + //unlock + return 0; + } + + // construct nack packet + + char packet[MAX_PACKET_SIZE]; + + char* dataAt = packet; + int bytesRemaining = MAX_PACKET_SIZE; + + // pack header + int numBytesPacketHeader = populatePacketHeader(packet, PacketTypeOctreeEditNack); + dataAt += numBytesPacketHeader; + bytesRemaining -= numBytesPacketHeader; + int numSequenceNumbersRoomFor = (bytesRemaining - sizeof(uint16_t)) / sizeof(unsigned short int); + + // calculate and pack the number of sequence numbers + uint16_t numSequenceNumbers = std::min(numSequenceNumbersAvailable, numSequenceNumbersRoomFor); + uint16_t* numSequenceNumbersAt = (uint16_t*)dataAt; + *numSequenceNumbersAt = numSequenceNumbers; + dataAt += sizeof(uint16_t); + + // pack sequence numbers + QSet::const_iterator begin = missingSequenceNumbersFromNode.begin(), end = missingSequenceNumbersFromNode.end(); + for (QSet::const_iterator i = begin; i != end; i++) { + unsigned short int* sequenceNumberAt = (unsigned short int*)dataAt; + *sequenceNumberAt = *i; + dataAt += sizeof(unsigned short int); + } + + // send it + OctreeServer::didCallWriteDatagram(this); + NodeList::getInstance()->writeDatagram((char*)packet, dataAt - packet, _node); + + return 1; +} + + + + + quint64 OctreeSendThread::_usleepTime = 0; quint64 OctreeSendThread::_usleepCalls = 0; diff --git a/assignment-client/src/octree/OctreeSendThread.h b/assignment-client/src/octree/OctreeSendThread.h index d8eed27802..041b44577c 100644 --- a/assignment-client/src/octree/OctreeSendThread.h +++ b/assignment-client/src/octree/OctreeSendThread.h @@ -50,6 +50,8 @@ private: int handlePacketSend(OctreeQueryNode* nodeData, int& trueBytesSent, int& truePacketsSent); int packetDistributor(OctreeQueryNode* nodeData, bool viewFrustumChanged); + + int sendNack(OctreeQueryNode* nodeData); OctreePacketData _packetData; diff --git a/assignment-client/src/octree/OctreeServer.h b/assignment-client/src/octree/OctreeServer.h index 5595d139be..39536c0981 100644 --- a/assignment-client/src/octree/OctreeServer.h +++ b/assignment-client/src/octree/OctreeServer.h @@ -51,6 +51,8 @@ public: int getPacketsPerClientPerSecond() const { return getPacketsPerClientPerInterval() * INTERVALS_PER_SECOND; } int getPacketsTotalPerInterval() const { return _packetsTotalPerInterval; } int getPacketsTotalPerSecond() const { return getPacketsTotalPerInterval() * INTERVALS_PER_SECOND; } + + const OctreeInboundPacketProcessor* getInboundPacketProcessor() const { return _octreeInboundPacketProcessor; } static int getCurrentClientCount() { return _clientCount; } static void clientConnected() { _clientCount++; } diff --git a/libraries/networking/src/PacketHeaders.h b/libraries/networking/src/PacketHeaders.h index 8ac5333d10..d7c6bdead6 100644 --- a/libraries/networking/src/PacketHeaders.h +++ b/libraries/networking/src/PacketHeaders.h @@ -66,7 +66,8 @@ enum PacketType { PacketTypeModelAddOrEdit, PacketTypeModelErase, PacketTypeModelAddResponse, - PacketTypeOctreeDataNack + PacketTypeOctreeDataNack, + PacketTypeOctreeEditNack, }; typedef char PacketVersion;