Skip to content

Track ownership change events #931

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -233,19 +233,22 @@ public void HandleChangeOwner(ulong clientId, Stream stream)
ulong networkId = reader.ReadUInt64Packed();
ulong ownerClientId = reader.ReadUInt64Packed();

if (NetworkManager.SpawnManager.SpawnedObjects[networkId].OwnerClientId == NetworkManager.LocalClientId)
var networkObject = NetworkManager.SpawnManager.SpawnedObjects[networkId];
if (networkObject.OwnerClientId == NetworkManager.LocalClientId)
{
//We are current owner.
NetworkManager.SpawnManager.SpawnedObjects[networkId].InvokeBehaviourOnLostOwnership();
networkObject.InvokeBehaviourOnLostOwnership();
}

if (ownerClientId == NetworkManager.LocalClientId)
{
//We are new owner.
NetworkManager.SpawnManager.SpawnedObjects[networkId].InvokeBehaviourOnGainedOwnership();
networkObject.InvokeBehaviourOnGainedOwnership();
}

NetworkManager.SpawnManager.SpawnedObjects[networkId].OwnerClientId = ownerClientId;
networkObject.OwnerClientId = ownerClientId;

NetworkManager.NetworkMetrics.TrackOwnershipChangeReceived(clientId, networkObject.NetworkObjectId, networkObject.name, (ulong)stream.Length);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,13 @@ public interface INetworkMetrics

void TrackUnnamedMessageReceived(ulong senderClientId, ulong bytesCount);

void TrackNetworkVariableDeltaSent(ulong receiverClientId, ulong networkObjectId, string gameObjectName,string variableName, ulong bytesCount);
void TrackNetworkVariableDeltaSent(ulong receiverClientId, ulong networkObjectId, string gameObjectName, string variableName, ulong bytesCount);

void TrackNetworkVariableDeltaReceived(ulong senderClientId, ulong networkObjectId, string gameObjectName,string variableName, ulong bytesCount);
void TrackNetworkVariableDeltaReceived(ulong senderClientId, ulong networkObjectId, string gameObjectName, string variableName, ulong bytesCount);

void TrackOwnershipChangeSent(ulong receiverClientId, ulong networkObjectId, string gameObjectName, ulong bytesCount);

void TrackOwnershipChangeReceived(ulong senderClientId, ulong networkObjectId, string gameObjectName, ulong bytesCount);

void TrackObjectSpawnSent(ulong receiverClientId, ulong networkObjectId, string gameObjectName, ulong bytesCount);

