From b004155e8fd6f4991a9ec5d7d53b7cb4c3098723 Mon Sep 17 00:00:00 2001 From: Jakob Borg Date: Tue, 12 Aug 2014 15:39:24 +0200 Subject: [PATCH] Small goleveldb hack to reduce allocations somewhat --- Godeps/Godeps.json | 2 +- .../syndtr/goleveldb/leveldb/table/reader.go | 16 ++++++++++++++-- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/Godeps/Godeps.json b/Godeps/Godeps.json index 5dcf21f89..3fa5f6201 100644 --- a/Godeps/Godeps.json +++ b/Godeps/Godeps.json @@ -49,7 +49,7 @@ }, { "ImportPath": "github.com/syndtr/goleveldb/leveldb", - "Rev": "fcb3916f495c513b7eab70340f030e942e67b7da" + "Rev": "c9d6b7be1428942d4cf4f54055b991a8513392eb" }, { "ImportPath": "github.com/vitrun/qart/coding", diff --git a/Godeps/_workspace/src/github.com/syndtr/goleveldb/leveldb/table/reader.go b/Godeps/_workspace/src/github.com/syndtr/goleveldb/leveldb/table/reader.go index 51df477da..84267dd3a 100644 --- a/Godeps/_workspace/src/github.com/syndtr/goleveldb/leveldb/table/reader.go +++ b/Godeps/_workspace/src/github.com/syndtr/goleveldb/leveldb/table/reader.go @@ -13,6 +13,7 @@ import ( "io" "sort" "strings" + "sync" "code.google.com/p/snappy-go/snappy" @@ -528,6 +529,8 @@ type Reader struct { dataEnd int64 indexBlock *block filterBlock *filterBlock + + blockPool sync.Pool } func verifyChecksum(data []byte) bool { @@ -538,7 +541,13 @@ func verifyChecksum(data []byte) bool { } func (r *Reader) readRawBlock(bh blockHandle, checksum bool) ([]byte, error) { - data := make([]byte, bh.length+blockTrailerLen) + data, _ := r.blockPool.Get().([]byte) // data is either nil or a valid []byte from the pool + if l := bh.length + blockTrailerLen; uint64(len(data)) >= l { + data = data[:l] + } else { + r.blockPool.Put(data) + data = make([]byte, l) + } if _, err := r.reader.ReadAt(data, int64(bh.offset)); err != nil && err != io.EOF { return nil, err } @@ -552,10 +561,13 @@ func (r *Reader) readRawBlock(bh blockHandle, checksum bool) ([]byte, error) { data = data[:bh.length] case blockTypeSnappyCompression: var err error - data, err = snappy.Decode(nil, data[:bh.length]) + decData, _ := r.blockPool.Get().([]byte) + decData, err = snappy.Decode(decData, data[:bh.length]) if err != nil { return nil, err } + r.blockPool.Put(data[:cap(data)]) + data = decData default: return nil, fmt.Errorf("leveldb/table: Reader: unknown block compression type: %d", data[bh.length]) }