MCPcopy
hub / github.com/CodisLabs/codis / RefreshRedisStats

Method RefreshRedisStats

pkg/topom/topom_stats.go:49–105  ·  view source on GitHub ↗
(timeout time.Duration)

Source from the content-addressed store, hash-verified

47}
48
49func (s *Topom) RefreshRedisStats(timeout time.Duration) (*sync2.Future, error) {
50 s.mu.Lock()
51 defer s.mu.Unlock()
52 ctx, err := s.newContext()
53 if err != nil {
54 return nil, err
55 }
56 var fut sync2.Future
57 goStats := func(addr string, do func(addr string) (*RedisStats, error)) {
58 fut.Add()
59 go func() {
60 stats := s.newRedisStats(addr, timeout, do)
61 stats.UnixTime = time.Now().Unix()
62 fut.Done(addr, stats)
63 }()
64 }
65 for _, g := range ctx.group {
66 for _, x := range g.Servers {
67 goStats(x.Addr, func(addr string) (*RedisStats, error) {
68 m, err := s.stats.redisp.InfoFull(addr)
69 if err != nil {
70 return nil, err
71 }
72 return &RedisStats{Stats: m}, nil
73 })
74 }
75 }
76 for _, server := range ctx.sentinel.Servers {
77 goStats(server, func(addr string) (*RedisStats, error) {
78 c, err := s.ha.redisp.GetClient(addr)
79 if err != nil {
80 return nil, err
81 }
82 defer s.ha.redisp.PutClient(c, err)
83 m, err := c.Info()
84 if err != nil {
85 return nil, err
86 }
87 sentinel := redis.NewSentinel(s.config.ProductName, s.config.ProductAuth)
88 p, err := sentinel.MastersAndSlavesClient(c)
89 if err != nil {
90 return nil, err
91 }
92 return &RedisStats{Stats: m, Sentinel: p}, nil
93 })
94 }
95 go func() {
96 stats := make(map[string]*RedisStats)
97 for k, v := range fut.Wait() {
98 stats[k] = v.(*RedisStats)
99 }
100 s.mu.Lock()
101 defer s.mu.Unlock()
102 s.stats.servers = stats
103 }()
104 return &fut, nil
105}
106

Callers 2

StartMethod · 0.95
TestRedisStatsFunction · 0.80

Calls 10

newContextMethod · 0.95
AddMethod · 0.95
newRedisStatsMethod · 0.95
DoneMethod · 0.95
WaitMethod · 0.95
GetClientMethod · 0.80
PutClientMethod · 0.80
InfoFullMethod · 0.45
InfoMethod · 0.45

Tested by 1

TestRedisStatsFunction · 0.64