|
@@ -1,14 +1,8 @@
|
|
|
package sarama
|
|
package sarama
|
|
|
|
|
|
|
|
import (
|
|
import (
|
|
|
- "bytes"
|
|
|
|
|
- "compress/gzip"
|
|
|
|
|
"fmt"
|
|
"fmt"
|
|
|
- "io/ioutil"
|
|
|
|
|
"time"
|
|
"time"
|
|
|
-
|
|
|
|
|
- "github.com/eapache/go-xerial-snappy"
|
|
|
|
|
- "github.com/pierrec/lz4"
|
|
|
|
|
)
|
|
)
|
|
|
|
|
|
|
|
// CompressionCodec represents the various compression codecs recognized by Kafka in messages.
|
|
// CompressionCodec represents the various compression codecs recognized by Kafka in messages.
|
|
@@ -77,53 +71,12 @@ func (m *Message) encode(pe packetEncoder) error {
|
|
|
payload = m.compressedCache
|
|
payload = m.compressedCache
|
|
|
m.compressedCache = nil
|
|
m.compressedCache = nil
|
|
|
} else if m.Value != nil {
|
|
} else if m.Value != nil {
|
|
|
- switch m.Codec {
|
|
|
|
|
- case CompressionNone:
|
|
|
|
|
- payload = m.Value
|
|
|
|
|
- case CompressionGZIP:
|
|
|
|
|
- var buf bytes.Buffer
|
|
|
|
|
- var writer *gzip.Writer
|
|
|
|
|
- if m.CompressionLevel != CompressionLevelDefault {
|
|
|
|
|
- writer, err = gzip.NewWriterLevel(&buf, m.CompressionLevel)
|
|
|
|
|
- if err != nil {
|
|
|
|
|
- return err
|
|
|
|
|
- }
|
|
|
|
|
- } else {
|
|
|
|
|
- writer = gzip.NewWriter(&buf)
|
|
|
|
|
- }
|
|
|
|
|
- if _, err = writer.Write(m.Value); err != nil {
|
|
|
|
|
- return err
|
|
|
|
|
- }
|
|
|
|
|
- if err = writer.Close(); err != nil {
|
|
|
|
|
- return err
|
|
|
|
|
- }
|
|
|
|
|
- m.compressedCache = buf.Bytes()
|
|
|
|
|
- payload = m.compressedCache
|
|
|
|
|
- case CompressionSnappy:
|
|
|
|
|
- tmp := snappy.Encode(m.Value)
|
|
|
|
|
- m.compressedCache = tmp
|
|
|
|
|
- payload = m.compressedCache
|
|
|
|
|
- case CompressionLZ4:
|
|
|
|
|
- var buf bytes.Buffer
|
|
|
|
|
- writer := lz4.NewWriter(&buf)
|
|
|
|
|
- if _, err = writer.Write(m.Value); err != nil {
|
|
|
|
|
- return err
|
|
|
|
|
- }
|
|
|
|
|
- if err = writer.Close(); err != nil {
|
|
|
|
|
- return err
|
|
|
|
|
- }
|
|
|
|
|
- m.compressedCache = buf.Bytes()
|
|
|
|
|
- payload = m.compressedCache
|
|
|
|
|
- case CompressionZSTD:
|
|
|
|
|
- c, err := zstdCompressLevel(nil, m.Value, m.CompressionLevel)
|
|
|
|
|
- if err != nil {
|
|
|
|
|
- return err
|
|
|
|
|
- }
|
|
|
|
|
- m.compressedCache = c
|
|
|
|
|
- payload = m.compressedCache
|
|
|
|
|
- default:
|
|
|
|
|
- return PacketEncodingError{fmt.Sprintf("unsupported compression codec (%d)", m.Codec)}
|
|
|
|
|
|
|
+
|
|
|
|
|
+ payload, err = compress(m.Codec, m.CompressionLevel, m.Value)
|
|
|
|
|
+ if err != nil {
|
|
|
|
|
+ return err
|
|
|
}
|
|
}
|
|
|
|
|
+ m.compressedCache = payload
|
|
|
// Keep in mind the compressed payload size for metric gathering
|
|
// Keep in mind the compressed payload size for metric gathering
|
|
|
m.compressedSize = len(payload)
|
|
m.compressedSize = len(payload)
|
|
|
}
|
|
}
|
|
@@ -179,53 +132,18 @@ func (m *Message) decode(pd packetDecoder) (err error) {
|
|
|
switch m.Codec {
|
|
switch m.Codec {
|
|
|
case CompressionNone:
|
|
case CompressionNone:
|
|
|
// nothing to do
|
|
// nothing to do
|
|
|
- case CompressionGZIP:
|
|
|
|
|
|
|
+ default:
|
|
|
if m.Value == nil {
|
|
if m.Value == nil {
|
|
|
break
|
|
break
|
|
|
}
|
|
}
|
|
|
- reader, err := gzip.NewReader(bytes.NewReader(m.Value))
|
|
|
|
|
|
|
+
|
|
|
|
|
+ m.Value, err = decompress(m.Codec, m.Value)
|
|
|
if err != nil {
|
|
if err != nil {
|
|
|
return err
|
|
return err
|
|
|
}
|
|
}
|
|
|
- if m.Value, err = ioutil.ReadAll(reader); err != nil {
|
|
|
|
|
- return err
|
|
|
|
|
- }
|
|
|
|
|
if err := m.decodeSet(); err != nil {
|
|
if err := m.decodeSet(); err != nil {
|
|
|
return err
|
|
return err
|
|
|
}
|
|
}
|
|
|
- case CompressionSnappy:
|
|
|
|
|
- if m.Value == nil {
|
|
|
|
|
- break
|
|
|
|
|
- }
|
|
|
|
|
- if m.Value, err = snappy.Decode(m.Value); err != nil {
|
|
|
|
|
- return err
|
|
|
|
|
- }
|
|
|
|
|
- if err := m.decodeSet(); err != nil {
|
|
|
|
|
- return err
|
|
|
|
|
- }
|
|
|
|
|
- case CompressionLZ4:
|
|
|
|
|
- if m.Value == nil {
|
|
|
|
|
- break
|
|
|
|
|
- }
|
|
|
|
|
- reader := lz4.NewReader(bytes.NewReader(m.Value))
|
|
|
|
|
- if m.Value, err = ioutil.ReadAll(reader); err != nil {
|
|
|
|
|
- return err
|
|
|
|
|
- }
|
|
|
|
|
- if err := m.decodeSet(); err != nil {
|
|
|
|
|
- return err
|
|
|
|
|
- }
|
|
|
|
|
- case CompressionZSTD:
|
|
|
|
|
- if m.Value == nil {
|
|
|
|
|
- break
|
|
|
|
|
- }
|
|
|
|
|
- if m.Value, err = zstdDecompress(nil, m.Value); err != nil {
|
|
|
|
|
- return err
|
|
|
|
|
- }
|
|
|
|
|
- if err := m.decodeSet(); err != nil {
|
|
|
|
|
- return err
|
|
|
|
|
- }
|
|
|
|
|
- default:
|
|
|
|
|
- return PacketDecodingError{fmt.Sprintf("invalid compression specified (%d)", m.Codec)}
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
return pd.pop()
|
|
return pd.pop()
|