Expand Down
14 changes: 14 additions & 0 deletions com.unity.multiplayer.mlapi/Runtime/Metrics/NetworkMetrics.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@ public class NetworkMetrics : INetworkMetrics
readonly EventMetric<UnnamedMessageEvent> m_UnnamedMessageReceivedEvent = new EventMetric<UnnamedMessageEvent>(MetricNames.UnnamedMessageReceived);
readonly EventMetric<NetworkVariableEvent> m_NetworkVariableDeltaSentEvent = new EventMetric<NetworkVariableEvent>(MetricNames.NetworkVariableDeltaSent);
readonly EventMetric<NetworkVariableEvent> m_NetworkVariableDeltaReceivedEvent = new EventMetric<NetworkVariableEvent>(MetricNames.NetworkVariableDeltaReceived);
readonly EventMetric<OwnershipChangeEvent> m_OwnershipChangeSentEvent = new EventMetric<OwnershipChangeEvent>(MetricNames.OwnershipChangeSent);
readonly EventMetric<OwnershipChangeEvent> m_OwnershipChangeReceivedEvent = new EventMetric<OwnershipChangeEvent>(MetricNames.OwnershipChangeReceived);
readonly EventMetric<ObjectSpawnedEvent> m_ObjectSpawnSentEvent = new EventMetric<ObjectSpawnedEvent>(MetricNames.ObjectSpawnedSent);
readonly EventMetric<ObjectSpawnedEvent> m_ObjectSpawnReceivedEvent = new EventMetric<ObjectSpawnedEvent>(MetricNames.ObjectSpawnedReceived);
readonly EventMetric<ObjectDestroyedEvent> m_ObjectDestroySentEvent = new EventMetric<ObjectDestroyedEvent>(MetricNames.ObjectDestroyedSent);
Expand All @@ -35,6 +37,7 @@ public NetworkMetrics(NetworkManager networkManager)
.WithMetricEvents(m_NamedMessageSentEvent, m_NamedMessageReceivedEvent)
.WithMetricEvents(m_UnnamedMessageSentEvent, m_UnnamedMessageReceivedEvent)
.WithMetricEvents(m_NetworkVariableDeltaSentEvent, m_NetworkVariableDeltaReceivedEvent)
.WithMetricEvents(m_OwnershipChangeSentEvent, m_OwnershipChangeReceivedEvent)
.WithMetricEvents(m_ObjectSpawnSentEvent, m_ObjectSpawnReceivedEvent)
.WithMetricEvents(m_ObjectDestroySentEvent, m_ObjectDestroyReceivedEvent)
.WithMetricEvents(m_RpcSentEvent, m_RpcReceivedEvent)
Expand Down Expand Up @@ -103,6 +106,17 @@ public void TrackNetworkVariableDeltaReceived(ulong senderClientId, ulong networ
m_NetworkVariableDeltaReceivedEvent.Mark(new NetworkVariableEvent(new ConnectionInfo(senderClientId), new NetworkObjectIdentifier(gameObjectName, networkObjectId), variableName, bytesCount));
}

public void TrackOwnershipChangeSent(ulong receiverClientId, ulong networkObjectId, string gameObjectName, ulong bytesCount)
{
m_OwnershipChangeSentEvent.Mark(new OwnershipChangeEvent(new ConnectionInfo(receiverClientId), new NetworkObjectIdentifier(gameObjectName, networkObjectId), bytesCount));
}

public void TrackOwnershipChangeReceived(ulong senderClientId, ulong networkObjectId, string gameObjectName, ulong bytesCount)
{
m_OwnershipChangeReceivedEvent.Mark(new OwnershipChangeEvent(new ConnectionInfo(senderClientId),
new NetworkObjectIdentifier(gameObjectName, networkObjectId), bytesCount));
}

public void TrackObjectSpawnSent(ulong receiverClientId, ulong networkObjectId, string gameObjectName, ulong bytesCount)
{
m_ObjectSpawnSentEvent.Mark(new ObjectSpawnedEvent(new ConnectionInfo(receiverClientId), new NetworkObjectIdentifier(gameObjectName, networkObjectId), bytesCount));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,14 @@ public void TrackNetworkVariableDeltaReceived(ulong senderClientId, ulong networ
{
}

public void TrackOwnershipChangeSent(ulong receiverClientId, ulong networkObjectId, string gameObjectName, ulong bytesCount)
{
}

public void TrackOwnershipChangeReceived(ulong senderClientId, ulong networkObjectId, string gameObjectName, ulong bytesCount)
{
}

public void TrackObjectSpawnSent(ulong receiverClientId, ulong networkObjectId, string gameObjectName, ulong bytesCount)
{
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,11 @@ internal void RemoveOwnership(NetworkObject networkObject)
writer.WriteUInt64Packed(networkObject.OwnerClientId);

NetworkManager.MessageSender.Send(NetworkConstants.CHANGE_OWNER, NetworkChannel.Internal, buffer);

foreach (var client in NetworkManager.ConnectedClients)
{
NetworkManager.NetworkMetrics.TrackOwnershipChangeSent(client.Key, networkObject.NetworkObjectId, networkObject.name, (ulong)buffer.Length);
}
}
}

Expand Down Expand Up @@ -153,6 +158,11 @@ internal void ChangeOwnership(NetworkObject networkObject, ulong clientId)
writer.WriteUInt64Packed(clientId);

NetworkManager.MessageSender.Send(NetworkConstants.CHANGE_OWNER, NetworkChannel.Internal, buffer);

foreach (var client in NetworkManager.ConnectedClients)
{
NetworkManager.NetworkMetrics.TrackOwnershipChangeSent(client.Key, networkObject.NetworkObjectId, networkObject.name, (ulong)buffer.Length);
}
}
}

