Execute "COMMAND" command only when readonly (#2815)

* remove command command from oss cluster

* remove command command from oss cluster

* remove cmdInfo from ring

---------

Co-authored-by: Chayim <chayim@users.noreply.github.com>
This commit is contained in:
ofekshenawa 2023-12-17 15:21:01 +02:00 committed by GitHub
parent 8c695488a2
commit 86c68be278
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 11 additions and 36 deletions

View File

@ -59,14 +59,6 @@ func NewClusterClientStub(resp []byte) *ClientStub {
}, },
}) })
// init command.
tmpClient := NewClient(&Options{Addr: ":6379"})
cmdsInfo, err := tmpClient.Command(ctx).Result()
_ = tmpClient.Close()
client.cmdsInfoCache = newCmdsInfoCache(func(_ context.Context) (map[string]*CommandInfo, error) {
return cmdsInfo, err
})
stub.Cmdable = client stub.Cmdable = client
return stub return stub
} }

View File

@ -75,7 +75,7 @@ func writeCmd(wr *proto.Writer, cmd Cmder) error {
return wr.WriteArgs(cmd.Args()) return wr.WriteArgs(cmd.Args())
} }
func cmdFirstKeyPos(cmd Cmder, info *CommandInfo) int { func cmdFirstKeyPos(cmd Cmder) int {
if pos := cmd.firstKeyPos(); pos != 0 { if pos := cmd.firstKeyPos(); pos != 0 {
return int(pos) return int(pos)
} }
@ -95,10 +95,6 @@ func cmdFirstKeyPos(cmd Cmder, info *CommandInfo) int {
return 2 return 2
} }
} }
if info != nil {
return int(info.FirstKeyPos)
}
return 1 return 1
} }

View File

@ -907,7 +907,6 @@ func (c *ClusterClient) Process(ctx context.Context, cmd Cmder) error {
} }
func (c *ClusterClient) process(ctx context.Context, cmd Cmder) error { func (c *ClusterClient) process(ctx context.Context, cmd Cmder) error {
cmdInfo := c.cmdInfo(ctx, cmd.Name())
slot := c.cmdSlot(ctx, cmd) slot := c.cmdSlot(ctx, cmd)
var node *clusterNode var node *clusterNode
var ask bool var ask bool
@ -921,7 +920,7 @@ func (c *ClusterClient) process(ctx context.Context, cmd Cmder) error {
if node == nil { if node == nil {
var err error var err error
node, err = c.cmdNode(ctx, cmdInfo, slot) node, err = c.cmdNode(ctx, cmd.Name(), slot)
if err != nil { if err != nil {
return err return err
} }
@ -1783,8 +1782,7 @@ func (c *ClusterClient) cmdSlot(ctx context.Context, cmd Cmder) int {
return args[2].(int) return args[2].(int)
} }
cmdInfo := c.cmdInfo(ctx, cmd.Name()) return cmdSlot(cmd, cmdFirstKeyPos(cmd))
return cmdSlot(cmd, cmdFirstKeyPos(cmd, cmdInfo))
} }
func cmdSlot(cmd Cmder, pos int) int { func cmdSlot(cmd Cmder, pos int) int {
@ -1797,7 +1795,7 @@ func cmdSlot(cmd Cmder, pos int) int {
func (c *ClusterClient) cmdNode( func (c *ClusterClient) cmdNode(
ctx context.Context, ctx context.Context,
cmdInfo *CommandInfo, cmdName string,
slot int, slot int,
) (*clusterNode, error) { ) (*clusterNode, error) {
state, err := c.state.Get(ctx) state, err := c.state.Get(ctx)
@ -1805,8 +1803,11 @@ func (c *ClusterClient) cmdNode(
return nil, err return nil, err
} }
if c.opt.ReadOnly && cmdInfo != nil && cmdInfo.ReadOnly { if c.opt.ReadOnly {
return c.slotReadOnlyNode(state, slot) cmdInfo := c.cmdInfo(ctx, cmdName)
if cmdInfo != nil && cmdInfo.ReadOnly {
return c.slotReadOnlyNode(state, slot)
}
} }
return state.slotMasterNode(slot) return state.slotMasterNode(slot)
} }

18
ring.go
View File

@ -678,21 +678,8 @@ func (c *Ring) cmdsInfo(ctx context.Context) (map[string]*CommandInfo, error) {
return nil, firstErr return nil, firstErr
} }
func (c *Ring) cmdInfo(ctx context.Context, name string) *CommandInfo {
cmdsInfo, err := c.cmdsInfoCache.Get(ctx)
if err != nil {
return nil
}
info := cmdsInfo[name]
if info == nil {
internal.Logger.Printf(ctx, "info for cmd=%s not found", name)
}
return info
}
func (c *Ring) cmdShard(ctx context.Context, cmd Cmder) (*ringShard, error) { func (c *Ring) cmdShard(ctx context.Context, cmd Cmder) (*ringShard, error) {
cmdInfo := c.cmdInfo(ctx, cmd.Name()) pos := cmdFirstKeyPos(cmd)
pos := cmdFirstKeyPos(cmd, cmdInfo)
if pos == 0 { if pos == 0 {
return c.sharding.Random() return c.sharding.Random()
} }
@ -760,8 +747,7 @@ func (c *Ring) generalProcessPipeline(
cmdsMap := make(map[string][]Cmder) cmdsMap := make(map[string][]Cmder)
for _, cmd := range cmds { for _, cmd := range cmds {
cmdInfo := c.cmdInfo(ctx, cmd.Name()) hash := cmd.stringArg(cmdFirstKeyPos(cmd))
hash := cmd.stringArg(cmdFirstKeyPos(cmd, cmdInfo))
if hash != "" { if hash != "" {
hash = c.sharding.Hash(hash) hash = c.sharding.Hash(hash)
} }