packet recovery seems to be working

Seems to impact FPS a lot.  OctreeSceneStats is not being locked (causes
freezing, need to find out why).
This commit is contained in:
wangyix 2014-06-06 17:44:30 -07:00
parent d21a8e73ff
commit b39559d860
7 changed files with 37 additions and 33 deletions

View file

@ -377,11 +377,6 @@ void OctreeQueryNode::packetSent(const QByteArray& packet) {
_sequenceNumber++; _sequenceNumber++;
} }
void OctreeQueryNode::addSequenceNumbersToResend(const QList<OCTREE_PACKET_SEQUENCE>& sequenceNumbers) {
_nackedSequenceNumbers.append(sequenceNumbers);
}
bool OctreeQueryNode::hasNextNackedPacket() const { bool OctreeQueryNode::hasNextNackedPacket() const {
return !_nackedSequenceNumbers.isEmpty(); return !_nackedSequenceNumbers.isEmpty();
} }

View file

@ -109,7 +109,9 @@ public:
OCTREE_PACKET_SEQUENCE getSequenceNumber() const { return _sequenceNumber; } OCTREE_PACKET_SEQUENCE getSequenceNumber() const { return _sequenceNumber; }
void addSequenceNumbersToResend(const QList<OCTREE_PACKET_SEQUENCE>& sequenceNumbers); void addNackedSequenceNumber(OCTREE_PACKET_SEQUENCE sequenceNumber) {
_nackedSequenceNumbers.append(sequenceNumber);
}
bool hasNextNackedPacket() const; bool hasNextNackedPacket() const;
const QByteArray* getNextNackedPacket(); const QByteArray* getNextNackedPacket();

View file

@ -305,7 +305,8 @@ int OctreeSendThread::resendNackedPackets(OctreeQueryNode* nodeData) {
_totalWastedBytes += MAX_PACKET_SIZE - packet->size(); // ??? _totalWastedBytes += MAX_PACKET_SIZE - packet->size(); // ???
} }
} }
if (packetsSent > 0)
printf("\t\t re-sent %d packets!\n", packetsSent); printf("\t\t re-sent %d packets!\n", packetsSent);
return packetsSent; return packetsSent;
} }

View file

