-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathsnappy.go
75 lines (58 loc) · 1.17 KB
/
snappy.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
package snappy
import (
"io"
"sync"
"github.com/golang/snappy"
"google.golang.org/grpc/encoding"
)
// Name is the name registered for the snappy compressor.
const Name = "snappy"
func init() {
encoding.RegisterCompressor(&compressor{})
}
var (
// cmpPool stores writers
cmpPool sync.Pool
// dcmpPool stores readers
dcmpPool sync.Pool
)
type compressor struct {
}
func (c *compressor) Name() string {
return Name
}
func (c *compressor) Compress(w io.Writer) (io.WriteCloser, error) {
wr, inPool := cmpPool.Get().(*writeCloser)
if !inPool {
return &writeCloser{Writer: snappy.NewBufferedWriter(w)}, nil
}
wr.Reset(w)
return wr, nil
}
func (c *compressor) Decompress(r io.Reader) (io.Reader, error) {
dr, inPool := dcmpPool.Get().(*reader)
if !inPool {
return &reader{Reader: snappy.NewReader(r)}, nil
}
dr.Reset(r)
return dr, nil
}
type writeCloser struct {
*snappy.Writer
}
func (w *writeCloser) Close() error {
defer func() {
cmpPool.Put(w)
}()
return w.Writer.Close()
}
type reader struct {
*snappy.Reader
}
func (r *reader) Read(p []byte) (n int, err error) {
n, err = r.Reader.Read(p)
if err == io.EOF {
dcmpPool.Put(r)
}
return n, err
}