Skip to content

Commit e49e90c

Browse files
committed
parse redis config ending in k,kb,m,mb,g,gb
1 parent 7494848 commit e49e90c

File tree

3 files changed

+186
-0
lines changed

3 files changed

+186
-0
lines changed

pkg/redisutil/admin.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ import (
88
"time"
99

1010
"github.com/go-logr/logr"
11+
12+
"github.com/ucloud/redis-cluster-operator/pkg/utils"
1113
)
1214

1315
const (
@@ -333,6 +335,24 @@ func (a *Admin) GetAllConfig(c IClient, addr string) (map[string]string, error)
333335
return raw, nil
334336
}
335337

338+
var parseConfigMap = map[string]int8{
339+
"maxmemory": 0,
340+
"proto-max-bulk-len": 0,
341+
"client-query-buffer-limit": 0,
342+
"repl-backlog-size": 0,
343+
"auto-aof-rewrite-min-size": 0,
344+
"active-defrag-ignore-bytes": 0,
345+
"hash-max-ziplist-entries": 0,
346+
"hash-max-ziplist-value": 0,
347+
"stream-node-max-bytes": 0,
348+
"set-max-intset-entries": 0,
349+
"zset-max-ziplist-entries": 0,
350+
"zset-max-ziplist-value": 0,
351+
"hll-sparse-max-bytes": 0,
352+
// TODO parse client-output-buffer-limit
353+
//"client-output-buffer-limit": 0,
354+
}
355+
336356
// SetConfigIfNeed set redis config
337357
func (a *Admin) SetConfigIfNeed(newConfig map[string]string) error {
338358
for addr, c := range a.Connections().GetAll() {
@@ -342,6 +362,14 @@ func (a *Admin) SetConfigIfNeed(newConfig map[string]string) error {
342362
}
343363

344364
for key, value := range newConfig {
365+
var err error
366+
if _, ok := parseConfigMap[key]; ok {
367+
value, err = utils.ParseRedisMemConf(value)
368+
if err != nil {
369+
a.log.Error(err, "redis config format err", "key", key, "value", value)
370+
continue
371+
}
372+
}
345373
if value != oldConfig[key] {
346374
a.log.V(3).Info("CONFIG SET", key, value)
347375
resp := c.Cmd("CONFIG", "SET", key, value)

pkg/utils/parse.go

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package utils
2+
3+
import (
4+
"strconv"
5+
"strings"
6+
)
7+
8+
func ParseRedisMemConf(p string) (string, error) {
9+
var mul int64 = 1
10+
u := strings.ToLower(p)
11+
digits := u
12+
13+
if strings.HasSuffix(u, "k") {
14+
digits = u[:len(u)-len("k")]
15+
mul = 1000
16+
} else if strings.HasSuffix(u, "kb") {
17+
digits = u[:len(u)-len("kb")]
18+
mul = 1024
19+
} else if strings.HasSuffix(u, "m") {
20+
digits = u[:len(u)-len("m")]
21+
mul = 1000 * 1000
22+
} else if strings.HasSuffix(u, "mb") {
23+
digits = u[:len(u)-len("mb")]
24+
mul = 1024 * 1024
25+
} else if strings.HasSuffix(u, "g") {
26+
digits = u[:len(u)-len("g")]
27+
mul = 1000 * 1000 * 1000
28+
} else if strings.HasSuffix(u, "gb") {
29+
digits = u[:len(u)-len("gb")]
30+
mul = 1024 * 1024 * 1024
31+
} else if strings.HasSuffix(u, "b") {
32+
digits = u[:len(u)-len("b")]
33+
mul = 1
34+
}
35+
36+
val, err := strconv.ParseInt(digits, 10, 64)
37+
if err != nil {
38+
return "", err
39+
}
40+
41+
return strconv.FormatInt(val*mul, 10), nil
42+
}

pkg/utils/parse_test.go

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
package utils
2+
3+
import "testing"
4+
5+
func TestParseRedisMemConf(t *testing.T) {
6+
type args struct {
7+
p string
8+
}
9+
tests := []struct {
10+
name string
11+
args args
12+
want string
13+
wantErr bool
14+
}{
15+
{
16+
name: "b",
17+
args: args{
18+
p: "12b",
19+
},
20+
want: "12",
21+
wantErr: false,
22+
},
23+
{
24+
name: "digit",
25+
args: args{
26+
p: "1202",
27+
},
28+
want: "1202",
29+
wantErr: false,
30+
},
31+
{
32+
name: "B",
33+
args: args{
34+
p: "12B",
35+
},
36+
want: "12",
37+
wantErr: false,
38+
},
39+
{
40+
name: "k",
41+
args: args{
42+
p: "12k",
43+
},
44+
want: "12000",
45+
wantErr: false,
46+
},
47+
{
48+
name: "kk",
49+
args: args{
50+
p: "12kk",
51+
},
52+
want: "",
53+
wantErr: true,
54+
},
55+
{
56+
name: "kb",
57+
args: args{
58+
p: "12kb",
59+
},
60+
want: "12288",
61+
wantErr: false,
62+
},
63+
{
64+
name: "Kb",
65+
args: args{
66+
p: "12Kb",
67+
},
68+
want: "12288",
69+
wantErr: false,
70+
},
71+
{
72+
name: "m",
73+
args: args{
74+
p: "12m",
75+
},
76+
want: "12000000",
77+
wantErr: false,
78+
},
79+
{
80+
name: "mB",
81+
args: args{
82+
p: "12mb",
83+
},
84+
want: "12582912",
85+
wantErr: false,
86+
},
87+
{
88+
name: "g",
89+
args: args{
90+
p: "12g",
91+
},
92+
want: "12000000000",
93+
wantErr: false,
94+
},
95+
{
96+
name: "gb",
97+
args: args{
98+
p: "12gb",
99+
},
100+
want: "12884901888",
101+
wantErr: false,
102+
},
103+
}
104+
for _, tt := range tests {
105+
t.Run(tt.name, func(t *testing.T) {
106+
got, err := ParseRedisMemConf(tt.args.p)
107+
if (err != nil) != tt.wantErr {
108+
t.Errorf("ParseRedisMemConf() error = %v, wantErr %v", err, tt.wantErr)
109+
return
110+
}
111+
if got != tt.want {
112+
t.Errorf("ParseRedisMemConf() got = %v, want %v", got, tt.want)
113+
}
114+
})
115+
}
116+
}

0 commit comments

Comments
 (0)