in go/pkg/reader/reader.go [192:237]
func (cfs *compressedSeeker) Read(p []byte) (int, error) {
if cfs.err != nil {
return 0, cfs.err
}
var n int
var errR, errW error
for cfs.encdW != nil && cfs.buf.Len() < len(p) && errR == nil && errW == nil {
// Read is allowed to use the entity of p as a scratchpad.
n, errR = cfs.fs.Read(p)
// errW must be non-nil if written bytes != from n.
_, errW = cfs.encdW.Encoder.Write(p[:n])
}
// We have to treat EOF differently. It's the only "everything is going according
// to plan" error. EOF implies our uncompressed input data has finished reading,
// but it doesn't mean that we've finished preparing/returning our compressed data.
// We only want to return EOF to the user when the _compressed_ data is finished reading.
if errR != nil && errR != io.EOF {
cfs.err = errR
} else if errW != nil {
cfs.err = errW
}
// When the buffer ends, or in case of _any_ error, we compress all the bytes we
// had available. The encoder requires a Close call to finish writing compressed
// data smaller than zstd's window size.
var errC error
if cfs.err != nil || errR == io.EOF {
errC = cfs.encdW.Encoder.Close()
encoders.Put(cfs.encdW)
cfs.encdW = nil
}
m, errR2 := cfs.buf.Read(p)
if cfs.err == nil {
if errC != nil {
cfs.err = errC
} else if errR2 != nil {
cfs.err = errR2
}
}
return m, cfs.err
}