fix(review): resolve deferred code-review findings; S7.Cli verdict, browser CP release, MemberLeft/Exited/Downed, Sql Detach hoist (#625)
Claude-Session: https://claude.ai/code/session_01Ef2ozxS7QPanGT8uoATbTe
This commit is contained in:
@@ -158,15 +158,35 @@ public sealed class ClusterRoleInfo : IClusterRoleInfo, IDisposable
|
||||
set.Add(up.Member);
|
||||
}
|
||||
break;
|
||||
// Cluster-002: a leaving / exiting / downed member is no longer a usable member, so
|
||||
// drop it as soon as that transition lands rather than waiting for MemberRemoved
|
||||
// (several seconds later). MembersWithRole now has a production caller (the
|
||||
// historization scope-peer check), which must not defer to a departing partner.
|
||||
// Member equality is by UniqueAddress, so the status change does not matter here.
|
||||
case ClusterEvent.MemberLeft left:
|
||||
RemoveMember(left.Member);
|
||||
break;
|
||||
case ClusterEvent.MemberExited exited:
|
||||
RemoveMember(exited.Member);
|
||||
break;
|
||||
case ClusterEvent.MemberDowned downed:
|
||||
RemoveMember(downed.Member);
|
||||
break;
|
||||
case ClusterEvent.MemberRemoved removed:
|
||||
foreach (var role in removed.Member.Roles)
|
||||
if (_membersByRole.TryGetValue(role, out var set))
|
||||
set.Remove(removed.Member);
|
||||
RemoveMember(removed.Member);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Caller holds _lock.
|
||||
private void RemoveMember(Member member)
|
||||
{
|
||||
foreach (var role in member.Roles)
|
||||
if (_membersByRole.TryGetValue(role, out var set))
|
||||
set.Remove(member);
|
||||
}
|
||||
|
||||
/// <summary>Handles a role leader change event.</summary>
|
||||
/// <param name="evt">The role leader changed event from the cluster.</param>
|
||||
internal void HandleRoleLeaderChanged(ClusterEvent.RoleLeaderChanged evt)
|
||||
|
||||
Reference in New Issue
Block a user