Skip to content
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

feat: added connection retry on realm navigator with realm fallback #2267

Open
wants to merge 2 commits into
base: main
Choose a base branch
from
Open
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
48 changes: 44 additions & 4 deletions Explorer/Assets/Scripts/Global/Dynamic/RealmNavigator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,8 @@ namespace Global.Dynamic
{
public class RealmNavigator : IRealmNavigator
{
private const int MAX_REALM_CHANGE_RETRIES = 3;

private readonly ILoadingScreen loadingScreen;
private readonly IMapRenderer mapRenderer;
private readonly IGlobalRealmController realmController;
Expand All @@ -49,7 +51,8 @@ public class RealmNavigator : IRealmNavigator
private readonly ObjectProxy<Entity> cameraEntity;
private readonly CameraSamplingData cameraSamplingData;

private URLDomain? CurrentRealm;
private URLDomain currentRealm;
private Vector2Int currentParcel;

public event Action<bool>? RealmChanged;

Expand Down Expand Up @@ -107,7 +110,7 @@ public RealmNavigator(

public bool CheckIsNewRealm(URLDomain realm)
{
if (realm == CurrentRealm || realm == realmController.RealmData.Ipfs.CatalystBaseUrl)
if (realm == currentRealm || realm == realmController.RealmData.Ipfs.CatalystBaseUrl)
return false;

return true;
Expand All @@ -126,6 +129,8 @@ public async UniTask<Result> TryChangeRealmAsync(URLDomain realm, CancellationTo
Vector2Int parcelToTeleport = default)
{
ct.ThrowIfCancellationRequested();

currentRealm = realmController.RealmData.Ipfs.CatalystBaseUrl;
var loadResult
= await loadingScreen.ShowWhileExecuteTaskAsync(DoChangeRealmAsync(realm, parcelToTeleport, ct), ct);

Expand Down Expand Up @@ -154,6 +159,41 @@ private Func<AsyncLoadProcessReport, UniTask<Result>> DoChangeRealmAsync(URLDoma
CurrentDestinationRealm = realm,
ParentReport = parentLoadReport
};

for (int attempt = 0; attempt < MAX_REALM_CHANGE_RETRIES; attempt++)
{
bool success = true;
foreach (var realmChangeOperation in realmChangeOperations)
{
try
{
var currentOperationResult = await realmChangeOperation.ExecuteAsync(teleportParams, ct);
if (!currentOperationResult.Success)
{
success = false;
ReportHub.LogError(ReportCategory.REALM, $"Operation failed on realm change attempt {attempt + 1}: {currentOperationResult.ErrorMessage}");
break;
}
}
catch (Exception e)
{
success = false;
ReportHub.LogError(ReportCategory.REALM, $"Unhandled exception on realm change attempt {attempt + 1}: {e}");
break;
}
}

if (success)
{
return Result.SuccessResult();
}
}

// All retries failed, try with the previous realm and parcel
ReportHub.LogWarning(ReportCategory.REALM, "All attempts failed. Trying with previous realm and parcel.");
teleportParams.CurrentDestinationRealm = currentRealm;
teleportParams.CurrentDestinationParcel = currentParcel;

foreach (var realmChangeOperation in realmChangeOperations)
{
try
Expand All @@ -172,7 +212,7 @@ private Func<AsyncLoadProcessReport, UniTask<Result>> DoChangeRealmAsync(URLDoma
}
}

return Result.SuccessResult();
return Result.ErrorResult("Change realm failed, returned to previous realm");
};
}

Expand Down Expand Up @@ -308,7 +348,7 @@ private async UniTask<UniTask> TeleportToWorldSpawnPointAsync(Vector2Int parcelT
public async UniTask ChangeRealmAsync(URLDomain realm, CancellationToken ct)
{
await realmController.SetRealmAsync(realm, ct);
CurrentRealm = realm;
currentRealm = realm;
await SwitchMiscVisibilityAsync();
}

Expand Down
Loading