@@ -83,7 +83,7 @@ func cmdFirstKeyPos(cmd Cmder, info *CommandInfo) int {
83
83
if info != nil {
84
84
return int (info .FirstKeyPos )
85
85
}
86
- return 0
86
+ return 1
87
87
}
88
88
89
89
func cmdString (cmd Cmder , val interface {}) string {
@@ -2649,13 +2649,14 @@ func (cmd *ClusterSlotsCmd) readReply(rd *proto.Reader) error {
2649
2649
2650
2650
// subtract start and end.
2651
2651
nodes := make ([]ClusterNode , n - 2 )
2652
+
2652
2653
for j := 0 ; j < len (nodes ); j ++ {
2653
2654
nn , err := rd .ReadArrayLen ()
2654
2655
if err != nil {
2655
2656
return err
2656
2657
}
2657
- if nn != 2 && nn != 3 {
2658
- return fmt .Errorf ("got %d elements in cluster info address, expected 2 or 3 " , nn )
2658
+ if nn < 2 || nn > 4 {
2659
+ return fmt .Errorf ("got %d elements in cluster info address, expected 2, 3, or 4 " , n )
2659
2660
}
2660
2661
2661
2662
ip , err := rd .ReadString ()
@@ -2670,14 +2671,43 @@ func (cmd *ClusterSlotsCmd) readReply(rd *proto.Reader) error {
2670
2671
2671
2672
nodes [j ].Addr = net .JoinHostPort (ip , port )
2672
2673
2673
- if nn = = 3 {
2674
+ if nn > = 3 {
2674
2675
id , err := rd .ReadString ()
2675
2676
if err != nil {
2676
2677
return err
2677
2678
}
2678
2679
nodes [j ].ID = id
2679
2680
}
2681
+
2682
+ if nn >= 4 {
2683
+ networkingMetadata := make (map [string ]string )
2684
+
2685
+ metadataLength , err := rd .ReadArrayLen ()
2686
+ if err != nil {
2687
+ return err
2688
+ }
2689
+
2690
+ if metadataLength % 2 != 0 {
2691
+ return fmt .Errorf (
2692
+ "got %d elements in metadata, expected an even number" , metadataLength )
2693
+ }
2694
+
2695
+ for i := 0 ; i < metadataLength ; i += 2 {
2696
+ key , err := rd .ReadString ()
2697
+ if err != nil {
2698
+ return err
2699
+ }
2700
+ value , err := rd .ReadString ()
2701
+ if err != nil {
2702
+ return err
2703
+ }
2704
+ networkingMetadata [key ] = value
2705
+ }
2706
+
2707
+ nodes [j ].NetworkingMetadata = networkingMetadata
2708
+ }
2680
2709
}
2710
+
2681
2711
cmd .val [i ] = ClusterSlot {
2682
2712
Start : int (start ),
2683
2713
End : int (end ),
@@ -3136,6 +3166,7 @@ func (cmd *CommandsInfoCmd) String() string {
3136
3166
func (cmd * CommandsInfoCmd ) readReply (rd * proto.Reader ) error {
3137
3167
const numArgRedis5 = 6
3138
3168
const numArgRedis6 = 7
3169
+ const numArgRedis7 = 10
3139
3170
3140
3171
n , err := rd .ReadArrayLen ()
3141
3172
if err != nil {
@@ -3148,8 +3179,12 @@ func (cmd *CommandsInfoCmd) readReply(rd *proto.Reader) error {
3148
3179
if err != nil {
3149
3180
return err
3150
3181
}
3151
- if nn != numArgRedis5 && nn != numArgRedis6 {
3152
- return fmt .Errorf ("redis: got %d elements in COMMAND reply, wanted 6/7" , nn )
3182
+
3183
+ switch nn {
3184
+ case numArgRedis5 , numArgRedis6 , numArgRedis7 :
3185
+ // ok
3186
+ default :
3187
+ return fmt .Errorf ("redis: got %d elements in COMMAND reply, wanted 6/7/10" , nn )
3153
3188
}
3154
3189
3155
3190
cmdInfo := & CommandInfo {}
@@ -3200,7 +3235,7 @@ func (cmd *CommandsInfoCmd) readReply(rd *proto.Reader) error {
3200
3235
}
3201
3236
cmdInfo .StepCount = int8 (stepCount )
3202
3237
3203
- if nn = = numArgRedis6 {
3238
+ if nn > = numArgRedis6 {
3204
3239
aclFlagLen , err := rd .ReadArrayLen ()
3205
3240
if err != nil {
3206
3241
return err
@@ -3218,6 +3253,18 @@ func (cmd *CommandsInfoCmd) readReply(rd *proto.Reader) error {
3218
3253
}
3219
3254
}
3220
3255
3256
+ if nn >= numArgRedis7 {
3257
+ if err := rd .DiscardNext (); err != nil {
3258
+ return err
3259
+ }
3260
+ if err := rd .DiscardNext (); err != nil {
3261
+ return err
3262
+ }
3263
+ if err := rd .DiscardNext (); err != nil {
3264
+ return err
3265
+ }
3266
+ }
3267
+
3221
3268
cmd .val [cmdInfo .Name ] = cmdInfo
3222
3269
}
3223
3270
0 commit comments