| 105 | } |
| 106 | |
| 107 | func (d *forwardSemiAsync) process(s *Slot, r *Request, hkey []byte) (_ *BackendConn, retry bool, _ error) { |
| 108 | if s.backend.bc == nil { |
| 109 | log.Debugf("slot-%04d is not ready: hash key = '%s'", |
| 110 | s.id, hkey) |
| 111 | return nil, false, ErrSlotIsNotReady |
| 112 | } |
| 113 | if s.migrate.bc != nil && len(hkey) != 0 { |
| 114 | resp, moved, err := d.slotsmgrtExecWrapper(s, hkey, r.Database, r.Seed16(), r.Multi) |
| 115 | switch { |
| 116 | case err != nil: |
| 117 | log.Debugf("slot-%04d migrate from = %s to %s failed: hash key = '%s', error = %s", |
| 118 | s.id, s.migrate.bc.Addr(), s.backend.bc.Addr(), hkey, err) |
| 119 | return nil, false, err |
| 120 | case !moved: |
| 121 | switch { |
| 122 | case resp != nil: |
| 123 | r.Resp = resp |
| 124 | return nil, false, nil |
| 125 | } |
| 126 | return nil, true, nil |
| 127 | } |
| 128 | } |
| 129 | r.Group = &s.refs |
| 130 | r.Group.Add(1) |
| 131 | return d.forward2(s, r), false, nil |
| 132 | } |
| 133 | |
| 134 | type forwardHelper struct { |
| 135 | } |