Merge pull request #14701 from roxanneskelly/Case20615

Case20615 - Changing Avatars doesn't update to everyone intermittently
This commit is contained in:
Antonina Savinova 2019-01-14 14:44:35 -08:00 committed by GitHub
commit 89600f4880
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 31 additions and 21 deletions

View file

@ -207,8 +207,10 @@ void AvatarMixerClientData::processBulkAvatarTraitsAckMessage(ReceivedMessage& m
// process simple traits // process simple traits
auto simpleReceivedIt = traitVersions.simpleCBegin(); auto simpleReceivedIt = traitVersions.simpleCBegin();
while (simpleReceivedIt != traitVersions.simpleCEnd()) { while (simpleReceivedIt != traitVersions.simpleCEnd()) {
auto traitType = static_cast<AvatarTraits::TraitType>(std::distance(traitVersions.simpleCBegin(), simpleReceivedIt)); if (*simpleReceivedIt != AvatarTraits::DEFAULT_TRAIT_VERSION) {
_perNodeAckedTraitVersions[nodeId][traitType] = *simpleReceivedIt; auto traitType = static_cast<AvatarTraits::TraitType>(std::distance(traitVersions.simpleCBegin(), simpleReceivedIt));
_perNodeAckedTraitVersions[nodeId][traitType] = *simpleReceivedIt;
}
simpleReceivedIt++; simpleReceivedIt++;
} }

View file

@ -106,12 +106,13 @@ qint64 AvatarMixerSlave::addChangedTraitsToBulkPacket(AvatarMixerClientData* lis
// in that packet_ are ignored. Updates to traits not in that packet will // in that packet_ are ignored. Updates to traits not in that packet will
// be sent. // be sent.
auto otherNodeLocalID = sendingNodeData->getNodeLocalID(); auto sendingNodeLocalID = sendingNodeData->getNodeLocalID();
// Perform a simple check with two server clock time points // Perform a simple check with two server clock time points
// to see if there is any new traits data for this avatar that we need to send // to see if there is any new traits data for this avatar that we need to send
auto timeOfLastTraitsSent = listeningNodeData->getLastOtherAvatarTraitsSendPoint(otherNodeLocalID); auto timeOfLastTraitsSent = listeningNodeData->getLastOtherAvatarTraitsSendPoint(sendingNodeLocalID);
auto timeOfLastTraitsChange = sendingNodeData->getLastReceivedTraitsChange(); auto timeOfLastTraitsChange = sendingNodeData->getLastReceivedTraitsChange();
bool allTraitsUpdated = true;
qint64 bytesWritten = 0; qint64 bytesWritten = 0;
@ -121,8 +122,8 @@ qint64 AvatarMixerSlave::addChangedTraitsToBulkPacket(AvatarMixerClientData* lis
auto sendingAvatar = sendingNodeData->getAvatarSharedPointer(); auto sendingAvatar = sendingNodeData->getAvatarSharedPointer();
// compare trait versions so we can see what exactly needs to go out // compare trait versions so we can see what exactly needs to go out
auto& lastSentVersions = listeningNodeData->getLastSentTraitVersions(otherNodeLocalID); auto& lastSentVersions = listeningNodeData->getLastSentTraitVersions(sendingNodeLocalID);
auto& lastAckedVersions = listeningNodeData->getLastAckedTraitVersions(otherNodeLocalID); auto& lastAckedVersions = listeningNodeData->getLastAckedTraitVersions(sendingNodeLocalID);
const auto& lastReceivedVersions = sendingNodeData->getLastReceivedTraitVersions(); const auto& lastReceivedVersions = sendingNodeData->getLastReceivedTraitVersions();
auto simpleReceivedIt = lastReceivedVersions.simpleCBegin(); auto simpleReceivedIt = lastReceivedVersions.simpleCBegin();
@ -134,16 +135,20 @@ qint64 AvatarMixerSlave::addChangedTraitsToBulkPacket(AvatarMixerClientData* lis
auto& lastAckedVersionRef = lastAckedVersions[traitType]; auto& lastAckedVersionRef = lastAckedVersions[traitType];
// hold sending more traits until we've been acked that the last one we sent was received // hold sending more traits until we've been acked that the last one we sent was received
if (lastSentVersionRef == lastAckedVersionRef && lastReceivedVersions[traitType] > lastSentVersionRef) { if (lastSentVersionRef == lastAckedVersionRef) {
bytesWritten += addTraitsNodeHeader(listeningNodeData, sendingNodeData, traitsPacketList, bytesWritten); if (lastReceivedVersion > lastSentVersionRef) {
// there is an update to this trait, add it to the traits packet bytesWritten += addTraitsNodeHeader(listeningNodeData, sendingNodeData, traitsPacketList, bytesWritten);
bytesWritten += sendingAvatar->packTrait(traitType, traitsPacketList, lastReceivedVersion); // there is an update to this trait, add it to the traits packet
// update the last sent version bytesWritten += sendingAvatar->packTrait(traitType, traitsPacketList, lastReceivedVersion);
lastSentVersionRef = lastReceivedVersion; // update the last sent version
// Remember which versions we sent in this particular packet lastSentVersionRef = lastReceivedVersion;
// so we can verify when it's acked. // Remember which versions we sent in this particular packet
auto& pendingTraitVersions = listeningNodeData->getPendingTraitVersions(listeningNodeData->getTraitsMessageSequence(), otherNodeLocalID); // so we can verify when it's acked.
pendingTraitVersions[traitType] = lastReceivedVersion; auto& pendingTraitVersions = listeningNodeData->getPendingTraitVersions(listeningNodeData->getTraitsMessageSequence(), sendingNodeLocalID);
pendingTraitVersions[traitType] = lastReceivedVersion;
}
} else {
allTraitsUpdated = false;
} }
++simpleReceivedIt; ++simpleReceivedIt;
@ -182,6 +187,7 @@ qint64 AvatarMixerSlave::addChangedTraitsToBulkPacket(AvatarMixerClientData* lis
// version to go on, otherwise we drop the received trait // version to go on, otherwise we drop the received trait
if (sentInstanceIt != sentIDValuePairs.end() && if (sentInstanceIt != sentIDValuePairs.end() &&
(ackedInstanceIt == ackIDValuePairs.end() || sentInstanceIt->value != ackedInstanceIt->value)) { (ackedInstanceIt == ackIDValuePairs.end() || sentInstanceIt->value != ackedInstanceIt->value)) {
allTraitsUpdated = false;
continue; continue;
} }
if (!isDeleted && (sentInstanceIt == sentIDValuePairs.end() || receivedVersion > sentInstanceIt->value)) { if (!isDeleted && (sentInstanceIt == sentIDValuePairs.end() || receivedVersion > sentInstanceIt->value)) {
@ -198,7 +204,7 @@ qint64 AvatarMixerSlave::addChangedTraitsToBulkPacket(AvatarMixerClientData* lis
auto& pendingTraitVersions = auto& pendingTraitVersions =
listeningNodeData->getPendingTraitVersions(listeningNodeData->getTraitsMessageSequence(), listeningNodeData->getPendingTraitVersions(listeningNodeData->getTraitsMessageSequence(),
otherNodeLocalID); sendingNodeLocalID);
pendingTraitVersions.instanceInsert(traitType, instanceID, receivedVersion); pendingTraitVersions.instanceInsert(traitType, instanceID, receivedVersion);
} else if (isDeleted && sentInstanceIt != sentIDValuePairs.end() && absoluteReceivedVersion > sentInstanceIt->value) { } else if (isDeleted && sentInstanceIt != sentIDValuePairs.end() && absoluteReceivedVersion > sentInstanceIt->value) {
@ -212,7 +218,7 @@ qint64 AvatarMixerSlave::addChangedTraitsToBulkPacket(AvatarMixerClientData* lis
auto& pendingTraitVersions = auto& pendingTraitVersions =
listeningNodeData->getPendingTraitVersions(listeningNodeData->getTraitsMessageSequence(), listeningNodeData->getPendingTraitVersions(listeningNodeData->getTraitsMessageSequence(),
otherNodeLocalID); sendingNodeLocalID);
pendingTraitVersions.instanceInsert(traitType, instanceID, absoluteReceivedVersion); pendingTraitVersions.instanceInsert(traitType, instanceID, absoluteReceivedVersion);
} }
@ -223,10 +229,12 @@ qint64 AvatarMixerSlave::addChangedTraitsToBulkPacket(AvatarMixerClientData* lis
if (bytesWritten) { if (bytesWritten) {
// write a null trait type to mark the end of trait data for this avatar // write a null trait type to mark the end of trait data for this avatar
bytesWritten += traitsPacketList.writePrimitive(AvatarTraits::NullTrait); bytesWritten += traitsPacketList.writePrimitive(AvatarTraits::NullTrait);
// since we send all traits for this other avatar, update the time of last traits sent
// to match the time of last traits change
if (allTraitsUpdated) {
listeningNodeData->setLastOtherAvatarTraitsSendPoint(sendingNodeLocalID, timeOfLastTraitsChange);
}
} }
// since we send all traits for this other avatar, update the time of last traits sent
// to match the time of last traits change
listeningNodeData->setLastOtherAvatarTraitsSendPoint(otherNodeLocalID, timeOfLastTraitsChange);
} }