Skip to content

Commit 37c7e9e

Browse files
committed
Fixes #1429 for 6.x
See #1431 * Modify test program to demonstrate the issue * Fix underlying issue by allowing multiple Register calls for the same instance of ICredentialsProvider
1 parent 70de0eb commit 37c7e9e

File tree

3 files changed

+32
-22
lines changed

3 files changed

+32
-22
lines changed

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

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
//---------------------------------------------------------------------------
3131

3232
using System;
33-
using System.Collections.Generic;
33+
using System.Collections.Concurrent;
3434
using System.Diagnostics.Tracing;
3535
using System.Timers;
3636

@@ -59,11 +59,13 @@ public class TimerBasedCredentialRefresherEventSource : EventSource
5959
public void TriggeredTimer(string name) => WriteEvent(4, "TriggeredTimer", name);
6060
[Event(5)]
6161
public void RefreshedCredentials(string name, bool succesfully) => WriteEvent(5, "RefreshedCredentials", name, succesfully);
62+
[Event(6)]
63+
public void AlreadyRegistered(string name) => WriteEvent(6, "AlreadyRegistered", name);
6264
}
6365

6466
public class TimerBasedCredentialRefresher : ICredentialsRefresher
6567
{
66-
private Dictionary<ICredentialsProvider, Timer> _registrations = new Dictionary<ICredentialsProvider, Timer>();
68+
private readonly ConcurrentDictionary<ICredentialsProvider, Timer> _registrations = new ConcurrentDictionary<ICredentialsProvider, Timer>();
6769

6870
public ICredentialsProvider Register(ICredentialsProvider provider, NotifyCredentialRefreshed callback)
6971
{
@@ -72,8 +74,15 @@ public ICredentialsProvider Register(ICredentialsProvider provider, NotifyCreden
7274
return provider;
7375
}
7476

75-
_registrations.Add(provider, scheduleTimer(provider, callback));
76-
TimerBasedCredentialRefresherEventSource.Log.Registered(provider.Name);
77+
if (_registrations.TryAdd(provider, scheduleTimer(provider, callback)))
78+
{
79+
TimerBasedCredentialRefresherEventSource.Log.Registered(provider.Name);
80+
}
81+
else
82+
{
83+
TimerBasedCredentialRefresherEventSource.Log.AlreadyRegistered(provider.Name);
84+
}
85+
7786
return provider;
7887
}
7988

@@ -84,12 +93,12 @@ public bool Unregister(ICredentialsProvider provider)
8493
return false;
8594
}
8695

87-
var timer = _registrations[provider];
96+
Timer timer = _registrations[provider];
8897
if (timer != null)
8998
{
9099
TimerBasedCredentialRefresherEventSource.Log.Unregistered(provider.Name);
91100
timer.Stop();
92-
_registrations.Remove(provider);
101+
_registrations.TryRemove(provider, out _);
93102
timer.Dispose();
94103
return true;
95104
}

projects/TestApplications/OAuth2/Program.cs

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -44,26 +44,25 @@ public static void Main(string[] args)
4444
CredentialsRefresher = GetCredentialsRefresher()
4545
};
4646

47-
using (IConnection connection = connectionFactory.CreateConnection())
47+
using IConnection publishConnection = connectionFactory.CreateConnection();
48+
using IConnection consumingConnection = connectionFactory.CreateConnection();
49+
50+
using IModel publisher = declarePublisher(publishConnection);
51+
using IModel subscriber = declareConsumer(consumingConnection);
52+
53+
Publish(publisher);
54+
Consume(subscriber);
55+
56+
if (oauth2Options.TokenExpiresInSeconds > 0)
4857
{
49-
using (IModel publisher = declarePublisher(connection))
50-
using (IModel subscriber = declareConsumer(connection))
58+
for (int i = 0; i < 4; i++)
5159
{
60+
Console.WriteLine("Wait until Token expires. Attempt #" + (i + 1));
61+
Thread.Sleep((oauth2Options.TokenExpiresInSeconds + 10) * 1000);
62+
Console.WriteLine("Resuming ..");
5263
Publish(publisher);
64+
_doneEvent.Reset();
5365
Consume(subscriber);
54-
55-
if (oauth2Options.TokenExpiresInSeconds > 0)
56-
{
57-
for (int i = 0; i < 4; i++)
58-
{
59-
Console.WriteLine("Wait until Token expires. Attempt #" + (i + 1));
60-
Thread.Sleep((oauth2Options.TokenExpiresInSeconds + 10) * 1000);
61-
Console.WriteLine("Resuming ..");
62-
Publish(publisher);
63-
_doneEvent.Reset();
64-
Consume(subscriber);
65-
}
66-
}
6766
}
6867
}
6968
}

projects/Unit/APIApproval.Approve.verified.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -671,6 +671,8 @@ namespace RabbitMQ.Client
671671
{
672672
public TimerBasedCredentialRefresherEventSource() { }
673673
public static RabbitMQ.Client.TimerBasedCredentialRefresherEventSource Log { get; }
674+
[System.Diagnostics.Tracing.Event(6)]
675+
public void AlreadyRegistered(string name) { }
674676
[System.Diagnostics.Tracing.Event(5)]
675677
public void RefreshedCredentials(string name, bool succesfully) { }
676678
[System.Diagnostics.Tracing.Event(1)]

0 commit comments

Comments
 (0)