MCPcopy Create free account
hub / github.com/apache/kvrocks-controller / ParseCluster

Function ParseCluster

store/cluster.go:254–321  ·  view source on GitHub ↗

ParseCluster will parse the cluster string into cluster topology.

(clusterStr string)

Source from the content-addressed store, hash-verified

252
253// ParseCluster will parse the cluster string into cluster topology.
254func ParseCluster(clusterStr string) (*Cluster, error) {
255 if len(clusterStr) == 0 {
256 return nil, errors.New("cluster nodes string error")
257 }
258 nodeStrings := strings.Split(clusterStr, "\n")
259 if len(nodeStrings) == 0 {
260 return nil, errors.New("cluster nodes string parser error")
261 }
262
263 var clusterVer int64 = -1
264 var shards Shards
265 slaveNodes := make(map[string][]Node)
266 for _, nodeString := range nodeStrings {
267 fields := strings.Split(nodeString, " ")
268 if len(fields) < 7 {
269 return nil, fmt.Errorf("require at least 7 fields, node info[%s]", nodeString)
270 }
271 node := &ClusterNode{
272 id: fields[0],
273 addr: strings.Split(fields[1], "@")[0],
274 }
275
276 if strings.Contains(fields[2], ",") {
277 node.role = strings.Split(fields[2], ",")[1]
278 } else {
279 node.role = fields[2]
280 }
281
282 var err error
283 clusterVer, err = strconv.ParseInt(fields[6], 10, 64)
284 if err != nil {
285 return nil, fmt.Errorf("node version error, node info[%q]", nodeString)
286 }
287
288 if node.role == RoleMaster {
289 shard := NewShard()
290 shard.Nodes = append(shard.Nodes, node)
291 // remain fields are slot ranges
292 for i := 8; i < len(fields); i++ {
293 slotRange, err := ParseSlotRange(fields[i])
294 if err != nil {
295 return nil, fmt.Errorf("parse slots error for node[%s]: %w", nodeString, err)
296 }
297 shard.SlotRanges = append(shard.SlotRanges, *slotRange)
298 }
299 shards = append(shards, shard)
300 } else if node.role == RoleSlave {
301 slaveNodes[fields[3]] = append(slaveNodes[fields[3]], node)
302 } else {
303 return nil, fmt.Errorf("node role error, node info[%q]", nodeString)
304 }
305 }
306 if clusterVer == -1 {
307 return nil, fmt.Errorf("no cluster version, cluster info[%q]", clusterStr)
308 }
309 sort.Sort(shards)
310 for i := 0; i < len(shards); i++ {
311 masterNode := shards[i].Nodes[0]

Callers 3

parallelProbeNodesMethod · 0.92
ImportMethod · 0.92
TestClusterNodeFunction · 0.85

Calls 5

NewShardFunction · 0.85
ParseSlotRangeFunction · 0.85
ErrorfMethod · 0.80
IDMethod · 0.65
ContainsMethod · 0.45

Tested by 1

TestClusterNodeFunction · 0.68