Small goleveldb hack to reduce allocations somewhat
This commit is contained in:
2
Godeps/Godeps.json
generated
2
Godeps/Godeps.json
generated
@@ -49,7 +49,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "github.com/syndtr/goleveldb/leveldb",
|
"ImportPath": "github.com/syndtr/goleveldb/leveldb",
|
||||||
"Rev": "fcb3916f495c513b7eab70340f030e942e67b7da"
|
"Rev": "c9d6b7be1428942d4cf4f54055b991a8513392eb"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"ImportPath": "github.com/vitrun/qart/coding",
|
"ImportPath": "github.com/vitrun/qart/coding",
|
||||||
|
|||||||
16
Godeps/_workspace/src/github.com/syndtr/goleveldb/leveldb/table/reader.go
generated
vendored
16
Godeps/_workspace/src/github.com/syndtr/goleveldb/leveldb/table/reader.go
generated
vendored
@@ -13,6 +13,7 @@ import (
|
|||||||
"io"
|
"io"
|
||||||
"sort"
|
"sort"
|
||||||
"strings"
|
"strings"
|
||||||
|
"sync"
|
||||||
|
|
||||||
"code.google.com/p/snappy-go/snappy"
|
"code.google.com/p/snappy-go/snappy"
|
||||||
|
|
||||||
@@ -528,6 +529,8 @@ type Reader struct {
|
|||||||
dataEnd int64
|
dataEnd int64
|
||||||
indexBlock *block
|
indexBlock *block
|
||||||
filterBlock *filterBlock
|
filterBlock *filterBlock
|
||||||
|
|
||||||
|
blockPool sync.Pool
|
||||||
}
|
}
|
||||||
|
|
||||||
func verifyChecksum(data []byte) bool {
|
func verifyChecksum(data []byte) bool {
|
||||||
@@ -538,7 +541,13 @@ func verifyChecksum(data []byte) bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (r *Reader) readRawBlock(bh blockHandle, checksum bool) ([]byte, error) {
|
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 {
|
if _, err := r.reader.ReadAt(data, int64(bh.offset)); err != nil && err != io.EOF {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -552,10 +561,13 @@ func (r *Reader) readRawBlock(bh blockHandle, checksum bool) ([]byte, error) {
|
|||||||
data = data[:bh.length]
|
data = data[:bh.length]
|
||||||
case blockTypeSnappyCompression:
|
case blockTypeSnappyCompression:
|
||||||
var err error
|
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 {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
r.blockPool.Put(data[:cap(data)])
|
||||||
|
data = decData
|
||||||
default:
|
default:
|
||||||
return nil, fmt.Errorf("leveldb/table: Reader: unknown block compression type: %d", data[bh.length])
|
return nil, fmt.Errorf("leveldb/table: Reader: unknown block compression type: %d", data[bh.length])
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user