added if to not track ParticleErase packets

This commit is contained in:
wangyix 2014-05-27 18:02:49 -07:00
parent 7d238402ab
commit e89d33dc60
8 changed files with 86 additions and 11 deletions

View file

@ -365,4 +365,18 @@ void OctreeQueryNode::dumpOutOfView() {
void OctreeQueryNode::incrementSequenceNumber() {
_sequenceNumber++;
}
void OctreeQueryNode::updatePacketTimestamp() {
int numBytesPacketHeader = populatePacketHeader(reinterpret_cast<char*>(_octreePacket), _myPacketType);
_octreePacketAt = _octreePacket + numBytesPacketHeader;
_octreePacketAt += sizeof(OCTREE_PACKET_FLAGS);
_octreePacketAt += sizeof(OCTREE_PACKET_SEQUENCE);
// pack in timestamp
OCTREE_PACKET_SENT_TIME now = usecTimestampNow();
OCTREE_PACKET_SENT_TIME* timeAt = (OCTREE_PACKET_SENT_TIME*)_octreePacketAt;
*timeAt = now;
}

View file

@ -101,6 +101,8 @@ public:
bool isShuttingDown() const { return _isShuttingDown; }
void incrementSequenceNumber();
void updatePacketTimestamp();
private slots:
void sendThreadFinished();

View file

@ -142,12 +142,18 @@ int OctreeSendThread::handlePacketSend(OctreeQueryNode* nodeData, int& trueBytes
}
const unsigned char* messageData = nodeData->getPacket();
//unsigned char messageData[MAX_PACKET_SIZE];
//memcpy(messageData, nodeData->getPacket(), MAX_PACKET_SIZE); // DEBUG: make copy of message to send
int numBytesPacketHeader = numBytesForPacketHeader(reinterpret_cast<const char*>(messageData));
const unsigned char* dataAt = messageData + numBytesPacketHeader;
dataAt += sizeof(OCTREE_PACKET_FLAGS);
OCTREE_PACKET_SEQUENCE sequence = (*(OCTREE_PACKET_SEQUENCE*)dataAt);
dataAt += sizeof(OCTREE_PACKET_SEQUENCE);
OCTREE_PACKET_SENT_TIME timestamp = (*(OCTREE_PACKET_SENT_TIME*)dataAt);
dataAt += sizeof(OCTREE_PACKET_SENT_TIME);
// If we've got a stats message ready to send, then see if we can piggyback them together
if (nodeData->stats.isReadyToSend() && !nodeData->isShuttingDown()) {
@ -161,6 +167,7 @@ int OctreeSendThread::handlePacketSend(OctreeQueryNode* nodeData, int& trueBytes
// copy voxel message to back of stats message
memcpy(statsMessage + statsMessageLength, nodeData->getPacket(), nodeData->getPacketLength());
//memcpy(statsMessage + statsMessageLength, messageData, nodeData->getPacketLength());
statsMessageLength += nodeData->getPacketLength();
// since a stats message is only included on end of scene, don't consider any of these bytes "wasted", since
@ -203,6 +210,7 @@ int OctreeSendThread::handlePacketSend(OctreeQueryNode* nodeData, int& trueBytes
OctreeServer::didCallWriteDatagram(this);
NodeList::getInstance()->writeDatagram((char*) nodeData->getPacket(), nodeData->getPacketLength(), _node);
//NodeList::getInstance()->writeDatagram((char*)messageData, nodeData->getPacketLength(), _node);
packetSent = true;
@ -223,6 +231,7 @@ int OctreeSendThread::handlePacketSend(OctreeQueryNode* nodeData, int& trueBytes
// just send the voxel packet
OctreeServer::didCallWriteDatagram(this);
NodeList::getInstance()->writeDatagram((char*) nodeData->getPacket(), nodeData->getPacketLength(), _node);
//NodeList::getInstance()->writeDatagram((char*)messageData, nodeData->getPacketLength(), _node);
packetSent = true;
int thisWastedBytes = MAX_PACKET_SIZE - nodeData->getPacketLength();
@ -245,7 +254,6 @@ int OctreeSendThread::handlePacketSend(OctreeQueryNode* nodeData, int& trueBytes
nodeData->incrementSequenceNumber();
nodeData->resetOctreePacket();
}
return packetsSent;
}

View file

@ -3301,7 +3301,12 @@ void Application::trackIncomingVoxelPacket(const QByteArray& packet, const Share
_octreeSceneStatsLock.lockForWrite();
if (_octreeServerSceneStats.find(nodeUUID) != _octreeServerSceneStats.end()) {
OctreeSceneStats& stats = _octreeServerSceneStats[nodeUUID];
stats.trackIncomingOctreePacket(packet, wasStatsPacket, sendingNode->getClockSkewUsec());
if (stats.trackIncomingOctreePacket(packet, wasStatsPacket, sendingNode->getClockSkewUsec())) {
// DEBUG! unreasonable flight time
qDebug() << " sending node type: " << NodeType::getNodeTypeName(sendingNode->getType()) << "\n";
//qDebug() << "\t\t clock skew: " << sendingNode->getClockSkewUsec();
}
}
_octreeSceneStatsLock.unlock();
}

View file

@ -39,7 +39,7 @@ void VoxelPacketProcessor::processPacket(const SharedNodePointer& sendingNode, c
}
PacketType voxelPacketType = packetTypeForPacket(mutablePacket);
// note: PacketType_OCTREE_STATS can have PacketType_VOXEL_DATA
// immediately following them inside the same packet. So, we process the PacketType_OCTREE_STATS first
// then process any remaining bytes as if it was another packet
@ -81,6 +81,7 @@ void VoxelPacketProcessor::processPacket(const SharedNodePointer& sendingNode, c
if (Menu::getInstance()->isOptionChecked(MenuOption::Voxels)) {
if (voxelPacketType != PacketTypeParticleErase)
app->trackIncomingVoxelPacket(mutablePacket, sendingNode, wasStatsPacket);
if (sendingNode) {

View file

@ -268,6 +268,44 @@ qint64 LimitedNodeList::writeUnverifiedDatagram(const QByteArray& datagram, cons
qint64 LimitedNodeList::writeDatagram(const char* data, qint64 size, const SharedNodePointer& destinationNode,
const HifiSockAddr& overridenSockAddr) {
/*
QByteArray datagram(data, size);
qDebug() << "\t writeDatagram()...";
PacketType type = packetTypeForPacket(datagram);
if (type != PacketType::PacketTypeParticleErase) {
qDebug() << "\t\t type: " << (unsigned char)type;
qDebug() << "\t\t UUID: " << uuidFromPacketHeader(datagram);
qDebug() << "\t\t MD5: " << hashFromPacketHeader(datagram);
int numBytesPacketHeader = numBytesForPacketHeader(datagram);
const unsigned char* dataAt = reinterpret_cast<const unsigned char*>(datagram.data()) + numBytesPacketHeader;
unsigned char flags = (*(unsigned char*)(dataAt));
dataAt += sizeof(unsigned char);
qDebug() << "\t\t flags: " << QString::number(flags, 2);
uint16_t sequence = (*(uint16_t*)dataAt);
dataAt += sizeof(uint16_t);
qDebug() << "\t\t sequence: " << QString::number(sequence, 16);
quint64 sentAt = (*(quint64*)dataAt);
dataAt += sizeof(quint64);
qDebug() << "\t\t sent at: " << QString::number(sentAt, 16) << "\n";
}
else {
qDebug() << "size: " << size;
const char* dataAt = data;
for (int i = 0; i < size; i++) {
unsigned char byte = *((unsigned char*)dataAt);
dataAt += sizeof(unsigned char);
qDebug() << "\t\t " << QString::number(byte, 16);
}
}*/
return writeDatagram(QByteArray(data, size), destinationNode, overridenSockAddr);
}

View file

@ -839,7 +839,7 @@ const char* OctreeSceneStats::getItemValue(Item item) {
return _itemValueBuffer;
}
void OctreeSceneStats::trackIncomingOctreePacket(const QByteArray& packet,
bool OctreeSceneStats::trackIncomingOctreePacket(const QByteArray& packet,
bool wasStatsPacket, int nodeClockSkewUsec) {
const bool wantExtraDebugging = false;
@ -857,8 +857,8 @@ void OctreeSceneStats::trackIncomingOctreePacket(const QByteArray& packet,
//bool packetIsColored = oneAtBit(flags, PACKET_IS_COLOR_BIT);
//bool packetIsCompressed = oneAtBit(flags, PACKET_IS_COMPRESSED_BIT);
OCTREE_PACKET_SENT_TIME arrivedAt = usecTimestampNow();
int flightTime = arrivedAt - sentAt + nodeClockSkewUsec;
OCTREE_PACKET_SENT_TIME arrivedAt = usecTimestampNow(); // DEBUG!!!
qint64 flightTime = arrivedAt - sentAt + nodeClockSkewUsec;
if (wantExtraDebugging) {
qDebug() << "sentAt:" << sentAt << " usecs";
@ -866,13 +866,20 @@ void OctreeSceneStats::trackIncomingOctreePacket(const QByteArray& packet,
qDebug() << "nodeClockSkewUsec:" << nodeClockSkewUsec << " usecs";
qDebug() << "flightTime:" << flightTime << " usecs";
}
//qDebug() << "\t" << QString::number(sequence, 16) << "\t sentAt:" << QString::number(sentAt, 16) << " usecs";
// Guard against possible corrupted packets... with bad timestamps
const int MAX_RESONABLE_FLIGHT_TIME = 200 * USECS_PER_SECOND; // 200 seconds is more than enough time for a packet to arrive
const int MIN_RESONABLE_FLIGHT_TIME = 0;
if (flightTime > MAX_RESONABLE_FLIGHT_TIME || flightTime < MIN_RESONABLE_FLIGHT_TIME) {
qDebug() << "ignoring unreasonable packet... flightTime:" << flightTime;
return; // ignore any packets that are unreasonable
qDebug() << "\t sentAt:" << QString::number(sentAt, 16) << " usecs";
qDebug() << "\t arrivedAt:" << QString::number(arrivedAt, 16) << " usecs";
qDebug() << "\t nodeClockSkewUsec:" << nodeClockSkewUsec << " usecs";
qDebug() << "\t flightTime:" << flightTime << " usecs";
return true; // ignore any packets that are unreasonable
}
// determine our expected sequence number... handle rollover appropriately
@ -884,7 +891,7 @@ void OctreeSceneStats::trackIncomingOctreePacket(const QByteArray& packet,
int sequenceOffset = (sequence - expected);
if (sequenceOffset > MAX_RESONABLE_SEQUENCE_OFFSET || sequenceOffset < MIN_RESONABLE_SEQUENCE_OFFSET) {
qDebug() << "ignoring unreasonable packet... sequence:" << sequence << "_incomingLastSequence:" << _incomingLastSequence;
return; // ignore any packets that are unreasonable
return false; // ignore any packets that are unreasonable
}
// track packets here...
@ -985,6 +992,6 @@ void OctreeSceneStats::trackIncomingOctreePacket(const QByteArray& packet,
}
}
}
return false;
}

View file

@ -158,7 +158,7 @@ public:
quint64 getLastFullTotalBytes() const { return _lastFullTotalBytes; }
// Used in client implementations to track individual octree packets
void trackIncomingOctreePacket(const QByteArray& packet, bool wasStatsPacket, int nodeClockSkewUsec);
bool trackIncomingOctreePacket(const QByteArray& packet, bool wasStatsPacket, int nodeClockSkewUsec);
quint32 getIncomingPackets() const { return _incomingPacket; }
quint64 getIncomingBytes() const { return _incomingBytes; }