From a88325cb96cd20a25e9191f842b257087d2e36ac Mon Sep 17 00:00:00 2001 From: Ken Hibino Date: Tue, 1 Sep 2020 06:57:08 -0700 Subject: [PATCH] Add ClusterNodes and ClusterKeySlot in Inspector --- inspector.go | 27 +++++++++++++++++++++++++++ internal/rdb/inspect.go | 24 ++++++++++++++++++++++++ 2 files changed, 51 insertions(+) diff --git a/inspector.go b/inspector.go index 2d5c7d6..fa4abf7 100644 --- a/inspector.go +++ b/inspector.go @@ -573,3 +573,30 @@ func (i *Inspector) UnpauseQueue(qname string) error { } return i.rdb.Unpause(qname) } + +// ClusterKeySlot returns an integer identifying the hash slot the given queue hashes to. +func (i *Inspector) ClusterKeySlot(qname string) (int64, error) { + return i.rdb.ClusterKeySlot(qname) +} + +// ClusterNode describes a node in redis cluster. +type ClusterNode struct { + // Node ID in the cluster. + ID string + + // Address of the node. + Addr string +} + +// ClusterNode returns a list of nodes the given queue belongs to. +func (i *Inspector) ClusterNodes(qname string) ([]ClusterNode, error) { + nodes, err := i.rdb.ClusterNodes(qname) + if err != nil { + return nil, err + } + var res []ClusterNode + for _, node := range nodes { + res = append(res, ClusterNode{ID: node.ID, Addr: node.Addr}) + } + return res, nil +} diff --git a/internal/rdb/inspect.go b/internal/rdb/inspect.go index 9bc1268..7634679 100644 --- a/internal/rdb/inspect.go +++ b/internal/rdb/inspect.go @@ -830,3 +830,27 @@ func (r *RDB) Unpause(qname string) error { } return nil } + +// ClusterKeySlot returns an integer identifying the hash slot the given queue hashes to. +func (r *RDB) ClusterKeySlot(qname string) (int64, error) { + key := base.QueueKey(qname) + return r.client.ClusterKeySlot(key).Result() +} + +// ClusterNodes returns a list of nodes the given queue belongs to. +func (r *RDB) ClusterNodes(qname string) ([]redis.ClusterNode, error) { + keyslot, err := r.ClusterKeySlot(qname) + if err != nil { + return nil, err + } + clusterSlots, err := r.client.ClusterSlots().Result() + if err != nil { + return nil, err + } + for _, slotRange := range clusterSlots { + if int64(slotRange.Start) <= keyslot && keyslot <= int64(slotRange.End) { + return slotRange.Nodes, nil + } + } + return nil, fmt.Errorf("nodes not found") +}