-
Notifications
You must be signed in to change notification settings - Fork 1.1k
Closed
Description
Version: Akka.NET v1.4.18
Based on some build log failures detected in PR #4946
Akka.Cluster.Tests.ClusterSpec.A_cluster_must_leave_via_CoordinatedShutdownRun_when_member_status_is_Joining
Expected removed.PreviousStatus to equal MemberStatus.Exiting(3) by value, but found MemberStatus.Leaving(2).
This isn't legal according to the member transition spec - issue occurs here:
akka.net/src/core/Akka.Cluster/ClusterEvent.cs
Lines 880 to 903 in 65e5a22
internal static ImmutableList<IMemberEvent> DiffMemberEvents(Gossip oldGossip, Gossip newGossip) | |
{ | |
if (newGossip.Equals(oldGossip)) | |
{ | |
return ImmutableList<IMemberEvent>.Empty; | |
} | |
var newMembers = newGossip.Members.Except(oldGossip.Members); | |
var membersGroupedByAddress = newGossip.Members | |
.Concat(oldGossip.Members) | |
.GroupBy(m => m.UniqueAddress); | |
var changedMembers = membersGroupedByAddress | |
.Where(g => g.Count() == 2 | |
&& (g.First().Status != g.Skip(1).First().Status | |
|| g.First().UpNumber != g.Skip(1).First().UpNumber)) | |
.Select(g => g.First()); | |
var memberEvents = CollectMemberEvents(newMembers.Union(changedMembers)); | |
var removedMembers = oldGossip.Members.Except(newGossip.Members); | |
var removedEvents = removedMembers.Select(m => new MemberRemoved(m.Copy(status: MemberStatus.Removed), m.Status)); | |
return memberEvents.Concat(removedEvents).ToImmutableList(); | |
} |
Going to need to see if we can reproduce this with a simple use case, as this is definitely a gossip propagation / merging / diffing bug.