Skip to content

Commit ae4b50d

Browse files
authored
Cleanup actor counts for departed members (#2186)
1 parent b2c2bb1 commit ae4b50d

File tree

1 file changed

+39
-8
lines changed

1 file changed

+39
-8
lines changed

src/Proto.Cluster/Member/GossipMemberStrategy.cs

Lines changed: 39 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010

1111
namespace Proto.Cluster;
1212

13-
//TODO clear _actorCounts for members not in memberlist
1413
public class GossipMemberStrategy : IMemberStrategy
1514
{
1615
private readonly Cluster _cluster;
@@ -27,26 +26,58 @@ public GossipMemberStrategy(Cluster cluster, string kind)
2726
SubscribeToGossipEvents();
2827
}
2928

30-
private void SubscribeToGossipEvents() => _cluster.System.EventStream.Subscribe<GossipUpdate>(x => x.Key == GossipKeys.Heartbeat, x => {
29+
private void SubscribeToGossipEvents() => _cluster.System.EventStream.Subscribe<GossipUpdate>(x => x.Key == GossipKeys.Heartbeat, x =>
30+
{
31+
var memberId = x.MemberId;
32+
33+
if (!_members.ContainsKey(memberId))
34+
{
35+
_actorCounts.TryRemove(memberId, out _);
36+
return;
37+
}
38+
3139
var heartbeat = x.Value.Unpack<MemberHeartbeat>();
3240
var actorCount = heartbeat.ActorStatistics.ActorCount.Where(m => m.Key == _kind).Select(m => m.Value).FirstOrDefault();
33-
_actorCounts[x.MemberId] = actorCount;
41+
_actorCounts[memberId] = actorCount;
42+
43+
CleanupActorCounts();
3444
}
3545
);
3646

37-
private string GetLeastActorsMember() => _actorCounts
38-
.Where(kvp => _members.ContainsKey(kvp.Key))
39-
.OrderBy(kvp => kvp.Value)
40-
.FirstOrDefault().Key;
47+
private void CleanupActorCounts()
48+
{
49+
foreach (var memberId in _actorCounts.Keys)
50+
{
51+
if (!_members.ContainsKey(memberId))
52+
{
53+
_actorCounts.TryRemove(memberId, out _);
54+
}
55+
}
56+
}
57+
58+
private string GetLeastActorsMember()
59+
{
60+
CleanupActorCounts();
61+
62+
return _actorCounts
63+
.Where(kvp => _members.ContainsKey(kvp.Key))
64+
.OrderBy(kvp => kvp.Value)
65+
.FirstOrDefault().Key;
66+
}
4167

4268
public ImmutableList<Member> GetAllMembers() => _members.Values.ToImmutableList();
4369

44-
public void AddMember(Member member) => _members.TryAdd(member.Id, member);
70+
public void AddMember(Member member)
71+
{
72+
_members.TryAdd(member.Id, member);
73+
CleanupActorCounts();
74+
}
4575

4676
public void RemoveMember(Member member)
4777
{
4878
_actorCounts.TryRemove(member.Id, out _);
4979
_members.TryRemove(member.Id, out _);
80+
CleanupActorCounts();
5081
}
5182

5283
public Member? GetActivator(string senderAddress)

0 commit comments

Comments
 (0)