@ -832,10 +832,9 @@ void OctreeServer::readPendingDatagrams() {
PacketType packetType = packetTypeForPacket(receivedPacket); PacketType packetType = packetTypeForPacket(receivedPacket);
SharedNodePointer matchingNode = nodeList->sendingNodeForPacket(receivedPacket); SharedNodePointer matchingNode = nodeList->sendingNodeForPacket(receivedPacket);
if (packetType == getMyQueryMessageType()) { if (packetType == getMyQueryMessageType()) {
// If we got a query packet, then we're talking to an agent, and we // If we got a query packet, then we're talking to an agent, and we
// need to make sure we have it in our nodeList. // need to make sure we have it in our nodeList.
if (matchingNode) { if (matchingNode) {
nodeList->updateNodeWithDataFromPacket(matchingNode, receivedPacket); nodeList->updateNodeWithDataFromPacket(matchingNode, receivedPacket);
OctreeQueryNode* nodeData = (OctreeQueryNode*)matchingNode->getLinkedData(); OctreeQueryNode* nodeData = (OctreeQueryNode*)matchingNode->getLinkedData();
if (nodeData && !nodeData->isOctreeSendThreadInitalized()) { if (nodeData && !nodeData->isOctreeSendThreadInitalized()) {
@ -852,25 +851,29 @@ void OctreeServer::readPendingDatagrams() {
} else if (packetType == PacketTypeOctreeDataNack) { } else if (packetType == PacketTypeOctreeDataNack) {
// parse packet for sequence numbers that need to be resent // parse packet for sequence numbers that need to be resent
int numBytesPacketHeader = numBytesForPacketHeader(receivedPacket);
const unsigned char* dataAt = reinterpret_cast<const unsigned char*>(receivedPacket.data()) + numBytesPacketHeader;
uint16_t numSequenceNumbers = (*(uint16_t*)dataAt); if (matchingNode) {
dataAt += sizeof(uint16_t);
// read sequence numbers OctreeQueryNode* nodeData = (OctreeQueryNode*)matchingNode->getLinkedData();
QList<OCTREE_PACKET_SEQUENCE> sequenceNumbers;
for (int i = 0; i < numSequenceNumbers; i++) {
OCTREE_PACKET_SEQUENCE sequenceNumber = (*(OCTREE_PACKET_SEQUENCE*)dataAt);
sequenceNumbers.append(sequenceNumber);
dataAt += sizeof(OCTREE_PACKET_SEQUENCE);
printf("\t\t\t nacked packet: seq = %d\n", sequenceNumber); int numBytesPacketHeader = numBytesForPacketHeader(receivedPacket);
const unsigned char* dataAt = reinterpret_cast<const unsigned char*>(receivedPacket.data()) + numBytesPacketHeader;
uint16_t numSequenceNumbers = (*(uint16_t*)dataAt);
dataAt += sizeof(uint16_t);
printf("\t received nack packet containing %d seq nums\n", numSequenceNumbers);
// read sequence numbers
for (int i = 0; i < numSequenceNumbers; i++) {
OCTREE_PACKET_SEQUENCE sequenceNumber = (*(OCTREE_PACKET_SEQUENCE*)dataAt);
nodeData->addNackedSequenceNumber(sequenceNumber);
dataAt += sizeof(OCTREE_PACKET_SEQUENCE);
printf("\t seq = %d\n", sequenceNumber);
}
} }
OctreeQueryNode* nodeData = (OctreeQueryNode*)matchingNode->getLinkedData(); // move this or something
nodeData->addSequenceNumbersToResend(sequenceNumbers);
} else if (packetType == PacketTypeJurisdictionRequest) { } else if (packetType == PacketTypeJurisdictionRequest) {

View file

@ -2110,8 +2110,6 @@ void Application::updateMyAvatar(float deltaTime) {
void Application::sendNack() { void Application::sendNack() {
printf("\n\t sendNack()...\n");
char packet[MAX_PACKET_SIZE]; char packet[MAX_PACKET_SIZE];
NodeList* nodeList = NodeList::getInstance(); NodeList* nodeList = NodeList::getInstance();
@ -2124,15 +2122,18 @@ printf("\n\t sendNack()...\n");
|| node->getType() == NodeType::ModelServer) || node->getType() == NodeType::ModelServer)
) { ) {
_octreeSceneStatsLock.lockForWrite(); //_octreeSceneStatsLock.lockForWrite();
OctreeSceneStats& stats = _octreeServerSceneStats[node->getUUID()]; OctreeSceneStats& stats = _octreeServerSceneStats[node->getUUID()];
int numSequenceNumbersAvailable = stats.getNumSequenceNumbersToNack();
if (numSequenceNumbersAvailable == 0)
continue;
char* dataAt = packet; char* dataAt = packet;
int bytesRemaining = MAX_PACKET_SIZE; int bytesRemaining = MAX_PACKET_SIZE;
// pack header // pack header
int numBytesPacketHeader = populatePacketHeader(packet, PacketTypeOctreeDataNack, node->getUUID()); int numBytesPacketHeader = populatePacketHeader(packet, PacketTypeOctreeDataNack);
dataAt += numBytesPacketHeader; dataAt += numBytesPacketHeader;
bytesRemaining -= numBytesPacketHeader; bytesRemaining -= numBytesPacketHeader;
@ -2140,12 +2141,13 @@ printf("\n\t sendNack()...\n");
// calculate and pack number of sequence numbers // calculate and pack number of sequence numbers
uint16_t numSequenceNumbers = min(stats.getNumSequenceNumbersToNack(), numPacketsRoomFor); uint16_t numSequenceNumbers = min(numSequenceNumbersAvailable, numPacketsRoomFor);
uint16_t* numSequenceNumbersAt = (uint16_t*)dataAt; uint16_t* numSequenceNumbersAt = (uint16_t*)dataAt;
*numSequenceNumbersAt = numSequenceNumbers; *numSequenceNumbersAt = numSequenceNumbers;
dataAt += sizeof(uint16_t); dataAt += sizeof(uint16_t);
// pack sequence numbers // pack sequence numbers
printf("\n\t sending nack...\n");
printf("\t\t packed %d seq #s:", numSequenceNumbers); printf("\t\t packed %d seq #s:", numSequenceNumbers);
for (int i = 0; i < numSequenceNumbers; i++) { for (int i = 0; i < numSequenceNumbers; i++) {
OCTREE_PACKET_SEQUENCE* sequenceNumberAt = (OCTREE_PACKET_SEQUENCE*)dataAt; OCTREE_PACKET_SEQUENCE* sequenceNumberAt = (OCTREE_PACKET_SEQUENCE*)dataAt;
@ -2155,10 +2157,10 @@ printf(" %d,", *sequenceNumberAt);
} }
printf("\n"); printf("\n");
_octreeSceneStatsLock.unlock(); //_octreeSceneStatsLock.unlock();
// make sure we still have an active socket???? // make sure we still have an active socket????
nodeList->writeUnverifiedDatagram(packet, dataAt - packet, node); nodeList->writeUnverifiedDatagram(packet, dataAt-packet, node);
} }
} }
} }

View file

@ -274,13 +274,13 @@ qint64 LimitedNodeList::writeDatagram(const char* data, qint64 size, const Share
qint64 LimitedNodeList::writeDatagram2(int seq, const char* data, qint64 size, const SharedNodePointer& destinationNode, qint64 LimitedNodeList::writeDatagram2(int seq, const char* data, qint64 size, const SharedNodePointer& destinationNode,
const HifiSockAddr& overridenSockAddr) { const HifiSockAddr& overridenSockAddr) {
qint64 ret; qint64 ret = -1;
if (randFloat() < 0.8f) { if (randFloat() < 0.8f) {
ret = writeDatagram(QByteArray(data, size), destinationNode, overridenSockAddr); ret = writeDatagram(QByteArray(data, size), destinationNode, overridenSockAddr);
} }
else { else {
printf("\t\t\t dropped packet seq = %d!!!\n", seq); printf("dropped packet seq = %d --------------------------\n", seq);
} }

View file

@ -75,7 +75,8 @@ const QSet<PacketType> NON_VERIFIED_PACKETS = QSet<PacketType>()
<< PacketTypeDomainServerRequireDTLS << PacketTypeDomainConnectRequest << PacketTypeDomainServerRequireDTLS << PacketTypeDomainConnectRequest
<< PacketTypeDomainList << PacketTypeDomainListRequest << PacketTypeDomainOAuthRequest << PacketTypeDomainList << PacketTypeDomainListRequest << PacketTypeDomainOAuthRequest
<< PacketTypeCreateAssignment << PacketTypeRequestAssignment << PacketTypeStunResponse << PacketTypeCreateAssignment << PacketTypeRequestAssignment << PacketTypeStunResponse
<< PacketTypeNodeJsonStats << PacketTypeVoxelQuery << PacketTypeParticleQuery << PacketTypeModelQuery; << PacketTypeNodeJsonStats << PacketTypeVoxelQuery << PacketTypeParticleQuery << PacketTypeModelQuery
<< PacketTypeOctreeDataNack;
const int NUM_BYTES_MD5_HASH = 16; const int NUM_BYTES_MD5_HASH = 16;
const int NUM_STATIC_HEADER_BYTES = sizeof(PacketVersion) + NUM_BYTES_RFC4122_UUID; const int NUM_STATIC_HEADER_BYTES = sizeof(PacketVersion) + NUM_BYTES_RFC4122_UUID;