export_test.go 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. package redis
  2. import (
  3. "fmt"
  4. "net"
  5. "strings"
  6. "github.com/go-redis/redis/v7/internal/hashtag"
  7. "github.com/go-redis/redis/v7/internal/pool"
  8. )
  9. func (c *baseClient) Pool() pool.Pooler {
  10. return c.connPool
  11. }
  12. func (c *PubSub) SetNetConn(netConn net.Conn) {
  13. c.cn = pool.NewConn(netConn)
  14. }
  15. func (c *ClusterClient) LoadState() (*clusterState, error) {
  16. return c.loadState()
  17. }
  18. func (c *ClusterClient) SlotAddrs(slot int) []string {
  19. state, err := c.state.Get()
  20. if err != nil {
  21. panic(err)
  22. }
  23. var addrs []string
  24. for _, n := range state.slotNodes(slot) {
  25. addrs = append(addrs, n.Client.getAddr())
  26. }
  27. return addrs
  28. }
  29. func (c *ClusterClient) Nodes(key string) ([]*clusterNode, error) {
  30. state, err := c.state.Reload()
  31. if err != nil {
  32. return nil, err
  33. }
  34. slot := hashtag.Slot(key)
  35. nodes := state.slotNodes(slot)
  36. if len(nodes) != 2 {
  37. return nil, fmt.Errorf("slot=%d does not have enough nodes: %v", slot, nodes)
  38. }
  39. return nodes, nil
  40. }
  41. func (c *ClusterClient) SwapNodes(key string) error {
  42. nodes, err := c.Nodes(key)
  43. if err != nil {
  44. return err
  45. }
  46. nodes[0], nodes[1] = nodes[1], nodes[0]
  47. return nil
  48. }
  49. func (state *clusterState) IsConsistent() bool {
  50. if len(state.Masters) < 3 {
  51. return false
  52. }
  53. for _, master := range state.Masters {
  54. s := master.Client.Info("replication").Val()
  55. if !strings.Contains(s, "role:master") {
  56. return false
  57. }
  58. }
  59. if len(state.Slaves) < 3 {
  60. return false
  61. }
  62. for _, slave := range state.Slaves {
  63. s := slave.Client.Info("replication").Val()
  64. if !strings.Contains(s, "role:slave") {
  65. return false
  66. }
  67. }
  68. return true
  69. }