Skip to content

Commit

Permalink
region: Use bufferPool for read buffers
Browse files Browse the repository at this point in the history
Reuse buffers for reading responses from HBase, both for the
compressed response and decompressed response. This should reduce
memory pressure when reading lots of data.
  • Loading branch information
aaronbee committed Jan 1, 2025
1 parent 14f25c0 commit ec68361
Show file tree
Hide file tree
Showing 2 changed files with 6 additions and 8 deletions.
12 changes: 5 additions & 7 deletions region/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -103,12 +103,8 @@ const (
var bufferPool sync.Pool

func newBuffer(size int) []byte {
v := bufferPool.Get()
var b []byte
if v != nil {
b = v.([]byte)
}
return append(b[:0], make([]byte, size)...)
b, _ := bufferPool.Get().([]byte)
return append(b, make([]byte, size)...)
}

func freeBuffer(b []byte) {
Expand Down Expand Up @@ -477,7 +473,8 @@ func (c *client) receive(r io.Reader) (err error) {
}

size := binary.BigEndian.Uint32(sz[:])
b := make([]byte, size)
b := newBuffer(int(size))
defer freeBuffer(b)

_, err = io.ReadFull(r, b)
if err != nil {
Expand Down Expand Up @@ -546,6 +543,7 @@ func (c *client) receive(r io.Reader) (err error) {
b := b[size-cellsLen:]
if c.compressor != nil {
b, err = c.compressor.decompressCellblocks(b)
defer freeBuffer(b)
if err != nil {
err = RetryableError{fmt.Errorf("failed to decompress the response: %s", err)}
return
Expand Down
2 changes: 1 addition & 1 deletion region/compressor.go
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ func readUint32(b []byte) (uint32, []byte, error) {
func (c *compressor) decompressCellblocks(b []byte) ([]byte, error) {
var (
err error
out []byte
out = newBuffer(0) // gets freed in receive
compressedChunk []byte
compressedChunkLen uint32
uncompressedBlockLen uint32
Expand Down

0 comments on commit ec68361

Please sign in to comment.