MCPcopy Index your code
hub / github.com/CodisLabs/codis / handleRequestSlotsMapping

Method handleRequestSlotsMapping

pkg/proxy/session.go:586–631  ·  view source on GitHub ↗
(r *Request, d *Router)

Source from the content-addressed store, hash-verified

584}
585
586func (s *Session) handleRequestSlotsMapping(r *Request, d *Router) error {
587 var nblks = len(r.Multi) - 1
588 switch {
589 case nblks >= 2:
590 r.Resp = redis.NewErrorf("ERR wrong number of arguments for 'SLOTSMAPPING' command")
591 return nil
592 }
593 marshalToResp := func(m *models.Slot) *redis.Resp {
594 if m == nil {
595 return redis.NewArray(nil)
596 }
597 var replicaGroups []*redis.Resp
598 for i := range m.ReplicaGroups {
599 var group []*redis.Resp
600 for _, addr := range m.ReplicaGroups[i] {
601 group = append(group, redis.NewString([]byte(addr)))
602 }
603 replicaGroups = append(replicaGroups, redis.NewArray(group))
604 }
605 return redis.NewArray([]*redis.Resp{
606 redis.NewString([]byte(strconv.Itoa(m.Id))),
607 redis.NewString([]byte(m.BackendAddr)),
608 redis.NewString([]byte(m.MigrateFrom)),
609 redis.NewArray(replicaGroups),
610 })
611 }
612 if nblks == 0 {
613 var array = make([]*redis.Resp, MaxSlotNum)
614 for i, m := range d.GetSlots() {
615 array[i] = marshalToResp(m)
616 }
617 r.Resp = redis.NewArray(array)
618 return nil
619 }
620 switch slot, err := redis.Btoi64(r.Multi[1].Value); {
621 case err != nil:
622 r.Resp = redis.NewErrorf("ERR parse slotnum '%s' failed, %s", r.Multi[1].Value, err)
623 return nil
624 case slot < 0 || slot >= MaxSlotNum:
625 r.Resp = redis.NewErrorf("ERR parse slotnum '%s' failed, out of range", r.Multi[1].Value)
626 return nil
627 default:
628 r.Resp = marshalToResp(d.GetSlot(int(slot)))
629 return nil
630 }
631}
632
633func (s *Session) incrOpTotal() {
634 s.stats.total.Incr()

Callers 1

handleRequestMethod · 0.95

Calls 2

GetSlotsMethod · 0.80
GetSlotMethod · 0.80

Tested by

no test coverage detected