Skip to content

Commit 20e9833

Browse files
MatthiasWerninglukebakken
authored andcommitted
Move actual refresh on timer elapse into non-locked scope to handle await of notification callback
1 parent f5ead9b commit 20e9833

File tree

1 file changed

+19
-19
lines changed

1 file changed

+19
-19
lines changed

projects/RabbitMQ.Client/client/api/ICredentialsRefresher.cs

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -139,40 +139,40 @@ public void ScheduleTimer(ICredentialsProvider provider)
139139
{
140140
if (provider.ValidUntil == null)
141141
{
142-
throw new ArgumentNullException("ValidUntil of " + nameof(provider) + " was null");
142+
throw new ArgumentNullException(nameof(provider.ValidUntil) + " of " + nameof(provider) + " was null");
143143
}
144144
if (_disposed)
145145
{
146-
throw new InvalidOperationException("Registration already disposed");
146+
return;
147147
}
148148

149149
var newTimer = new Timer();
150150
newTimer.Interval = provider.ValidUntil.Value.TotalMilliseconds * (1.0 - 1 / 3.0);
151-
newTimer.Elapsed += (o, e) =>
151+
newTimer.Elapsed += async (o, e) =>
152152
{
153153
TimerBasedCredentialRefresherEventSource.Log.TriggeredTimer(provider.Name);
154154

155155
lock (_lockObj)
156156
{
157-
try
157+
if (_disposed)
158158
{
159-
if (_disposed)
160-
{
161-
// We were waiting and the registration has been disposed in meanwhile
162-
return;
163-
}
164-
165-
provider.Refresh();
166-
ScheduleTimer(provider);
167-
Callback.Invoke(provider.Password != null);
168-
TimerBasedCredentialRefresherEventSource.Log.RefreshedCredentials(provider.Name, true);
169-
}
170-
catch (Exception)
171-
{
172-
Callback.Invoke(false);
173-
TimerBasedCredentialRefresherEventSource.Log.RefreshedCredentials(provider.Name, false);
159+
// We were waiting and the registration has been disposed in meanwhile
160+
return;
174161
}
175162
}
163+
164+
try
165+
{
166+
provider.Refresh();
167+
ScheduleTimer(provider);
168+
await Callback.Invoke(provider.Password != null).ConfigureAwait(false);
169+
TimerBasedCredentialRefresherEventSource.Log.RefreshedCredentials(provider.Name, true);
170+
}
171+
catch (Exception)
172+
{
173+
await Callback.Invoke(false).ConfigureAwait(false);
174+
TimerBasedCredentialRefresherEventSource.Log.RefreshedCredentials(provider.Name, false);
175+
}
176176
};
177177
newTimer.Enabled = true;
178178
newTimer.AutoReset = false;

0 commit comments

Comments
 (0)