Files
natsdotnet/src/NATS.Server/Raft/RaftMembership.cs
Joseph Doherty 5de4962bd3 Improve docs coverage and refresh profiling parser artifacts
Add domain-specific XML documentation across src server components to satisfy CommentChecker, and update dotTrace parsing outputs used for diagnostics.
2026-03-14 04:06:04 -04:00

51 lines
1.7 KiB
C#

namespace NATS.Server.Raft;
/// <summary>
/// Type of membership change operation.
/// Go reference: raft.go:2500-2600 (ProposeAddPeer/RemovePeer)
/// </summary>
public enum RaftMembershipChangeType
{
AddPeer,
RemovePeer,
}
/// <summary>
/// Represents a pending RAFT membership change (add or remove peer).
/// Serialized as "{Type}:{PeerId}" in log entry commands for wire compatibility.
/// Go reference: raft.go:2500-2600 (membership change proposals)
/// </summary>
public readonly record struct RaftMembershipChange(RaftMembershipChangeType Type, string PeerId)
{
/// <summary>
/// Encodes this membership change as a log entry command string.
/// Format: "AddPeer:node-id" or "RemovePeer:node-id"
/// </summary>
public string ToCommand() => $"{Type}:{PeerId}";
/// <summary>
/// Parses a log entry command string back into a membership change.
/// Returns null if the command is not a membership change.
/// </summary>
/// <param name="command">Serialized membership command from a replicated RAFT log entry.</param>
public static RaftMembershipChange? TryParse(string command)
{
var colonIndex = command.IndexOf(':');
if (colonIndex < 0)
return null;
var typePart = command[..colonIndex];
var peerPart = command[(colonIndex + 1)..];
if (string.IsNullOrEmpty(peerPart))
return null;
return typePart switch
{
nameof(RaftMembershipChangeType.AddPeer) => new RaftMembershipChange(RaftMembershipChangeType.AddPeer, peerPart),
nameof(RaftMembershipChangeType.RemovePeer) => new RaftMembershipChange(RaftMembershipChangeType.RemovePeer, peerPart),
_ => null,
};
}
}