func()

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
}