Skip to content
This repository was archived by the owner on Sep 11, 2020. It is now read-only.

Commit 429f9eb

Browse files
committed
Add a buffer to crc writer
crc update with block smaller than 16 bytes uses a slower version of the function. ReadByte is heavily used by zlib inflate so most of the time crc is update byte by byte. A new Flush method is added to the scanner to flush this crc writer cache. It is only called when the Scanner reader is a teeReader. Signed-off-by: Javi Fontan <[email protected]>
1 parent f6aca08 commit 429f9eb

File tree

1 file changed

+29
-9
lines changed

1 file changed

+29
-9
lines changed

plumbing/format/packfile/scanner.go

Lines changed: 29 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -63,10 +63,7 @@ func NewScanner(r io.Reader) *Scanner {
6363

6464
crc := crc32.NewIEEE()
6565
return &Scanner{
66-
r: &teeReader{
67-
newByteReadSeeker(seeker),
68-
crc,
69-
},
66+
r: newTeeReader(newByteReadSeeker(seeker), crc),
7067
crc: crc,
7168
IsSeekable: ok,
7269
}
@@ -143,6 +140,8 @@ func (s *Scanner) readCount() (uint32, error) {
143140

144141
// NextObjectHeader returns the ObjectHeader for the next object in the reader
145142
func (s *Scanner) NextObjectHeader() (*ObjectHeader, error) {
143+
defer s.Flush()
144+
146145
if err := s.doPending(); err != nil {
147146
return nil, err
148147
}
@@ -271,6 +270,7 @@ func (s *Scanner) NextObject(w io.Writer) (written int64, crc32 uint32, err erro
271270

272271
s.pendingObject = nil
273272
written, err = s.copyObject(w)
273+
s.Flush()
274274
crc32 = s.crc.Sum32()
275275
return
276276
}
@@ -339,6 +339,14 @@ func (s *Scanner) Close() error {
339339
return err
340340
}
341341

342+
func (s *Scanner) Flush() error {
343+
tee, ok := s.r.(*teeReader)
344+
if ok {
345+
return tee.Flush()
346+
}
347+
return nil
348+
}
349+
342350
type trackableReader struct {
343351
count int64
344352
io.Reader
@@ -400,10 +408,21 @@ type reader interface {
400408

401409
type teeReader struct {
402410
reader
403-
w hash.Hash32
411+
w hash.Hash32
412+
bufWriter *bufio.Writer
413+
}
414+
415+
func newTeeReader(r reader, h hash.Hash32) *teeReader {
416+
return &teeReader{
417+
reader: r,
418+
w: h,
419+
bufWriter: bufio.NewWriter(h),
420+
}
404421
}
405422

406423
func (r *teeReader) Read(p []byte) (n int, err error) {
424+
r.Flush()
425+
407426
n, err = r.reader.Read(p)
408427
if n > 0 {
409428
if n, err := r.w.Write(p[:n]); err != nil {
@@ -416,11 +435,12 @@ func (r *teeReader) Read(p []byte) (n int, err error) {
416435
func (r *teeReader) ReadByte() (b byte, err error) {
417436
b, err = r.reader.ReadByte()
418437
if err == nil {
419-
_, err := r.w.Write([]byte{b})
420-
if err != nil {
421-
return 0, err
422-
}
438+
return b, r.bufWriter.WriteByte(b)
423439
}
424440

425441
return
426442
}
443+
444+
func (r *teeReader) Flush() (err error) {
445+
return r.bufWriter.Flush()
446+
}

0 commit comments

Comments
 (0)