Small goleveldb hack to reduce allocations somewhat

This commit is contained in:
Jakob Borg 2014-08-12 15:39:24 +02:00
parent 92eed3b33b
commit b004155e8f
2 changed files with 15 additions and 3 deletions

2
Godeps/Godeps.json generated
View File

@ -49,7 +49,7 @@
},
{
"ImportPath": "github.com/syndtr/goleveldb/leveldb",
"Rev": "fcb3916f495c513b7eab70340f030e942e67b7da"
"Rev": "c9d6b7be1428942d4cf4f54055b991a8513392eb"
},
{
"ImportPath": "github.com/vitrun/qart/coding",

View File

@ -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])
}