Skip to content

Commit ffec237

Browse files
authored
Merge pull request #144 from tair-opensource/codex/fix-cluster-node-role-parsing
fix: correctly parse cluster role flags with nofailover
2 parents fd5c1d5 + 87c705f commit ffec237

2 files changed

Lines changed: 49 additions & 13 deletions

File tree

src/full_check/common/command.go

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -67,19 +67,16 @@ func ParseClusterNode(content []byte) []*ClusterNodeInfo {
6767
continue
6868
}
6969

70-
items := bytes.Split(line, []byte(" "))
70+
items := bytes.Fields(line)
71+
if len(items) < 8 {
72+
continue
73+
}
7174

7275
address := bytes.Split(items[1], []byte{'@'})
73-
flag := bytes.Split(items[2], []byte{','})
74-
var role string
75-
if len(flag) > 1 {
76-
role = string(flag[1])
77-
} else {
78-
role = string(flag[0])
79-
}
76+
role := parseClusterNodeRole(items[2])
8077
var slot string
81-
if len(items) > 7 {
82-
slot = string(items[7])
78+
if len(items) > 8 {
79+
slot = string(items[8])
8380
}
8481
ret = append(ret, &ClusterNodeInfo{
8582
Id: string(items[0]),
@@ -96,13 +93,27 @@ func ParseClusterNode(content []byte) []*ClusterNodeInfo {
9693
return ret
9794
}
9895

96+
func parseClusterNodeRole(flags []byte) string {
97+
parts := bytes.Split(flags, []byte{','})
98+
for _, part := range parts {
99+
if bytes.Equal(part, []byte(TypeMaster)) || bytes.Equal(part, []byte(TypeSlave)) {
100+
return string(part)
101+
}
102+
}
103+
104+
if len(parts) > 0 {
105+
return string(parts[0])
106+
}
107+
return ""
108+
}
109+
99110
// needMaster: true(master), false(slave)
100111
func ClusterNodeChoose(input []*ClusterNodeInfo, role string) []*ClusterNodeInfo {
101112
ret := make([]*ClusterNodeInfo, 0, len(input))
102113
for _, ele := range input {
103114
if ele.Flags == TypeMaster && role == TypeMaster ||
104-
ele.Flags == TypeSlave && role == TypeSlave ||
105-
role == TypeAll {
115+
ele.Flags == TypeSlave && role == TypeSlave ||
116+
role == TypeAll {
106117
ret = append(ret, ele)
107118
}
108119
}
@@ -154,4 +165,4 @@ func CompareUnorderedList(a, b []string) bool {
154165
}
155166

156167
return true
157-
}
168+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package common
2+
3+
import "testing"
4+
5+
func TestParseClusterNodeRole(t *testing.T) {
6+
content := []byte("" +
7+
"node1 11.0.0.1:6379@16379 master,nofailover - 0 1 1 connected 0-2047\n" +
8+
"node2 11.0.0.2:6379@16379 myself,master,nofailover - 0 1 2 connected 2048-4095\n" +
9+
"node3 11.0.0.3:6379@16379 slave,node1 - 0 1 3 connected\n")
10+
11+
nodes := ParseClusterNode(content)
12+
if len(nodes) != 3 {
13+
t.Fatalf("expected 3 nodes, got %d", len(nodes))
14+
}
15+
16+
if nodes[0].Flags != TypeMaster {
17+
t.Fatalf("expected first node role %q, got %q", TypeMaster, nodes[0].Flags)
18+
}
19+
if nodes[1].Flags != TypeMaster {
20+
t.Fatalf("expected second node role %q, got %q", TypeMaster, nodes[1].Flags)
21+
}
22+
if nodes[2].Flags != TypeSlave {
23+
t.Fatalf("expected third node role %q, got %q", TypeSlave, nodes[2].Flags)
24+
}
25+
}

0 commit comments

Comments
 (0)