Expand Down

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
using System;
using System.Collections;
using System.Linq;
using MLAPI.Metrics;
using MLAPI.RuntimeTests.Metrics.NetworkVariables;
using NUnit.Framework;
using Unity.Multiplayer.MetricTypes;
using UnityEngine;
using UnityEngine.TestTools;

namespace MLAPI.RuntimeTests.Metrics
{
public class OwnershipChangeMetricsTests
{
NetworkManager m_Server;
NetworkMetrics m_ServerMetrics;
NetworkManager m_Client;
NetworkMetrics m_ClientMetrics;

[UnitySetUp]
public IEnumerator SetUp()
{
if (!MultiInstanceHelpers.Create(1, out m_Server, out var clients))
{
Debug.LogError("Failed to create instances");
Assert.Fail("Failed to create instances");
}

var playerPrefab = new GameObject("Player");
var networkObject = playerPrefab.AddComponent<NetworkObject>();
playerPrefab.AddComponent<NetworkVariableComponent>();

MultiInstanceHelpers.MakeNetworkedObjectTestPrefab(networkObject);

m_Server.NetworkConfig.PlayerPrefab = playerPrefab;

foreach (var client in clients)
{
client.NetworkConfig.PlayerPrefab = playerPrefab;
}

if (!MultiInstanceHelpers.Start(true, m_Server, clients))
{
Debug.LogError("Failed to start instances");
Assert.Fail("Failed to start instances");
}

yield return MultiInstanceHelpers.Run(MultiInstanceHelpers.WaitForClientsConnected(clients));
yield return MultiInstanceHelpers.Run(MultiInstanceHelpers.WaitForClientConnectedToServer(m_Server));

m_Client = clients.First();
m_ServerMetrics = m_Server.NetworkMetrics as NetworkMetrics;
m_ClientMetrics = m_Client.NetworkMetrics as NetworkMetrics;
}

[UnityTearDown]
public IEnumerator TearDown()
{
MultiInstanceHelpers.Destroy();

yield return null;
}

[UnityTest]
public IEnumerator TrackOwnershipChangeSentMetric()
{
var gameObject = new GameObject(Guid.NewGuid().ToString());
var networkObject = gameObject.AddComponent<NetworkObject>();
networkObject.NetworkManagerOwner = m_Server;
networkObject.Spawn();

yield return new WaitForSeconds(0.2f);

var waitForMetricValues = new WaitForMetricValues<OwnershipChangeEvent>(m_ServerMetrics.Dispatcher, MetricNames.OwnershipChangeSent);

networkObject.ChangeOwnership(1);

yield return waitForMetricValues.WaitForMetricsReceived();

var metricValues = waitForMetricValues.AssertMetricValuesHaveBeenFound();

var ownershipChangeSent = metricValues.First();
Assert.AreEqual(m_Server.LocalClientId, ownershipChangeSent.Connection.Id);
}

[UnityTest]
public IEnumerator TrackOwnershipChangeReceivedMetric()
{
var gameObject = new GameObject(Guid.NewGuid().ToString());
var networkObject = gameObject.AddComponent<NetworkObject>();
networkObject.NetworkManagerOwner = m_Server;
networkObject.Spawn();

yield return new WaitForSeconds(0.2f);

var waitForMetricValues = new WaitForMetricValues<OwnershipChangeEvent>(m_ClientMetrics.Dispatcher, MetricNames.OwnershipChangeReceived);

networkObject.ChangeOwnership(1);

yield return waitForMetricValues.WaitForMetricsReceived();

var metricValues = waitForMetricValues.AssertMetricValuesHaveBeenFound();
Assert.AreEqual(1, metricValues.Count);
}
}
}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.