diff --git a/client/object_search.go b/client/object_search.go index aa02542..42018e5 100644 --- a/client/object_search.go +++ b/client/object_search.go @@ -220,7 +220,7 @@ func (x *ObjectListReader) Close() (*ResObjectSearch, error) { defer x.cancelCtxStream() if x.err != nil && !errors.Is(x.err, io.EOF) { - return nil, x.err + return &x.res, x.err } return &x.res, nil diff --git a/pool/pool.go b/pool/pool.go index 4e76978..d795af8 100644 --- a/pool/pool.go +++ b/pool/pool.go @@ -1092,7 +1092,7 @@ func (c *clientWrapper) objectSearch(ctx context.Context, prm PrmObjectSearch) ( return ResObjectSearch{}, fmt.Errorf("init object searching on client: %w", err) } - return ResObjectSearch{r: res}, nil + return ResObjectSearch{r: res, handleError: c.handleError}, nil } // sessionCreate invokes sdkClient.SessionCreate parse response status to error and return result as is. @@ -1278,7 +1278,7 @@ func needCountError(ctx context.Context, err error) bool { return false } - if errors.Is(ctx.Err(), context.Canceled) { + if ctx != nil && errors.Is(ctx.Err(), context.Canceled) { return false } @@ -2764,18 +2764,25 @@ func (p *Pool) ObjectRange(ctx context.Context, prm PrmObjectRange) (ResObjectRa // // Must be initialized using Pool.SearchObjects, any other usage is unsafe. type ResObjectSearch struct { - r *sdkClient.ObjectListReader + r *sdkClient.ObjectListReader + handleError func(context.Context, apistatus.Status, error) error } // Read reads another list of the object identifiers. func (x *ResObjectSearch) Read(buf []oid.ID) (int, error) { n, ok := x.r.Read(buf) if !ok { - _, err := x.r.Close() + res, err := x.r.Close() if err == nil { return n, io.EOF } + var status apistatus.Status + if res != nil { + status = res.Status() + } + err = x.handleError(nil, status, err) + return n, err }