From 6cd7a09b225902ecb92c6851e0aad63d8331ac3e Mon Sep 17 00:00:00 2001 From: Vladimir Mihailenco Date: Fri, 16 Dec 2016 14:05:21 +0200 Subject: [PATCH] Use first slot/shard when key is not defined. --- cluster.go | 17 +++++++++-------- ring.go | 3 --- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/cluster.go b/cluster.go index 5a8d25c1..b898c0d3 100644 --- a/cluster.go +++ b/cluster.go @@ -258,10 +258,10 @@ func newClusterState(nodes *clusterNodes, slots []ClusterSlot) (*clusterState, e func (c *clusterState) slotMasterNode(slot int) (*clusterNode, error) { nodes := c.slotNodes(slot) - if len(nodes) == 0 { - return c.nodes.Random() + if len(nodes) > 0 { + return nodes[0], nil } - return nodes[0], nil + return c.nodes.Random() } func (c *clusterState) slotSlaveNode(slot int) (*clusterNode, error) { @@ -364,15 +364,16 @@ func (c *ClusterClient) state() *clusterState { } func (c *ClusterClient) cmdSlotAndNode(state *clusterState, cmd Cmder) (int, *clusterNode, error) { + if state == nil { + node, err := c.nodes.Random() + return 0, node, err + } + cmdInfo := c.cmds[cmd.arg(0)] firstKey := cmd.arg(cmdFirstKeyPos(cmd, cmdInfo)) - if firstKey == "" || cmdInfo == nil { - node, err := c.nodes.Random() - return -1, node, err - } slot := hashtag.Slot(firstKey) - if cmdInfo.ReadOnly && c.opt.ReadOnly { + if cmdInfo != nil && cmdInfo.ReadOnly && c.opt.ReadOnly { if c.opt.RouteByLatency { node, err := state.slotClosestNode(slot) return slot, node, err diff --git a/ring.go b/ring.go index 356684f3..aff019da 100644 --- a/ring.go +++ b/ring.go @@ -267,9 +267,6 @@ func (c *Ring) shardByName(name string) (*ringShard, error) { func (c *Ring) cmdShard(cmd Cmder) (*ringShard, error) { cmdInfo := c.cmdInfo(cmd.arg(0)) firstKey := cmd.arg(cmdFirstKeyPos(cmd, cmdInfo)) - if firstKey == "" { - return c.randomShard() - } return c.shardByKey(firstKey) }