Skip to content

Commit

Permalink
zstd: Make decoder allocations smaller (#306)
Browse files Browse the repository at this point in the history
* keep allocations as small as possible

Co-authored-by: bo <bblanton@asapp.com>
  • Loading branch information
wyndhblb and bblanton-asapp authored Jan 6, 2021
1 parent 0454c42 commit 2bd38e0
Showing 1 changed file with 11 additions and 4 deletions.
15 changes: 11 additions & 4 deletions zstd/seqdec.go
Original file line number Diff line number Diff line change
Expand Up @@ -181,11 +181,18 @@ func (s *sequenceDecs) decode(seqs int, br *bitReader, hist []byte) error {
return fmt.Errorf("output (%d) bigger than max block size", size)
}
if size > cap(s.out) {
// Not enough size, will be extremely rarely triggered,
// Not enough size, which can happen under high volume block streaming conditions
// but could be if destination slice is too small for sync operations.
// We add maxBlockSize to the capacity.
s.out = append(s.out, make([]byte, maxBlockSize)...)
s.out = s.out[:len(s.out)-maxBlockSize]
// over-allocating here can create a large amount of GC pressure so we try to keep
// it as contained as possible
used := len(s.out) - startSize
addBytes := 256 + ll + ml + used>>2
// Clamp to max block size.
if used+addBytes > maxBlockSize {
addBytes = maxBlockSize - used
}
s.out = append(s.out, make([]byte, addBytes)...)
s.out = s.out[:len(s.out)-addBytes]
}
if ml > maxMatchLen {
return fmt.Errorf("match len (%d) bigger than max allowed length", ml)
Expand Down

0 comments on commit 2bd38e0

Please sign in to comment.