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:
Joseph Doherty
2026-10-08 06:59:53 -04:00
parent 3baa332d6b
commit 3fb6549209
22 changed files with 423 additions and 88 deletions
@@ -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)