| 167 | } |
| 168 | |
| 169 | func (d *forwardHelper) slotsmgrtExecWrapper(s *Slot, hkey []byte, database int32, seed uint, multi []*redis.Resp) (_ *redis.Resp, moved bool, _ error) { |
| 170 | m := &Request{} |
| 171 | m.Multi = make([]*redis.Resp, 0, 2+len(multi)) |
| 172 | m.Multi = append(m.Multi, |
| 173 | redis.NewBulkBytes([]byte("SLOTSMGRT-EXEC-WRAPPER")), |
| 174 | redis.NewBulkBytes(hkey), |
| 175 | ) |
| 176 | m.Multi = append(m.Multi, multi...) |
| 177 | m.Batch = &sync.WaitGroup{} |
| 178 | |
| 179 | s.migrate.bc.BackendConn(database, seed, true).PushBack(m) |
| 180 | |
| 181 | m.Batch.Wait() |
| 182 | |
| 183 | if err := m.Err; err != nil { |
| 184 | return nil, false, err |
| 185 | } |
| 186 | switch resp := m.Resp; { |
| 187 | case resp == nil: |
| 188 | return nil, false, ErrRespIsRequired |
| 189 | case resp.IsError(): |
| 190 | return nil, false, fmt.Errorf("bad slotsmgrt-exec-wrapper resp: %s", resp.Value) |
| 191 | case resp.IsArray(): |
| 192 | if len(resp.Array) != 2 { |
| 193 | return nil, false, fmt.Errorf("bad slotsmgrt-exec-wrapper resp: array.len = %d", |
| 194 | len(resp.Array)) |
| 195 | } |
| 196 | if !resp.Array[0].IsInt() || len(resp.Array[0].Value) != 1 { |
| 197 | return nil, false, fmt.Errorf("bad slotsmgrt-exec-wrapper resp: type(array[0]) = %s, len(array[0].value) = %d", |
| 198 | resp.Array[0].Type, len(resp.Array[0].Value)) |
| 199 | } |
| 200 | switch resp.Array[0].Value[0] - '0' { |
| 201 | case 0: |
| 202 | return nil, true, nil |
| 203 | case 1: |
| 204 | return nil, false, nil |
| 205 | case 2: |
| 206 | return resp.Array[1], false, nil |
| 207 | default: |
| 208 | return nil, false, fmt.Errorf("bad slotsmgrt-exec-wrapper resp: [%s] %s", |
| 209 | resp.Array[0].Value, resp.Array[1].Value) |
| 210 | } |
| 211 | default: |
| 212 | return nil, false, fmt.Errorf("bad slotsmgrt-exec-wrapper resp: should be integer, but got %s", resp.Type) |
| 213 | } |
| 214 | } |
| 215 | |
| 216 | func (d *forwardHelper) forward2(s *Slot, r *Request) *BackendConn { |
| 217 | var database, seed = r.Database, r.Seed16() |