Patch for concurrent iterator & others (onto v1.11.6) #386
@ -17,7 +17,6 @@
|
||||
package rpc
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"context"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
@ -360,7 +359,10 @@ func (c *Client) BatchCall(b []BatchElem) error {
|
||||
//
|
||||
// Note that batch calls may not be executed atomically on the server side.
|
||||
func (c *Client) BatchCallContext(ctx context.Context, b []BatchElem) error {
|
||||
msgs := make([]*jsonrpcMessage, len(b))
|
||||
var (
|
||||
msgs = make([]*jsonrpcMessage, len(b))
|
||||
byID = make(map[string]int, len(b))
|
||||
)
|
||||
op := &requestOp{
|
||||
ids: make([]json.RawMessage, len(b)),
|
||||
resp: make(chan *jsonrpcMessage, len(b)),
|
||||
@ -372,6 +374,7 @@ func (c *Client) BatchCallContext(ctx context.Context, b []BatchElem) error {
|
||||
}
|
||||
msgs[i] = msg
|
||||
op.ids[i] = msg.ID
|
||||
byID[string(msg.ID)] = i
|
||||
}
|
||||
|
||||
var err error
|
||||
@ -391,13 +394,7 @@ func (c *Client) BatchCallContext(ctx context.Context, b []BatchElem) error {
|
||||
// Find the element corresponding to this response.
|
||||
// The element is guaranteed to be present because dispatch
|
||||
// only sends valid IDs to our channel.
|
||||
var elem *BatchElem
|
||||
for i := range msgs {
|
||||
if bytes.Equal(msgs[i].ID, resp.ID) {
|
||||
elem = &b[i]
|
||||
break
|
||||
}
|
||||
}
|
||||
elem := &b[byID[string(resp.ID)]]
|
||||
if resp.Error != nil {
|
||||
elem.Error = resp.Error
|
||||
continue
|
||||
|
Loading…
Reference in New Issue
Block a user