Skip to content

Bug: ClusterEvent.MemberRemoved can jump from MemberLeaving without being MemberExited #4948

@Aaronontheweb

Description

@Aaronontheweb

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:

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.

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions