Skip to content

Commit b11e04e

Browse files
fix: MTT-2991: Flush UnityTransport send queues on disconnect (#1847)
* fix: MTT-2991: Flush UnityTransport send queues on disconnect * Add PR number to CHANGELOG entry * Update CHANGELOG entry * Fix existing disconnect tests * Don't send more than necessary in overflow test
1 parent 32b71ff commit b11e04e

File tree

4 files changed

+82
-7
lines changed

4 files changed

+82
-7
lines changed

com.unity.netcode.gameobjects/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ Additional documentation and release notes are available at [Multiplayer Documen
2222
- Removed `com.unity.modules.animation`, `com.unity.modules.physics` and `com.unity.modules.physics2d` dependencies from the package (#1812)
2323

2424
### Fixed
25+
- Fixed issue where `UnityTransport` send queues were not flushed when calling `DisconnectLocalClient` or `DisconnectRemoteClient`. (#1847)
2526
- Fixed NetworkBehaviour dependency verification check for an existing NetworkObject not searching from root parent transform relative GameObject. (#1841)
2627
- Fixed issue where entries were not being removed from the NetworkSpawnManager.OwnershipToObjectsTable. (#1838)
2728
- Fixed ClientRpcs would always send to all connected clients by default as opposed to only sending to the NetworkObject's Observers list by default. (#1836)

com.unity.netcode.gameobjects/Runtime/Transports/UTP/UnityTransport.cs

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -876,10 +876,23 @@ private void ClearSendQueuesForClientId(ulong clientId)
876876
}
877877
}
878878

879+
private void FlushSendQueuesForClientId(ulong clientId)
880+
{
881+
foreach (var kvp in m_SendQueue)
882+
{
883+
if (kvp.Key.ClientId == clientId)
884+
{
885+
SendBatchedMessages(kvp.Key, kvp.Value);
886+
}
887+
}
888+
}
889+
879890
public override void DisconnectLocalClient()
880891
{
881892
if (m_State == State.Connected)
882893
{
894+
FlushSendQueuesForClientId(m_ServerClientId);
895+
883896
if (m_Driver.Disconnect(ParseClientId(m_ServerClientId)) == 0)
884897
{
885898
m_State = State.Disconnected;
@@ -904,15 +917,16 @@ public override void DisconnectRemoteClient(ulong clientId)
904917

905918
if (m_State == State.Listening)
906919
{
907-
var connection = ParseClientId(clientId);
920+
FlushSendQueuesForClientId(clientId);
921+
922+
m_ReliableReceiveQueues.Remove(clientId);
923+
ClearSendQueuesForClientId(clientId);
908924

925+
var connection = ParseClientId(clientId);
909926
if (m_Driver.GetConnectionState(connection) != NetworkConnection.State.Disconnected)
910927
{
911928
m_Driver.Disconnect(connection);
912929
}
913-
914-
m_ReliableReceiveQueues.Remove(clientId);
915-
ClearSendQueuesForClientId(clientId);
916930
}
917931
}
918932

com.unity.netcode.gameobjects/Tests/Runtime/Transports/UnityTransportConnectionTests.cs

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -303,7 +303,16 @@ public IEnumerator ServerDisconnectWithDataInQueue()
303303

304304
m_Server.DisconnectRemoteClient(m_ServerEvents[0].ClientID);
305305

306-
yield return WaitForNetworkEvent(NetworkEvent.Disconnect, m_ClientsEvents[0]);
306+
yield return WaitForNetworkEvent(NetworkEvent.Data, m_ClientsEvents[0]);
307+
308+
if (m_ClientsEvents[0].Count >= 3)
309+
{
310+
Assert.AreEqual(NetworkEvent.Disconnect, m_ClientsEvents[0][2].Type);
311+
}
312+
else
313+
{
314+
yield return WaitForNetworkEvent(NetworkEvent.Disconnect, m_ClientsEvents[0]);
315+
}
307316
}
308317

309318
// Check client disconnection with data in send queue.
@@ -323,7 +332,16 @@ public IEnumerator ClientDisconnectWithDataInQueue()
323332

324333
m_Clients[0].DisconnectLocalClient();
325334

326-
yield return WaitForNetworkEvent(NetworkEvent.Disconnect, m_ServerEvents);
335+
yield return WaitForNetworkEvent(NetworkEvent.Data, m_ServerEvents);
336+
337+
if (m_ServerEvents.Count >= 3)
338+
{
339+
Assert.AreEqual(NetworkEvent.Disconnect, m_ServerEvents[2].Type);
340+
}
341+
else
342+
{
343+
yield return WaitForNetworkEvent(NetworkEvent.Disconnect, m_ServerEvents);
344+
}
327345
}
328346

329347
// Check that a server can disconnect a client after another client has disconnected.

com.unity.netcode.gameobjects/Tests/Runtime/Transports/UnityTransportTests.cs

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -283,7 +283,7 @@ public IEnumerator DisconnectOnReliableSendQueueOverflow()
283283

284284
m_Server.Shutdown();
285285

286-
var numSends = (UnityTransport.InitialMaxSendQueueSize / 1024) + 1;
286+
var numSends = (UnityTransport.InitialMaxSendQueueSize / 1024);
287287

288288
for (int i = 0; i < numSends; i++)
289289
{
@@ -415,5 +415,47 @@ public IEnumerator SendQueuesFlushedOnShutdown([ValueSource("k_DeliveryParameter
415415

416416
yield return null;
417417
}
418+
419+
[UnityTest]
420+
public IEnumerator SendQueuesFlushedOnLocalClientDisconnect([ValueSource("k_DeliveryParameters")] NetworkDelivery delivery)
421+
{
422+
InitializeTransport(out m_Server, out m_ServerEvents);
423+
InitializeTransport(out m_Client1, out m_Client1Events);
424+
425+
m_Server.StartServer();
426+
m_Client1.StartClient();
427+
428+
yield return WaitForNetworkEvent(NetworkEvent.Connect, m_Client1Events);
429+
430+
var data = new ArraySegment<byte>(new byte[] { 42 });
431+
m_Client1.Send(m_Client1.ServerClientId, data, delivery);
432+
433+
m_Client1.DisconnectLocalClient();
434+
435+
yield return WaitForNetworkEvent(NetworkEvent.Data, m_ServerEvents);
436+
437+
yield return null;
438+
}
439+
440+
[UnityTest]
441+
public IEnumerator SendQueuesFlushedOnRemoteClientDisconnect([ValueSource("k_DeliveryParameters")] NetworkDelivery delivery)
442+
{
443+
InitializeTransport(out m_Server, out m_ServerEvents);
444+
InitializeTransport(out m_Client1, out m_Client1Events);
445+
446+
m_Server.StartServer();
447+
m_Client1.StartClient();
448+
449+
yield return WaitForNetworkEvent(NetworkEvent.Connect, m_Client1Events);
450+
451+
var data = new ArraySegment<byte>(new byte[] { 42 });
452+
m_Server.Send(m_Client1.ServerClientId, data, delivery);
453+
454+
m_Server.DisconnectRemoteClient(m_ServerEvents[0].ClientID);
455+
456+
yield return WaitForNetworkEvent(NetworkEvent.Data, m_Client1Events);
457+
458+
yield return null;
459+
}
418460
}
419461
}

0 commit comments

Comments
 (0)