mirror of
https://github.com/Armored-Dragon/overte.git
synced 2025-03-11 16:13:16 +01:00
adjust the sentAt times in packets by the receiving side's clockskew so that it can calculate proper flight times
This commit is contained in:
parent
13e358549d
commit
bcec14b0f4
4 changed files with 42 additions and 10 deletions
|
@ -98,15 +98,28 @@ void OctreeInboundPacketProcessor::processPacket(const SharedNodePointer& sendin
|
||||||
unsigned short int sequence = (*((unsigned short int*)(packetData + numBytesPacketHeader)));
|
unsigned short int sequence = (*((unsigned short int*)(packetData + numBytesPacketHeader)));
|
||||||
quint64 sentAt = (*((quint64*)(packetData + numBytesPacketHeader + sizeof(sequence))));
|
quint64 sentAt = (*((quint64*)(packetData + numBytesPacketHeader + sizeof(sequence))));
|
||||||
quint64 arrivedAt = usecTimestampNow();
|
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;
|
quint64 transitTime = arrivedAt - sentAt;
|
||||||
int editsInPacket = 0;
|
int editsInPacket = 0;
|
||||||
quint64 processTime = 0;
|
quint64 processTime = 0;
|
||||||
quint64 lockWaitTime = 0;
|
quint64 lockWaitTime = 0;
|
||||||
|
|
||||||
if (debugProcessPacket || _myServer->wantsDebugReceiving()) {
|
if (debugProcessPacket || _myServer->wantsDebugReceiving()) {
|
||||||
qDebug() << "PROCESSING THREAD: got '" << packetType << "' packet - " << _receivedPacketCount
|
qDebug() << "PROCESSING THREAD: got '" << packetType << "' packet - " << _receivedPacketCount << " command from client";
|
||||||
<< " command from client receivedBytes=" << packet.size()
|
qDebug() << " receivedBytes=" << packet.size();
|
||||||
<< " sequence=" << sequence << " transitTime=" << transitTime << " usecs";
|
qDebug() << " sequence=" << sequence;
|
||||||
|
qDebug() << " sentAt=" << sentAt << " usecs";
|
||||||
|
qDebug() << " arrivedAt=" << arrivedAt << " usecs";
|
||||||
|
qDebug() << " transitTime=" << transitTime << " usecs";
|
||||||
|
qDebug() << " sendingNode->getClockSkewUsec()=" << sendingNode->getClockSkewUsec() << " usecs";
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (debugProcessPacket) {
|
if (debugProcessPacket) {
|
||||||
|
|
|
@ -284,6 +284,27 @@
|
||||||
"default": "",
|
"default": "",
|
||||||
"advanced": true
|
"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",
|
"name": "clockSkew",
|
||||||
"label": "Clock Skew",
|
"label": "Clock Skew",
|
||||||
|
|
|
@ -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
|
// 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 a different server... So we need to actually manage multiple queued packets... one
|
||||||
// for each server
|
// for each server
|
||||||
|
|
||||||
_packetsQueueLock.lock();
|
_packetsQueueLock.lock();
|
||||||
|
|
||||||
foreach (const SharedNodePointer& node, NodeList::getInstance()->getNodeHash()) {
|
foreach (const SharedNodePointer& node, NodeList::getInstance()->getNodeHash()) {
|
||||||
// only send to the NodeTypes that are getMyNodeType()
|
// only send to the NodeTypes that are getMyNodeType()
|
||||||
if (node->getActiveSocket() && node->getType() == 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) ||
|
if ((type != packetBuffer._currentType && packetBuffer._currentSize > 0) ||
|
||||||
(packetBuffer._currentSize + length >= (size_t)_maxPacketSize)) {
|
(packetBuffer._currentSize + length >= (size_t)_maxPacketSize)) {
|
||||||
releaseQueuedPacket(packetBuffer);
|
releaseQueuedPacket(packetBuffer);
|
||||||
initializePacket(packetBuffer, type);
|
initializePacket(packetBuffer, type, node->getClockSkewUsec());
|
||||||
}
|
}
|
||||||
|
|
||||||
// If the buffer is empty and not correctly initialized for our type...
|
// If the buffer is empty and not correctly initialized for our type...
|
||||||
if (type != packetBuffer._currentType && packetBuffer._currentSize == 0) {
|
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
|
// 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();
|
_releaseQueuedPacketMutex.unlock();
|
||||||
}
|
}
|
||||||
|
|
||||||
void OctreeEditPacketSender::initializePacket(EditPacketBuffer& packetBuffer, PacketType type) {
|
void OctreeEditPacketSender::initializePacket(EditPacketBuffer& packetBuffer, PacketType type, int nodeClockSkew) {
|
||||||
packetBuffer._currentSize = populatePacketHeader(reinterpret_cast<char*>(&packetBuffer._currentBuffer[0]), type);
|
packetBuffer._currentSize = populatePacketHeader(reinterpret_cast<char*>(&packetBuffer._currentBuffer[0]), type);
|
||||||
|
|
||||||
// skip over sequence number for now; will be packed when packet is ready to be sent out
|
// skip over sequence number for now; will be packed when packet is ready to be sent out
|
||||||
packetBuffer._currentSize += sizeof(quint16);
|
packetBuffer._currentSize += sizeof(quint16);
|
||||||
|
|
||||||
// pack in timestamp
|
// pack in timestamp
|
||||||
quint64 now = usecTimestampNow();
|
quint64 now = usecTimestampNow() + nodeClockSkew;
|
||||||
quint64* timeAt = (quint64*)&packetBuffer._currentBuffer[packetBuffer._currentSize];
|
quint64* timeAt = (quint64*)&packetBuffer._currentBuffer[packetBuffer._currentSize];
|
||||||
*timeAt = now;
|
*timeAt = now;
|
||||||
packetBuffer._currentSize += sizeof(quint64); // nudge past timestamp
|
packetBuffer._currentSize += sizeof(quint64); // nudge past timestamp
|
||||||
|
|
|
@ -101,7 +101,7 @@ protected:
|
||||||
void queuePacketToNode(const QUuid& nodeID, unsigned char* buffer, size_t length, qint64 satoshiCost = 0);
|
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 queuePendingPacketToNodes(PacketType type, unsigned char* buffer, size_t length, qint64 satoshiCost = 0);
|
||||||
void queuePacketToNodes(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 releaseQueuedPacket(EditPacketBuffer& packetBuffer); // releases specific queued packet
|
||||||
|
|
||||||
void processPreServerExistsPackets();
|
void processPreServerExistsPackets();
|
||||||
|
|
Loading…
Reference in a new issue