(r *Request, d *Router)
| 584 | } |
| 585 | |
| 586 | func (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 | |
| 633 | func (s *Session) incrOpTotal() { |
| 634 | s.stats.total.Incr() |
no test coverage detected