You've already forked go-clickhouse
mirror of
https://github.com/uptrace/go-clickhouse.git
synced 2025-08-10 22:21:30 +02:00
feat: allow disabling compression for benchmarks
This commit is contained in:
@@ -30,8 +30,6 @@ func newLZ4Reader(r *bufio.Reader) *lz4Reader {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *lz4Reader) Init() {}
|
|
||||||
|
|
||||||
func (r *lz4Reader) Release() error {
|
func (r *lz4Reader) Release() error {
|
||||||
var err error
|
var err error
|
||||||
if r.Buffered() > 0 {
|
if r.Buffered() > 0 {
|
||||||
|
@@ -36,16 +36,19 @@ func NewReader(r io.Reader) *Reader {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *Reader) WithCompression(fn func() error) error {
|
func (r *Reader) WithCompression(enabled bool, fn func() error) error {
|
||||||
r.zr.Init()
|
if enabled {
|
||||||
r.rd = r.zr
|
r.rd = r.zr
|
||||||
|
}
|
||||||
|
|
||||||
firstErr := fn()
|
firstErr := fn()
|
||||||
|
|
||||||
|
if enabled {
|
||||||
r.rd = r.br
|
r.rd = r.br
|
||||||
if err := r.zr.Release(); err != nil && firstErr == nil {
|
if err := r.zr.Release(); err != nil && firstErr == nil {
|
||||||
firstErr = err
|
firstErr = err
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return firstErr
|
return firstErr
|
||||||
}
|
}
|
||||||
|
@@ -42,19 +42,23 @@ func NewWriter(w io.Writer) *Writer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (w *Writer) WithCompression(fn func() error) {
|
func (w *Writer) WithCompression(enabled bool, fn func() error) {
|
||||||
if w.err != nil {
|
if w.err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if enabled {
|
||||||
w.wr = w.zw
|
w.wr = w.zw
|
||||||
|
}
|
||||||
|
|
||||||
w.err = fn()
|
w.err = fn()
|
||||||
|
|
||||||
|
if enabled {
|
||||||
if err := w.zw.Close(); err != nil && w.err == nil {
|
if err := w.zw.Close(); err != nil && w.err == nil {
|
||||||
w.err = err
|
w.err = err
|
||||||
}
|
}
|
||||||
w.wr = w.bw
|
w.wr = w.bw
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (w *Writer) Flush() (err error) {
|
func (w *Writer) Flush() (err error) {
|
||||||
|
25
ch/config.go
25
ch/config.go
@@ -22,6 +22,8 @@ const (
|
|||||||
type Config struct {
|
type Config struct {
|
||||||
chpool.Config
|
chpool.Config
|
||||||
|
|
||||||
|
Compression bool
|
||||||
|
|
||||||
Network string
|
Network string
|
||||||
Addr string
|
Addr string
|
||||||
User string
|
User string
|
||||||
@@ -51,6 +53,15 @@ func defaultConfig() *Config {
|
|||||||
var cfg *Config
|
var cfg *Config
|
||||||
poolSize := 2 * runtime.GOMAXPROCS(0)
|
poolSize := 2 * runtime.GOMAXPROCS(0)
|
||||||
cfg = &Config{
|
cfg = &Config{
|
||||||
|
Config: chpool.Config{
|
||||||
|
PoolSize: poolSize,
|
||||||
|
PoolTimeout: 30 * time.Second,
|
||||||
|
MaxIdleConns: poolSize,
|
||||||
|
ConnMaxIdleTime: 30 * time.Minute,
|
||||||
|
},
|
||||||
|
|
||||||
|
Compression: true,
|
||||||
|
|
||||||
Network: "tcp",
|
Network: "tcp",
|
||||||
Addr: "localhost:9000",
|
Addr: "localhost:9000",
|
||||||
User: "default",
|
User: "default",
|
||||||
@@ -63,13 +74,6 @@ func defaultConfig() *Config {
|
|||||||
MaxRetries: 2,
|
MaxRetries: 2,
|
||||||
MinRetryBackoff: 500 * time.Millisecond,
|
MinRetryBackoff: 500 * time.Millisecond,
|
||||||
MaxRetryBackoff: time.Second,
|
MaxRetryBackoff: time.Second,
|
||||||
|
|
||||||
Config: chpool.Config{
|
|
||||||
PoolSize: poolSize,
|
|
||||||
PoolTimeout: 30 * time.Second,
|
|
||||||
MaxIdleConns: poolSize,
|
|
||||||
ConnMaxIdleTime: 30 * time.Minute,
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
return cfg
|
return cfg
|
||||||
}
|
}
|
||||||
@@ -82,6 +86,13 @@ func WithDiscardUnknownColumns() Option {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// WithCompression enables/disables LZ4 compression.
|
||||||
|
func WithCompression(enabled bool) Option {
|
||||||
|
return func(db *DB) {
|
||||||
|
db.cfg.Compression = enabled
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// WithAddr configures TCP host:port or Unix socket depending on Network.
|
// WithAddr configures TCP host:port or Unix socket depending on Network.
|
||||||
func WithAddr(addr string) Option {
|
func WithAddr(addr string) Option {
|
||||||
return func(db *DB) {
|
return func(db *DB) {
|
||||||
|
14
ch/db.go
14
ch/db.go
@@ -254,13 +254,13 @@ func (db *DB) _exec(ctx context.Context, query string) (*result, error) {
|
|||||||
err := db.withConn(ctx, func(cn *chpool.Conn) error {
|
err := db.withConn(ctx, func(cn *chpool.Conn) error {
|
||||||
if err := cn.WithWriter(ctx, db.cfg.WriteTimeout, func(wr *chproto.Writer) {
|
if err := cn.WithWriter(ctx, db.cfg.WriteTimeout, func(wr *chproto.Writer) {
|
||||||
db.writeQuery(wr, query)
|
db.writeQuery(wr, query)
|
||||||
writeBlock(ctx, wr, nil)
|
db.writeBlock(ctx, wr, nil)
|
||||||
}); err != nil {
|
}); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
return cn.WithReader(ctx, db.cfg.ReadTimeout, func(rd *chproto.Reader) error {
|
return cn.WithReader(ctx, db.cfg.ReadTimeout, func(rd *chproto.Reader) error {
|
||||||
var err error
|
var err error
|
||||||
res, err = readDataBlocks(rd)
|
res, err = db.readDataBlocks(rd)
|
||||||
return err
|
return err
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
@@ -324,7 +324,7 @@ func (db *DB) _query(ctx context.Context, query string) (*blockIter, error) {
|
|||||||
|
|
||||||
if err := cn.WithWriter(ctx, db.cfg.WriteTimeout, func(wr *chproto.Writer) {
|
if err := cn.WithWriter(ctx, db.cfg.WriteTimeout, func(wr *chproto.Writer) {
|
||||||
db.writeQuery(wr, query)
|
db.writeQuery(wr, query)
|
||||||
writeBlock(ctx, wr, nil)
|
db.writeBlock(ctx, wr, nil)
|
||||||
}); err != nil {
|
}); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -364,21 +364,21 @@ func (db *DB) _insert(
|
|||||||
err := db.withConn(ctx, func(cn *chpool.Conn) error {
|
err := db.withConn(ctx, func(cn *chpool.Conn) error {
|
||||||
if err := cn.WithWriter(ctx, db.cfg.WriteTimeout, func(wr *chproto.Writer) {
|
if err := cn.WithWriter(ctx, db.cfg.WriteTimeout, func(wr *chproto.Writer) {
|
||||||
db.writeQuery(wr, query)
|
db.writeQuery(wr, query)
|
||||||
writeBlock(ctx, wr, nil)
|
db.writeBlock(ctx, wr, nil)
|
||||||
}); err != nil {
|
}); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := cn.WithReader(ctx, db.cfg.ReadTimeout, func(rd *chproto.Reader) error {
|
if err := cn.WithReader(ctx, db.cfg.ReadTimeout, func(rd *chproto.Reader) error {
|
||||||
_, err := readSampleBlock(rd)
|
_, err := db.readSampleBlock(rd)
|
||||||
return err
|
return err
|
||||||
}); err != nil {
|
}); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := cn.WithWriter(ctx, db.cfg.WriteTimeout, func(wr *chproto.Writer) {
|
if err := cn.WithWriter(ctx, db.cfg.WriteTimeout, func(wr *chproto.Writer) {
|
||||||
writeBlock(ctx, wr, block)
|
db.writeBlock(ctx, wr, block)
|
||||||
writeBlock(ctx, wr, nil)
|
db.writeBlock(ctx, wr, nil)
|
||||||
}); err != nil {
|
}); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
20
ch/proto.go
20
ch/proto.go
@@ -79,7 +79,7 @@ func (it *blockIter) read(ctx context.Context, block *chschema.Block) (bool, err
|
|||||||
|
|
||||||
switch packet {
|
switch packet {
|
||||||
case chproto.ServerData:
|
case chproto.ServerData:
|
||||||
if err := readBlock(rd, block); err != nil {
|
if err := it.db.readBlock(rd, block); err != nil {
|
||||||
return false, err
|
return false, err
|
||||||
}
|
}
|
||||||
return true, nil
|
return true, nil
|
||||||
@@ -262,7 +262,7 @@ func (db *DB) writeQuery(wr *chproto.Writer, query string) {
|
|||||||
db.writeSettings(wr)
|
db.writeSettings(wr)
|
||||||
|
|
||||||
wr.Uvarint(2)
|
wr.Uvarint(2)
|
||||||
wr.Uvarint(chproto.CompressionEnabled)
|
wr.Bool(db.cfg.Compression)
|
||||||
wr.String(query)
|
wr.String(query)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -290,14 +290,14 @@ func (db *DB) writeSettings(wr *chproto.Writer) {
|
|||||||
|
|
||||||
var emptyBlock chschema.Block
|
var emptyBlock chschema.Block
|
||||||
|
|
||||||
func writeBlock(ctx context.Context, wr *chproto.Writer, block *chschema.Block) {
|
func (db *DB) writeBlock(ctx context.Context, wr *chproto.Writer, block *chschema.Block) {
|
||||||
if block == nil {
|
if block == nil {
|
||||||
block = &emptyBlock
|
block = &emptyBlock
|
||||||
}
|
}
|
||||||
wr.Uvarint(chproto.ClientData)
|
wr.Uvarint(chproto.ClientData)
|
||||||
wr.String("")
|
wr.String("")
|
||||||
|
|
||||||
wr.WithCompression(func() error {
|
wr.WithCompression(db.cfg.Compression, func() error {
|
||||||
writeBlockInfo(wr)
|
writeBlockInfo(wr)
|
||||||
return block.WriteTo(wr)
|
return block.WriteTo(wr)
|
||||||
})
|
})
|
||||||
@@ -313,7 +313,7 @@ func writeBlockInfo(wr *chproto.Writer) {
|
|||||||
wr.Uvarint(0)
|
wr.Uvarint(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
func readSampleBlock(rd *chproto.Reader) (*chschema.Block, error) {
|
func (db *DB) readSampleBlock(rd *chproto.Reader) (*chschema.Block, error) {
|
||||||
for {
|
for {
|
||||||
packet, err := rd.Uvarint()
|
packet, err := rd.Uvarint()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -323,7 +323,7 @@ func readSampleBlock(rd *chproto.Reader) (*chschema.Block, error) {
|
|||||||
switch packet {
|
switch packet {
|
||||||
case chproto.ServerData:
|
case chproto.ServerData:
|
||||||
block := new(chschema.Block)
|
block := new(chschema.Block)
|
||||||
if err := readBlock(rd, block); err != nil {
|
if err := db.readBlock(rd, block); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return block, nil
|
return block, nil
|
||||||
@@ -339,7 +339,7 @@ func readSampleBlock(rd *chproto.Reader) (*chschema.Block, error) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func readDataBlocks(rd *chproto.Reader) (*result, error) {
|
func (db *DB) readDataBlocks(rd *chproto.Reader) (*result, error) {
|
||||||
var res *result
|
var res *result
|
||||||
block := new(chschema.Block)
|
block := new(chschema.Block)
|
||||||
for {
|
for {
|
||||||
@@ -350,7 +350,7 @@ func readDataBlocks(rd *chproto.Reader) (*result, error) {
|
|||||||
|
|
||||||
switch packet {
|
switch packet {
|
||||||
case chproto.ServerData:
|
case chproto.ServerData:
|
||||||
if err := readBlock(rd, block); err != nil {
|
if err := db.readBlock(rd, block); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -412,12 +412,12 @@ func readPacket(rd *chproto.Reader) (*result, error) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func readBlock(rd *chproto.Reader, block *chschema.Block) error {
|
func (db *DB) readBlock(rd *chproto.Reader, block *chschema.Block) error {
|
||||||
if _, err := rd.String(); err != nil {
|
if _, err := rd.String(); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
return rd.WithCompression(func() error {
|
return rd.WithCompression(db.cfg.Compression, func() error {
|
||||||
if err := readBlockInfo(rd); err != nil {
|
if err := readBlockInfo(rd); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user