Skip to content

Commit 227131e

Browse files
committed
add redis test and fix bug
1 parent e4cda25 commit 227131e

File tree

2 files changed

+34
-14
lines changed

2 files changed

+34
-14
lines changed

src/SignalR/server/StackExchangeRedis/src/RedisHubLifetimeManager.cs

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -254,35 +254,31 @@ public override Task SendConnectionsAsync(IReadOnlyList<string> connectionIds, s
254254
}
255255

256256
/// <inheritdoc />
257-
public override Task SendGroupsAsync(IReadOnlyList<string> groupNames, string methodName, object?[] args, CancellationToken cancellationToken = default)
257+
public override async Task SendGroupsAsync(IReadOnlyList<string> groupNames, string methodName, object?[] args, CancellationToken cancellationToken = default)
258258
{
259259
ArgumentNullException.ThrowIfNull(groupNames);
260-
var publishTasks = new List<Task>(groupNames.Count);
261-
var payload = _protocol.WriteInvocation(methodName, args);
262260
var connections = new HashSet<string>();
263261

264262
foreach (var groupName in groupNames)
265263
{
266264
if (!string.IsNullOrEmpty(groupName))
267265
{
268-
var connectionStore = _groups.GetStore(groupName);
269-
if (connectionStore != null)
266+
var groupChannel = _channels.Group(groupName);
267+
if (groupChannel != null)
270268
{
271-
foreach (var connection in connectionStore)
269+
var connectionStore = _groups.GetStore(groupChannel);
270+
if (connectionStore != null)
272271
{
273-
connections.Add(connection.ConnectionId);
272+
foreach (var connection in connectionStore)
273+
{
274+
connections.Add(connection.ConnectionId);
275+
}
274276
}
275277
}
276278
}
277279
}
278280

279-
// Send to unique connections
280-
foreach (var connectionId in connections)
281-
{
282-
publishTasks.Add(PublishAsync(_channels.Connection(connectionId), payload));
283-
}
284-
285-
return Task.WhenAll(publishTasks);
281+
await SendConnectionsAsync(connections.ToList(), methodName, args, cancellationToken);
286282
}
287283

288284
/// <inheritdoc />

src/SignalR/server/StackExchangeRedis/test/RedisHubLifetimeManagerTests.cs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,30 @@ public async Task PatternGroupAndUser()
145145
}
146146
}
147147

148+
[Fact]
149+
public async Task ConnectionInMultipleGroups_ReceivesMessageOnlyOnce()
150+
{
151+
var server = new TestRedisServer();
152+
153+
using (var client = new TestClient())
154+
{
155+
var manager = CreateLifetimeManager(server);
156+
var connection = HubConnectionContextUtils.Create(client.Connection);
157+
158+
await manager.OnConnectedAsync(connection).DefaultTimeout();
159+
await manager.AddToGroupAsync(connection.ConnectionId, "group1").DefaultTimeout();
160+
await manager.AddToGroupAsync(connection.ConnectionId, "group2").DefaultTimeout();
161+
162+
await manager.SendGroupsAsync(new[] { "group1", "group2" }, "Hello", new object[] { "World" }).DefaultTimeout();
163+
164+
var message = Assert.IsType<InvocationMessage>(await client.ReadAsync().DefaultTimeout());
165+
Assert.Equal("Hello", message.Target);
166+
Assert.Single(message.Arguments);
167+
Assert.Equal("World", (string)message.Arguments[0]);
168+
Assert.Null(client.TryRead());
169+
}
170+
}
171+
148172
public override TestRedisServer CreateBackplane()
149173
{
150174
return new TestRedisServer();

0 commit comments

Comments
 (0)