Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Replace String concat with StringBuilder in Cluster Nodes #994

Merged
merged 13 commits into from
Mar 7, 2025
Merged
60 changes: 34 additions & 26 deletions libs/cluster/Server/ClusterConfig.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
using System.Diagnostics;
using Microsoft.Extensions.Logging;
using System.Net;
using System.Text;

namespace Garnet.cluster
{
Expand Down Expand Up @@ -489,14 +490,14 @@ public IPEndPoint GetEndpointFromNodeId(string nodeid)
/// <returns>Formatted string.</returns>
public string GetClusterInfo(ClusterProvider clusterProvider)
{
var nodes = "";
var nodesStringBuilder = new StringBuilder();
for (ushort i = 1; i <= NumWorkers; i++)
{
var info = default(ConnectionInfo);
_ = clusterProvider?.clusterManager?.GetConnectionInfo(workers[i].Nodeid, out info);
nodes += GetNodeInfo(i, info);
GetNodeInfo(i, info, nodesStringBuilder);
}
return nodes;
return nodesStringBuilder.ToString();
}

/// <summary>
Expand All @@ -516,24 +517,33 @@ public string GetNodeInfo(ushort workerId, ConnectionInfo info)
//<config-epoch>
//<link-state>
//<slot> <slot> ... <slot>
var nodeInfoStringBuilder = new StringBuilder();
GetNodeInfo(workerId, info, nodeInfoStringBuilder);
return nodeInfoStringBuilder.ToString();
}

return $"{workers[workerId].Nodeid} " +
$"{workers[workerId].Address}:{workers[workerId].Port}@{workers[workerId].Port + 10000},{workers[workerId].hostname} " +
$"{(workerId == 1 ? "myself," : "")}{(workers[workerId].Role == NodeRole.PRIMARY ? "master" : "slave")} " +
$"{(workers[workerId].Role == NodeRole.REPLICA ? workers[workerId].ReplicaOfNodeId : "-")} " +
$"{info.ping} " +
$"{info.pong} " +
$"{workers[workerId].ConfigEpoch} " +
$"{(info.connected || workerId == 1 ? "connected" : "disconnected")}" +
$"{GetSlotRange(workerId)}" +
$"{GetSpecialStates(workerId)}\n";
private void GetNodeInfo(ushort workerId, ConnectionInfo info, StringBuilder nodeInfoStringBuilder)
{
_ = nodeInfoStringBuilder
.Append(workers[workerId].Nodeid).Append(' ')
.Append(workers[workerId].Address).Append(':').Append(workers[workerId].Port)
.Append('@').Append(workers[workerId].Port + 10000).Append(',').Append(workers[workerId].hostname).Append(' ')
.Append(workerId == 1 ? "myself," : "")
.Append(workers[workerId].Role == NodeRole.PRIMARY ? "master" : "slave").Append(' ')
.Append(workers[workerId].Role == NodeRole.REPLICA ? workers[workerId].ReplicaOfNodeId : '-').Append(' ')
.Append(info.ping).Append(' ')
.Append(info.pong).Append(' ')
.Append(workers[workerId].ConfigEpoch).Append(' ')
.Append(info.connected || workerId == 1 ? "connected" : "disconnected");
AppendSlotRange(nodeInfoStringBuilder, workerId);
AppendSpecialStates(nodeInfoStringBuilder, workerId);
_ = nodeInfoStringBuilder.Append('\n');
}

private string GetSpecialStates(ushort workerId)
private void AppendSpecialStates(StringBuilder stringBuilder, uint workerId)
{
// Only print special states for local node
if (workerId != 1) return "";
var specialStates = "";
if (workerId != 1) return;
for (var slot = 0; slot < slotMap.Length; slot++)
{
var _workerId = slotMap[slot]._workerId;
Expand All @@ -545,14 +555,14 @@ private string GetSpecialStates(ushort workerId)
var _nodeId = workers[_workerId].Nodeid;
if (_nodeId == null) continue;

specialStates += _state switch
stringBuilder.Append(_state switch
{
SlotState.MIGRATING => $" [{slot}->-{_nodeId}]",
SlotState.IMPORTING => $" [{slot}-<-{_nodeId}]",
_ => ""
};
});
}
return specialStates;
return;
}

/// <summary>
Expand Down Expand Up @@ -721,9 +731,8 @@ public string GetSlotsInfo()
return completeSlotInfo;
}

private string GetSlotRange(ushort workerId)
private void AppendSlotRange(StringBuilder stringBuilder, uint workerId)
{
string result = "";
ushort start = ushort.MaxValue, end = 0;
for (ushort i = 0; i < MAX_HASH_SLOT_VALUE; i++)
{
Expand All @@ -736,19 +745,18 @@ private string GetSlotRange(ushort workerId)
{
if (start != ushort.MaxValue)
{
if (end == start) result += $" {start}";
else result += $" {start}-{end}";
if (end == start) stringBuilder.Append($" {start}");
else stringBuilder.Append($" {start}-{end}");
start = ushort.MaxValue;
end = 0;
}
}
}
if (start != ushort.MaxValue)
{
if (end == start) result += $" {start}";
else result += $" {start}-{end}";
if (end == start) stringBuilder.Append($" {start}");
else stringBuilder.Append($" {start}-{end}");
}
return result;
}

/// <summary>
Expand Down