in src/TriggersBinding/MySqlTableChangeMonitor.cs [384:438]
private async void RunLeaseRenewalLoopAsync()
{
this._logger.LogDebug("Starting lease renewal loop.");
try
{
CancellationToken token = this._cancellationTokenSourceRenewLeases.Token;
using (var connection = new MySqlConnection(this._connectionString))
{
await connection.OpenAsync(token);
bool forceReconnect = false;
while (!token.IsCancellationRequested)
{
bool isConnected = await connection.TryEnsureConnected(forceReconnect, this._logger, "LeaseRenewalLoopConnection", token);
if (!isConnected)
{
// If we couldn't reconnect then wait our delay and try again
await Task.Delay(TimeSpan.FromSeconds(LeaseRenewalIntervalInSeconds), token);
continue;
}
else
{
forceReconnect = false;
}
try
{
await this.RenewLeasesAsync(connection, token);
}
catch (Exception e) when (e.IsDeadlockException() || /*e.IsFatalSqlException() || */connection.IsBrokenOrClosed())
{
// Retry connection if there was a fatal MySQL exception or something else caused the connection to be closed
// since that indicates some other issue occurred (such as dropped network) and may be able to be recovered
forceReconnect = true;
}
await Task.Delay(TimeSpan.FromSeconds(LeaseRenewalIntervalInSeconds), token);
}
}
}
catch (Exception e)
{
// Only want to log the exception if it wasn't caused by StopAsync being called, since Task.Delay throws
// an exception if it's cancelled.
if (e.GetType() != typeof(TaskCanceledException))
{
this._logger.LogError($"Exiting lease renewal loop due to exception: {e.GetType()}. Exception message: {e.Message}");
}
}
finally
{
this._cancellationTokenSourceRenewLeases.Dispose();
}
}