influxdb/tsdb/engine/tsm1/pools.go

148 lines
2.7 KiB
Go

package tsm1
import "sync"
var (
bufPool sync.Pool
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 {
x := bufPool.Get()
if x == nil {
return make([]byte, size)
}
buf := x.([]byte)
if cap(buf) < size {
return make([]byte, size)
}
return buf[: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)
}
}
}