1010
1111namespace Proto . Cluster ;
1212
13- //TODO clear _actorCounts for members not in memberlist
1413public 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