Skip to content

Commit 8e3241a

Browse files
authored
Merge pull request #382 from erizocosmico/feature/compress-keys
gitbase: compress keys using zlib
2 parents 157eb71 + 96974eb commit 8e3241a

File tree

2 files changed

+57
-21
lines changed

2 files changed

+57
-21
lines changed

index.go

Lines changed: 47 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,13 @@ package gitbase
22

33
import (
44
"bytes"
5+
"compress/zlib"
56
"crypto/sha1"
67
"encoding/binary"
78
"fmt"
89
"io"
10+
"io/ioutil"
11+
"sync"
912

1013
errors "gopkg.in/src-d/go-errors.v1"
1114
"gopkg.in/src-d/go-mysql-server.v0/sql"
@@ -24,12 +27,54 @@ type Indexable interface {
2427
gitBase
2528
}
2629

30+
type zlibEncoder struct {
31+
w *zlib.Writer
32+
mut sync.Mutex
33+
}
34+
35+
func (e *zlibEncoder) encode(data []byte) ([]byte, error) {
36+
e.mut.Lock()
37+
defer e.mut.Unlock()
38+
39+
var buf bytes.Buffer
40+
e.w.Reset(&buf)
41+
42+
if _, err := e.w.Write(data); err != nil {
43+
return nil, err
44+
}
45+
46+
if err := e.w.Close(); err != nil {
47+
return nil, err
48+
}
49+
50+
return buf.Bytes(), nil
51+
}
52+
53+
var encoder = func() *zlibEncoder {
54+
return &zlibEncoder{w: zlib.NewWriter(bytes.NewBuffer(nil))}
55+
}()
56+
2757
func encodeIndexKey(k indexKey) ([]byte, error) {
28-
return k.encode()
58+
bs, err := k.encode()
59+
if err != nil {
60+
return nil, err
61+
}
62+
63+
return encoder.encode(bs)
2964
}
3065

3166
func decodeIndexKey(data []byte, k indexKey) error {
32-
return k.decode(data)
67+
gz, err := zlib.NewReader(bytes.NewReader(data))
68+
if err != nil {
69+
return err
70+
}
71+
72+
bs, err := ioutil.ReadAll(gz)
73+
if err != nil {
74+
return err
75+
}
76+
77+
return k.decode(bs)
3378
}
3479

3580
func rowIndexValues(row sql.Row, columns []string, schema sql.Schema) ([]interface{}, error) {

index_test.go

Lines changed: 10 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package gitbase
22

33
import (
44
"bytes"
5-
"encoding/gob"
65
"io"
76
"testing"
87

@@ -121,37 +120,29 @@ func testTableIndex(
121120
require.ElementsMatch(expected, rows)
122121
}
123122

124-
func TestEncodeKeySize(t *testing.T) {
123+
func TestEncodeRoundtrip(t *testing.T) {
125124
require := require.New(t)
126125

127-
k1 := packOffsetIndexKey{
126+
k := &packOffsetIndexKey{
128127
Repository: "/foo/bar/baz/repo.git",
129128
Packfile: plumbing.ZeroHash.String(),
130129
Offset: 12345,
131130
Hash: "",
132131
}
133132

134-
k2 := packOffsetIndexKey{
135-
Repository: "/foo/bar/baz/repo.git",
136-
Packfile: plumbing.ZeroHash.String(),
137-
Offset: -1,
138-
Hash: plumbing.ZeroHash.String(),
139-
}
140-
141-
var buf1, buf2 bytes.Buffer
142-
require.NoError(gob.NewEncoder(&buf1).Encode(k1))
143-
144-
bytes1, err := k1.encode()
133+
bs, err := encodeIndexKey(k)
145134
require.NoError(err)
146135

147-
require.True(len(bytes1) < len(buf1.Bytes()))
136+
bsraw, err := k.encode()
137+
require.NoError(err)
148138

149-
require.NoError(gob.NewEncoder(&buf2).Encode(k2))
139+
// check encodeIndexKey also compresses the encoded value
140+
require.True(len(bs) < len(bsraw))
150141

151-
bytes2, err := k2.encode()
152-
require.NoError(err)
142+
var k2 packOffsetIndexKey
143+
require.NoError(decodeIndexKey(bs, &k2))
153144

154-
require.True(len(bytes2) < len(buf2.Bytes()))
145+
require.Equal(k, &k2)
155146
}
156147

157148
func TestWriteReadInt64(t *testing.T) {

0 commit comments

Comments
 (0)