Merge pull request #3158 from wangyix/master

worklist 19807: Fixed bug in OctreeEditPacketSender where there was one outgoing seq number for all nodes.
This commit is contained in:
Brad Hefta-Gaub 2014-07-10 18:48:11 -07:00
commit dbca97c71b
2 changed files with 16 additions and 14 deletions

View file

@ -34,7 +34,6 @@ OctreeEditPacketSender::OctreeEditPacketSender() :
_maxPendingMessages(DEFAULT_MAX_PENDING_MESSAGES), _maxPendingMessages(DEFAULT_MAX_PENDING_MESSAGES),
_releaseQueuedMessagesPending(false), _releaseQueuedMessagesPending(false),
_serverJurisdictions(NULL), _serverJurisdictions(NULL),
_sequenceNumber(0),
_maxPacketSize(MAX_PACKET_SIZE) { _maxPacketSize(MAX_PACKET_SIZE) {
} }
@ -88,7 +87,7 @@ bool OctreeEditPacketSender::serversExist() const {
// This method is called when the edit packet layer has determined that it has a fully formed packet destined for // This method is called when the edit packet layer has determined that it has a fully formed packet destined for
// a known nodeID. // a known nodeID.
void OctreeEditPacketSender::queuePacketToNode(const QUuid& nodeUUID, const unsigned char* buffer, ssize_t length) { void OctreeEditPacketSender::queuePacketToNode(const QUuid& nodeUUID, unsigned char* buffer, ssize_t length) {
NodeList* nodeList = NodeList::getInstance(); NodeList* nodeList = NodeList::getInstance();
foreach (const SharedNodePointer& node, nodeList->getNodeHash()) { foreach (const SharedNodePointer& node, nodeList->getNodeHash()) {
@ -96,13 +95,18 @@ void OctreeEditPacketSender::queuePacketToNode(const QUuid& nodeUUID, const unsi
if (node->getType() == getMyNodeType() && if (node->getType() == getMyNodeType() &&
((node->getUUID() == nodeUUID) || (nodeUUID.isNull()))) { ((node->getUUID() == nodeUUID) || (nodeUUID.isNull()))) {
if (node->getActiveSocket()) { if (node->getActiveSocket()) {
// pack sequence number
int numBytesPacketHeader = numBytesForPacketHeader(reinterpret_cast<char*>(buffer));
unsigned char* sequenceAt = buffer + numBytesPacketHeader;
quint16 sequence = _outgoingSequenceNumbers[nodeUUID]++;
memcpy(sequenceAt, &sequence, sizeof(quint16));
// send packet
QByteArray packet(reinterpret_cast<const char*>(buffer), length); QByteArray packet(reinterpret_cast<const char*>(buffer), length);
queuePacketForSending(node, packet); queuePacketForSending(node, packet);
// extract sequence number and add packet to history // add packet to history
int numBytesPacketHeader = numBytesForPacketHeader(packet);
const char* dataAt = reinterpret_cast<const char*>(packet.data()) + numBytesPacketHeader;
unsigned short int sequence = *((unsigned short int*)dataAt);
_sentPacketHistories[nodeUUID].packetSent(sequence, packet); _sentPacketHistories[nodeUUID].packetSent(sequence, packet);
// debugging output... // debugging output...
@ -312,11 +316,8 @@ void OctreeEditPacketSender::releaseQueuedPacket(EditPacketBuffer& packetBuffer)
void OctreeEditPacketSender::initializePacket(EditPacketBuffer& packetBuffer, PacketType type) { void OctreeEditPacketSender::initializePacket(EditPacketBuffer& packetBuffer, PacketType type) {
packetBuffer._currentSize = populatePacketHeader(reinterpret_cast<char*>(&packetBuffer._currentBuffer[0]), type); packetBuffer._currentSize = populatePacketHeader(reinterpret_cast<char*>(&packetBuffer._currentBuffer[0]), type);
// pack in sequence numbers // skip over sequence number for now; will be packed when packet is ready to be sent out
unsigned short int* sequenceAt = (unsigned short int*)&packetBuffer._currentBuffer[packetBuffer._currentSize]; packetBuffer._currentSize += sizeof(quint16);
*sequenceAt = _sequenceNumber;
packetBuffer._currentSize += sizeof(unsigned short int); // nudge past sequence
_sequenceNumber++;
// pack in timestamp // pack in timestamp
quint64 now = usecTimestampNow(); quint64 now = usecTimestampNow();
@ -373,5 +374,6 @@ void OctreeEditPacketSender::nodeKilled(SharedNodePointer node) {
// TODO: add locks // TODO: add locks
QUuid nodeUUID = node->getUUID(); QUuid nodeUUID = node->getUUID();
_pendingEditPackets.remove(nodeUUID); _pendingEditPackets.remove(nodeUUID);
_outgoingSequenceNumbers.remove(nodeUUID);
_sentPacketHistories.remove(nodeUUID); _sentPacketHistories.remove(nodeUUID);
} }

View file

@ -21,7 +21,7 @@
/// Used for construction of edit packets /// Used for construction of edit packets
class EditPacketBuffer { class EditPacketBuffer {
public: public:
EditPacketBuffer() : _nodeUUID(), _currentType(PacketTypeUnknown), _currentSize(0) { } EditPacketBuffer() : _nodeUUID(), _currentType(PacketTypeUnknown), _currentSize(0) { }
EditPacketBuffer(PacketType type, unsigned char* codeColorBuffer, ssize_t length, const QUuid nodeUUID = QUuid()); EditPacketBuffer(PacketType type, unsigned char* codeColorBuffer, ssize_t length, const QUuid nodeUUID = QUuid());
QUuid _nodeUUID; QUuid _nodeUUID;
PacketType _currentType; PacketType _currentType;
@ -100,7 +100,7 @@ public:
protected: protected:
bool _shouldSend; bool _shouldSend;
void queuePacketToNode(const QUuid& nodeID, const unsigned char* buffer, ssize_t length); void queuePacketToNode(const QUuid& nodeID, unsigned char* buffer, ssize_t length);
void queuePendingPacketToNodes(PacketType type, unsigned char* buffer, ssize_t length); void queuePendingPacketToNodes(PacketType type, unsigned char* buffer, ssize_t length);
void queuePacketToNodes(unsigned char* buffer, ssize_t length); void queuePacketToNodes(unsigned char* buffer, ssize_t length);
void initializePacket(EditPacketBuffer& packetBuffer, PacketType type); void initializePacket(EditPacketBuffer& packetBuffer, PacketType type);
@ -120,12 +120,12 @@ protected:
NodeToJurisdictionMap* _serverJurisdictions; NodeToJurisdictionMap* _serverJurisdictions;
unsigned short int _sequenceNumber;
int _maxPacketSize; int _maxPacketSize;
QMutex _releaseQueuedPacketMutex; QMutex _releaseQueuedPacketMutex;
// TODO: add locks for this and _pendingEditPackets // TODO: add locks for this and _pendingEditPackets
QHash<QUuid, SentPacketHistory> _sentPacketHistories; QHash<QUuid, SentPacketHistory> _sentPacketHistories;
QHash<QUuid, quint16> _outgoingSequenceNumbers;
}; };
#endif // hifi_OctreeEditPacketSender_h #endif // hifi_OctreeEditPacketSender_h