Net: Change retry logic

rendering
Liza 2023-02-22 21:54:33 +01:00
parent 7bccec0bae
commit dbe6abd1db
1 changed files with 25 additions and 16 deletions

View File

@ -16,17 +16,28 @@ namespace Pal.Client.Net
{ {
internal partial class RemoteApi internal partial class RemoteApi
{ {
private readonly SemaphoreSlim connectLock = new(1, 1); private readonly SemaphoreSlim _connectLock = new(1, 1);
private async Task<(bool Success, string Error)> TryConnect(CancellationToken cancellationToken, private async Task<(bool Success, string Error)> TryConnect(CancellationToken cancellationToken,
ILoggerFactory? loggerFactory = null, bool retry = true) ILoggerFactory? loggerFactory = null, bool retry = true)
{ {
using IDisposable? logScope = _logger.BeginScope("TryConnect"); using IDisposable? logScope = _logger.BeginScope("TryConnect");
var result = await TryConnectImpl(cancellationToken, loggerFactory);
if (retry && result.ShouldRetry)
result = await TryConnectImpl(cancellationToken, loggerFactory);
return (result.Success, result.Error);
}
private async Task<(bool Success, string Error, bool ShouldRetry)> TryConnectImpl(
CancellationToken cancellationToken,
ILoggerFactory? loggerFactory)
{
if (_configuration.Mode != EMode.Online) if (_configuration.Mode != EMode.Online)
{ {
_logger.LogDebug("Not Online, not attempting to establish a connection"); _logger.LogDebug("Not Online, not attempting to establish a connection");
return (false, Localization.ConnectionError_NotOnline); return (false, Localization.ConnectionError_NotOnline, false);
} }
if (_channel == null || if (_channel == null ||
@ -52,7 +63,7 @@ namespace Pal.Client.Net
cancellationToken.ThrowIfCancellationRequested(); cancellationToken.ThrowIfCancellationRequested();
_logger.LogTrace("Acquiring connect lock"); _logger.LogTrace("Acquiring connect lock");
await connectLock.WaitAsync(cancellationToken); await _connectLock.WaitAsync(cancellationToken);
_logger.LogTrace("Obtained connect lock"); _logger.LogTrace("Obtained connect lock");
try try
@ -85,7 +96,8 @@ namespace Pal.Client.Net
} }
return (false, return (false,
string.Format(Localization.ConnectionError_CreateAccountFailed, createAccountReply.Error)); string.Format(Localization.ConnectionError_CreateAccountFailed, createAccountReply.Error),
false);
} }
} }
@ -95,7 +107,7 @@ namespace Pal.Client.Net
if (configuredAccount == null) if (configuredAccount == null)
{ {
_logger.LogWarning("No account to login with"); _logger.LogWarning("No account to login with");
return (false, Localization.ConnectionError_CreateAccountReturnedNoId); return (false, Localization.ConnectionError_CreateAccountReturnedNoId, false);
} }
if (!_loginInfo.IsValid) if (!_loginInfo.IsValid)
@ -133,13 +145,9 @@ namespace Pal.Client.Net
{ {
_configuration.RemoveAccount(RemoteUrl); _configuration.RemoveAccount(RemoteUrl);
_configurationManager.Save(_configuration); _configurationManager.Save(_configuration);
if (retry)
{ _logger.LogInformation("Attempting connection retry without account id");
_logger.LogInformation("Attempting connection retry without account id"); return (false, Localization.ConnectionError_InvalidAccountId, true);
return await TryConnect(cancellationToken, retry: false);
}
else
return (false, Localization.ConnectionError_InvalidAccountId);
} }
if (loginReply.Error == LoginError.UpgradeRequired && !_warnedAboutUpgrade) if (loginReply.Error == LoginError.UpgradeRequired && !_warnedAboutUpgrade)
@ -148,7 +156,8 @@ namespace Pal.Client.Net
_warnedAboutUpgrade = true; _warnedAboutUpgrade = true;
} }
return (false, string.Format(Localization.ConnectionError_LoginFailed, loginReply.Error)); return (false, string.Format(Localization.ConnectionError_LoginFailed, loginReply.Error),
false);
} }
} }
@ -156,16 +165,16 @@ namespace Pal.Client.Net
{ {
_logger.LogError("Login state is loggedIn={LoggedIn}, expired={Expired}", _loginInfo.IsLoggedIn, _logger.LogError("Login state is loggedIn={LoggedIn}, expired={Expired}", _loginInfo.IsLoggedIn,
_loginInfo.IsExpired); _loginInfo.IsExpired);
return (false, Localization.ConnectionError_LoginReturnedNoToken); return (false, Localization.ConnectionError_LoginReturnedNoToken, false);
} }
cancellationToken.ThrowIfCancellationRequested(); cancellationToken.ThrowIfCancellationRequested();
return (true, string.Empty); return (true, string.Empty, false);
} }
finally finally
{ {
_logger.LogTrace("Releasing connectLock"); _logger.LogTrace("Releasing connectLock");
connectLock.Release(); _connectLock.Release();
} }
} }