| 47 | } |
| 48 | |
| 49 | func (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 | |