diff --git a/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp b/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp index bd3a7ceee5..b9bde8d544 100644 --- a/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp +++ b/assignment-client/src/octree/OctreeInboundPacketProcessor.cpp @@ -98,15 +98,28 @@ void OctreeInboundPacketProcessor::processPacket(const SharedNodePointer& sendin unsigned short int sequence = (*((unsigned short int*)(packetData + numBytesPacketHeader))); quint64 sentAt = (*((quint64*)(packetData + numBytesPacketHeader + sizeof(sequence)))); quint64 arrivedAt = usecTimestampNow(); + if (sentAt > arrivedAt) { + if (debugProcessPacket || _myServer->wantsDebugReceiving()) { + qDebug() << "unreasonable sentAt=" << sentAt << " usecs"; + qDebug() << "setting sentAt to arrivedAt=" << arrivedAt << " usecs"; + } + sentAt = arrivedAt; + } quint64 transitTime = arrivedAt - sentAt; int editsInPacket = 0; quint64 processTime = 0; quint64 lockWaitTime = 0; if (debugProcessPacket || _myServer->wantsDebugReceiving()) { - qDebug() << "PROCESSING THREAD: got '" << packetType << "' packet - " << _receivedPacketCount - << " command from client receivedBytes=" << packet.size() - << " sequence=" << sequence << " transitTime=" << transitTime << " usecs"; + qDebug() << "PROCESSING THREAD: got '" << packetType << "' packet - " << _receivedPacketCount << " command from client"; + qDebug() << " receivedBytes=" << packet.size(); + qDebug() << " sequence=" << sequence; + qDebug() << " sentAt=" << sentAt << " usecs"; + qDebug() << " arrivedAt=" << arrivedAt << " usecs"; + qDebug() << " transitTime=" << transitTime << " usecs"; + qDebug() << " sendingNode->getClockSkewUsec()=" << sendingNode->getClockSkewUsec() << " usecs"; + + } if (debugProcessPacket) { diff --git a/domain-server/resources/describe-settings.json b/domain-server/resources/describe-settings.json index 602a9b4a1e..0a93136507 100644 --- a/domain-server/resources/describe-settings.json +++ b/domain-server/resources/describe-settings.json @@ -284,6 +284,27 @@ "default": "", "advanced": true }, + { + "name": "verboseDebug", + "type": "checkbox", + "help": "lots of debugging", + "default": false, + "advanced": true + }, + { + "name": "debugReceiving", + "type": "checkbox", + "help": "extra debugging on receiving", + "default": false, + "advanced": true + }, + { + "name": "debugSending", + "type": "checkbox", + "help": "extra debugging on sending", + "default": false, + "advanced": true + }, { "name": "clockSkew", "label": "Clock Skew", diff --git a/libraries/octree/src/OctreeEditPacketSender.cpp b/libraries/octree/src/OctreeEditPacketSender.cpp index 65308f906f..df52e85c5e 100644 --- a/libraries/octree/src/OctreeEditPacketSender.cpp +++ b/libraries/octree/src/OctreeEditPacketSender.cpp @@ -246,9 +246,7 @@ void OctreeEditPacketSender::queueOctreeEditMessage(PacketType type, unsigned ch // But we can't really do that with a packed message, since each edit message could be destined // for a different server... So we need to actually manage multiple queued packets... one // for each server - _packetsQueueLock.lock(); - foreach (const SharedNodePointer& node, NodeList::getInstance()->getNodeHash()) { // only send to the NodeTypes that are getMyNodeType() if (node->getActiveSocket() && node->getType() == getMyNodeType()) { @@ -277,12 +275,12 @@ void OctreeEditPacketSender::queueOctreeEditMessage(PacketType type, unsigned ch if ((type != packetBuffer._currentType && packetBuffer._currentSize > 0) || (packetBuffer._currentSize + length >= (size_t)_maxPacketSize)) { releaseQueuedPacket(packetBuffer); - initializePacket(packetBuffer, type); + initializePacket(packetBuffer, type, node->getClockSkewUsec()); } // If the buffer is empty and not correctly initialized for our type... if (type != packetBuffer._currentType && packetBuffer._currentSize == 0) { - initializePacket(packetBuffer, type); + initializePacket(packetBuffer, type, node->getClockSkewUsec()); } // This is really the first time we know which server/node this particular edit message @@ -330,14 +328,14 @@ void OctreeEditPacketSender::releaseQueuedPacket(EditPacketBuffer& packetBuffer) _releaseQueuedPacketMutex.unlock(); } -void OctreeEditPacketSender::initializePacket(EditPacketBuffer& packetBuffer, PacketType type) { +void OctreeEditPacketSender::initializePacket(EditPacketBuffer& packetBuffer, PacketType type, int nodeClockSkew) { packetBuffer._currentSize = populatePacketHeader(reinterpret_cast(&packetBuffer._currentBuffer[0]), type); // skip over sequence number for now; will be packed when packet is ready to be sent out packetBuffer._currentSize += sizeof(quint16); // pack in timestamp - quint64 now = usecTimestampNow(); + quint64 now = usecTimestampNow() + nodeClockSkew; quint64* timeAt = (quint64*)&packetBuffer._currentBuffer[packetBuffer._currentSize]; *timeAt = now; packetBuffer._currentSize += sizeof(quint64); // nudge past timestamp diff --git a/libraries/octree/src/OctreeEditPacketSender.h b/libraries/octree/src/OctreeEditPacketSender.h index 9ba6a0243c..79b7a43ac4 100644 --- a/libraries/octree/src/OctreeEditPacketSender.h +++ b/libraries/octree/src/OctreeEditPacketSender.h @@ -101,7 +101,7 @@ protected: void queuePacketToNode(const QUuid& nodeID, unsigned char* buffer, size_t length, qint64 satoshiCost = 0); void queuePendingPacketToNodes(PacketType type, unsigned char* buffer, size_t length, qint64 satoshiCost = 0); void queuePacketToNodes(unsigned char* buffer, size_t length, qint64 satoshiCost = 0); - void initializePacket(EditPacketBuffer& packetBuffer, PacketType type); + void initializePacket(EditPacketBuffer& packetBuffer, PacketType type, int nodeClockSkew); void releaseQueuedPacket(EditPacketBuffer& packetBuffer); // releases specific queued packet void processPreServerExistsPackets();