influxdb/tsdb/engine/tsm1/pools.go

144 lines
2.6 KiB
Go

package tsm1
import (
"sync"
"github.com/influxdata/influxdb/pkg/pool"
)
var (
bufPool = pool.NewBytes(10)
float64ValuePool sync.Pool
integerValuePool sync.Pool
booleanValuePool sync.Pool
stringValuePool sync.Pool
)
// getBuf returns a buffer with length size from the buffer pool.
func getBuf(size int) []byte {
return bufPool.Get(size)
}
// putBuf returns a buffer to the pool.
func putBuf(buf []byte) {
bufPool.Put(buf)
}
// getBuf returns a buffer with length size from the buffer pool.
func getFloat64Values(size int) []Value {
var buf []Value
x := float64ValuePool.Get()
if x == nil {
buf = make([]Value, size)
} else {
buf = x.([]Value)
}
if cap(buf) < size {
return make([]Value, size)
}
for i, v := range buf {
if v == nil {
buf[i] = FloatValue{}
}
}
return buf[:size]
}
// putBuf returns a buffer to the pool.
func putFloat64Values(buf []Value) {
float64ValuePool.Put(buf)
}
// getBuf returns a buffer with length size from the buffer pool.
func getIntegerValues(size int) []Value {
var buf []Value
x := integerValuePool.Get()
if x == nil {
buf = make([]Value, size)
} else {
buf = x.([]Value)
}
if cap(buf) < size {
return make([]Value, size)
}
for i, v := range buf {
if v == nil {
buf[i] = IntegerValue{}
}
}
return buf[:size]
}
// putBuf returns a buffer to the pool.
func putIntegerValues(buf []Value) {
integerValuePool.Put(buf)
}
// getBuf returns a buffer with length size from the buffer pool.
func getBooleanValues(size int) []Value {
var buf []Value
x := booleanValuePool.Get()
if x == nil {
buf = make([]Value, size)
} else {
buf = x.([]Value)
}
if cap(buf) < size {
return make([]Value, size)
}
for i, v := range buf {
if v == nil {
buf[i] = BooleanValue{}
}
}
return buf[:size]
}
// putBuf returns a buffer to the pool.
func putStringValues(buf []Value) {
stringValuePool.Put(buf)
}
// getBuf returns a buffer with length size from the buffer pool.
func getStringValues(size int) []Value {
var buf []Value
x := stringValuePool.Get()
if x == nil {
buf = make([]Value, size)
} else {
buf = x.([]Value)
}
if cap(buf) < size {
return make([]Value, size)
}
for i, v := range buf {
if v == nil {
buf[i] = StringValue{}
}
}
return buf[:size]
}
// putBuf returns a buffer to the pool.
func putBooleanValues(buf []Value) {
booleanValuePool.Put(buf)
}
func putValue(buf []Value) {
if len(buf) > 0 {
switch buf[0].(type) {
case FloatValue:
putFloat64Values(buf)
case IntegerValue:
putIntegerValues(buf)
case BooleanValue:
putBooleanValues(buf)
case StringValue:
putStringValues(buf)
}
}
}