(ctx context.Context, key string, offset, length int64, opts *ReaderOptions)
| 1029 | } |
| 1030 | |
| 1031 | func (b *Bucket) newRangeReader(ctx context.Context, key string, offset, length int64, opts *ReaderOptions) (_ *Reader, err error) { |
| 1032 | b.mu.RLock() |
| 1033 | defer b.mu.RUnlock() |
| 1034 | if b.closed { |
| 1035 | return nil, errClosed |
| 1036 | } |
| 1037 | if offset < 0 { |
| 1038 | return nil, gcerr.Newf(gcerr.InvalidArgument, nil, "blob: NewRangeReader offset must be non-negative (%d)", offset) |
| 1039 | } |
| 1040 | if !utf8.ValidString(key) { |
| 1041 | return nil, gcerr.Newf(gcerr.InvalidArgument, nil, "blob: NewRangeReader key must be a valid UTF-8 string: %q", key) |
| 1042 | } |
| 1043 | if opts == nil { |
| 1044 | opts = &ReaderOptions{} |
| 1045 | } |
| 1046 | dopts := &driver.ReaderOptions{ |
| 1047 | BeforeRead: opts.BeforeRead, |
| 1048 | } |
| 1049 | ctx, span := b.tracer.Start(ctx, "NewRangeReader") |
| 1050 | defer func() { |
| 1051 | // If err == nil, we handed the end closure off to the returned *Reader; it |
| 1052 | // will be called when the Reader is Closed. |
| 1053 | if err != nil { |
| 1054 | b.tracer.End(ctx, span, err) |
| 1055 | } |
| 1056 | }() |
| 1057 | var dr driver.Reader |
| 1058 | dr, err = b.b.NewRangeReader(ctx, key, offset, length, dopts) |
| 1059 | if err != nil { |
| 1060 | return nil, wrapError(b.b, err, key) |
| 1061 | } |
| 1062 | end := func(err error) { b.tracer.End(ctx, span, err) } |
| 1063 | r := &Reader{ |
| 1064 | b: b.b, |
| 1065 | r: dr, |
| 1066 | key: key, |
| 1067 | ctx: ctx, |
| 1068 | dopts: dopts, |
| 1069 | baseOffset: offset, |
| 1070 | baseLength: length, |
| 1071 | savedOffset: -1, |
| 1072 | end: end, |
| 1073 | bytesReadCounter: b.bytesReadCounter, |
| 1074 | } |
| 1075 | _, file, lineno, ok := runtime.Caller(2) |
| 1076 | runtime.SetFinalizer(r, func(r *Reader) { |
| 1077 | if !r.closed { |
| 1078 | var caller string |
| 1079 | if ok { |
| 1080 | caller = fmt.Sprintf(" (%s:%d)", file, lineno) |
| 1081 | } |
| 1082 | log.Printf("A blob.Reader reading from %q was never closed%s", key, caller) |
| 1083 | } |
| 1084 | }) |
| 1085 | return r, nil |
| 1086 | } |
| 1087 | |
| 1088 | // WriteAll is a shortcut for creating a Writer via NewWriter and writing p. |
no test coverage detected