Merge pull request #19189 from peppy/peform-actions-after-reconnect

Fix creating multiplayer game during server migration not joining new room correctly
This commit is contained in:
Dan Balasescu 2022-07-19 14:46:29 +09:00 committed by GitHub
commit c07f78409e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 27 additions and 18 deletions

View File

@ -64,26 +64,26 @@ namespace osu.Game.Online
this.preferMessagePack = preferMessagePack;
apiState.BindTo(api.State);
apiState.BindValueChanged(_ => connectIfPossible(), true);
apiState.BindValueChanged(_ => Task.Run(connectIfPossible), true);
}
public void Reconnect()
public Task Reconnect()
{
Logger.Log($"{clientName} reconnecting...", LoggingTarget.Network);
Task.Run(connectIfPossible);
return Task.Run(connectIfPossible);
}
private void connectIfPossible()
private async Task connectIfPossible()
{
switch (apiState.Value)
{
case APIState.Failing:
case APIState.Offline:
Task.Run(() => disconnect(true));
await disconnect(true);
break;
case APIState.Online:
Task.Run(connect);
await connect();
break;
}
}

View File

@ -2,6 +2,7 @@
// See the LICENCE file in the repository root for full licence text.
using System;
using System.Threading.Tasks;
using Microsoft.AspNetCore.SignalR.Client;
using osu.Framework.Bindables;
using osu.Game.Online.API;
@ -32,6 +33,6 @@ namespace osu.Game.Online
/// <summary>
/// Reconnect if already connected.
/// </summary>
void Reconnect();
Task Reconnect();
}
}

View File

@ -21,7 +21,6 @@ using osu.Game.Online.Rooms.RoomStatuses;
using osu.Game.Rulesets;
using osu.Game.Rulesets.Mods;
using osu.Game.Utils;
using APIUser = osu.Game.Online.API.Requests.Responses.APIUser;
namespace osu.Game.Online.Multiplayer
{
@ -91,7 +90,7 @@ namespace osu.Game.Online.Multiplayer
/// <summary>
/// The joined <see cref="MultiplayerRoom"/>.
/// </summary>
public virtual MultiplayerRoom? Room
public virtual MultiplayerRoom? Room // virtual for moq
{
get
{
@ -150,7 +149,7 @@ namespace osu.Game.Online.Multiplayer
// clean up local room state on server disconnect.
if (!connected.NewValue && Room != null)
{
Logger.Log("Connection to multiplayer server was lost.", LoggingTarget.Runtime, LogLevel.Important);
Logger.Log("Clearing room due to multiplayer server connection loss.", LoggingTarget.Runtime, LogLevel.Important);
LeaveRoom();
}
}));

View File

@ -85,7 +85,13 @@ namespace osu.Game.Online.Multiplayer
catch (HubException exception)
{
if (exception.GetHubExceptionMessage() == HubClientConnector.SERVER_SHUTDOWN_MESSAGE)
connector?.Reconnect();
{
Debug.Assert(connector != null);
await connector.Reconnect();
return await JoinRoom(roomId, password);
}
throw;
}
}

View File

@ -61,7 +61,14 @@ namespace osu.Game.Online.Spectator
catch (HubException exception)
{
if (exception.GetHubExceptionMessage() == HubClientConnector.SERVER_SHUTDOWN_MESSAGE)
connector?.Reconnect();
{
Debug.Assert(connector != null);
await connector.Reconnect();
await BeginPlayingInternal(state);
return;
}
throw;
}
}

View File

@ -70,12 +70,8 @@ namespace osu.Game.Screens.OnlinePlay.Multiplayer
client.LoadRequested += onLoadRequested;
client.RoomUpdated += onRoomUpdated;
isConnected.BindTo(client.IsConnected);
isConnected.BindValueChanged(connected =>
{
if (!connected.NewValue)
handleRoomLost();
}, true);
if (!client.IsConnected.Value)
handleRoomLost();
}
protected override Drawable CreateMainContent() => new Container