Skip to content

Commit 8c9df59

Browse files
author
HuangYi
committed
don't patch upstream
1 parent 4e1ae59 commit 8c9df59

File tree

9 files changed

+153
-10
lines changed

9 files changed

+153
-10
lines changed

memiavl/db.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ func Load(dir string, opts Options) (*DB, error) {
129129
}
130130
}
131131

132-
wal, err := wal.Open(walPath(dir), &wal.Options{NoCopy: true, NoSync: true, RecoverCorruptedTail: true})
132+
wal, err := OpenWAL(walPath(dir), &wal.Options{NoCopy: true, NoSync: true})
133133
if err != nil {
134134
return nil, err
135135
}

memiavl/go.mod

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,5 +94,4 @@ replace (
9494
github.com/tendermint/tendermint => github.com/cometbft/cometbft v0.34.29
9595
// https://github.com/crypto-org-chain/tm-db/tree/release/v0.6.x
9696
github.com/tendermint/tm-db => github.com/crypto-org-chain/tm-db v0.6.8-0.20230424032152-87c7e7f4fb61
97-
github.com/tidwall/wal => github.com/yihuang/wal v1.1.8-0.20230620041632-0865755fe1a0
9897
)

memiavl/go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -378,6 +378,8 @@ github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs=
378378
github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=
379379
github.com/tidwall/tinylru v1.1.0 h1:XY6IUfzVTU9rpwdhKUF6nQdChgCdGjkMfLzbWyiau6I=
380380
github.com/tidwall/tinylru v1.1.0/go.mod h1:3+bX+TJ2baOLMWTnlyNWHh4QMnFyARg2TLTQ6OFbzw8=
381+
github.com/tidwall/wal v1.1.7 h1:emc1TRjIVsdKKSnpwGBAcsAGg0767SvUk8+ygx7Bb+4=
382+
github.com/tidwall/wal v1.1.7/go.mod h1:r6lR1j27W9EPalgHiB7zLJDYu3mzW5BQP5KrzBpYY/E=
381383
github.com/torquem-ch/mdbx-go v0.27.5 h1:bbhXQGFCmoxbRDXKYEJwxSOOTeBKwoD4pFBUpK9+V1g=
382384
github.com/torquem-ch/mdbx-go v0.27.5/go.mod h1:T2fsoJDVppxfAPTLd1svUgH1kpPmeXdPESmroSHcL1E=
383385
github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc=
@@ -397,8 +399,6 @@ github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:
397399
github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y=
398400
github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
399401
github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI=
400-
github.com/yihuang/wal v1.1.8-0.20230620041632-0865755fe1a0 h1:giEmWxnE9m1Gqno6CehTW5oMXVoin36ClWaYYOTkQKc=
401-
github.com/yihuang/wal v1.1.8-0.20230620041632-0865755fe1a0/go.mod h1:r6lR1j27W9EPalgHiB7zLJDYu3mzW5BQP5KrzBpYY/E=
402402
github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg=
403403
github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM=
404404
github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZkTdatxwunjIkc=

memiavl/wal.go

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
package memiavl
2+
3+
import (
4+
"bytes"
5+
"encoding/binary"
6+
"fmt"
7+
"io/ioutil"
8+
"os"
9+
"path/filepath"
10+
"unsafe"
11+
12+
"github.com/tidwall/gjson"
13+
"github.com/tidwall/wal"
14+
)
15+
16+
// OpenWAL opens the write ahead log, try to truncate the corrupted tail if there's any
17+
// TODO fix in upstream: https://github.com/tidwall/wal/pull/22
18+
func OpenWAL(dir string, opts *wal.Options) (*wal.Log, error) {
19+
log, err := wal.Open(dir, opts)
20+
if err == wal.ErrCorrupt {
21+
// try to truncate corrupted tail
22+
var fis []os.DirEntry
23+
fis, err = os.ReadDir(dir)
24+
if err != nil {
25+
return nil, fmt.Errorf("read wal dir fail: %w", err)
26+
}
27+
var lastSeg string
28+
for _, fi := range fis {
29+
if fi.IsDir() || len(fi.Name()) < 20 {
30+
continue
31+
}
32+
lastSeg = fi.Name()
33+
}
34+
35+
if len(lastSeg) == 0 {
36+
return nil, err
37+
}
38+
if err = truncateCorruptedTail(filepath.Join(dir, lastSeg), opts.LogFormat); err != nil {
39+
return nil, fmt.Errorf("truncate corrupted tail fail: %w", err)
40+
}
41+
42+
// try again
43+
return wal.Open(dir, opts)
44+
}
45+
46+
return log, err
47+
}
48+
49+
func truncateCorruptedTail(path string, format wal.LogFormat) error {
50+
data, err := ioutil.ReadFile(path)
51+
if err != nil {
52+
return err
53+
}
54+
var pos int
55+
for len(data) > 0 {
56+
var n int
57+
if format == wal.JSON {
58+
n, err = loadNextJSONEntry(data)
59+
} else {
60+
n, err = loadNextBinaryEntry(data)
61+
}
62+
if err == wal.ErrCorrupt {
63+
break
64+
}
65+
if err != nil {
66+
return err
67+
}
68+
data = data[n:]
69+
pos += n
70+
}
71+
if pos != len(data) {
72+
return os.Truncate(path, int64(pos))
73+
}
74+
return nil
75+
}
76+
77+
func loadNextJSONEntry(data []byte) (n int, err error) {
78+
// {"index":number,"data":string}
79+
idx := bytes.IndexByte(data, '\n')
80+
if idx == -1 {
81+
return 0, wal.ErrCorrupt
82+
}
83+
line := data[:idx]
84+
dres := gjson.Get(*(*string)(unsafe.Pointer(&line)), "data")
85+
if dres.Type != gjson.String {
86+
return 0, wal.ErrCorrupt
87+
}
88+
return idx + 1, nil
89+
}
90+
91+
func loadNextBinaryEntry(data []byte) (n int, err error) {
92+
// data_size + data
93+
size, n := binary.Uvarint(data)
94+
if n <= 0 {
95+
return 0, wal.ErrCorrupt
96+
}
97+
if uint64(len(data)-n) < size {
98+
return 0, wal.ErrCorrupt
99+
}
100+
return n + int(size), nil
101+
}

memiavl/wal_test.go

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package memiavl
2+
3+
import (
4+
"os"
5+
"path/filepath"
6+
"testing"
7+
8+
"github.com/stretchr/testify/require"
9+
"github.com/tidwall/wal"
10+
)
11+
12+
func TestCorruptedTail(t *testing.T) {
13+
opts := &wal.Options{
14+
LogFormat: wal.JSON,
15+
}
16+
dir := t.TempDir()
17+
18+
testCases := []struct {
19+
name string
20+
logs []byte
21+
lastIndex uint64
22+
}{
23+
{"failure-1", []byte("\n"), 0},
24+
{"failure-2", []byte(`{}` + "\n"), 0},
25+
{"failure-3", []byte(`{"index":"1"}` + "\n"), 0},
26+
{"failure-4", []byte(`{"index":"1","data":"?"}`), 0},
27+
{"failure-5", []byte(`{"index":1,"data":"?"}` + "\n" + `{"index":"1","data":"?"}`), 1},
28+
}
29+
30+
for _, tc := range testCases {
31+
t.Run(tc.name, func(t *testing.T) {
32+
os.WriteFile(filepath.Join(dir, "00000000000000000001"), tc.logs, 0666)
33+
34+
_, err := wal.Open(dir, opts)
35+
require.Equal(t, wal.ErrCorrupt, err)
36+
37+
log, err := OpenWAL(dir, opts)
38+
require.NoError(t, err)
39+
40+
lastIndex, err := log.LastIndex()
41+
require.NoError(t, err)
42+
require.Equal(t, tc.lastIndex, lastIndex)
43+
})
44+
}
45+
}

store/go.mod

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,5 +99,4 @@ replace (
9999
github.com/tendermint/tendermint => github.com/cometbft/cometbft v0.34.29
100100
// https://github.com/crypto-org-chain/tm-db/tree/release/v0.6.x
101101
github.com/tendermint/tm-db => github.com/crypto-org-chain/tm-db v0.6.8-0.20230424032152-87c7e7f4fb61
102-
github.com/tidwall/wal => github.com/yihuang/wal v1.1.8-0.20230620041632-0865755fe1a0
103102
)

store/go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -429,6 +429,8 @@ github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs=
429429
github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=
430430
github.com/tidwall/tinylru v1.1.0 h1:XY6IUfzVTU9rpwdhKUF6nQdChgCdGjkMfLzbWyiau6I=
431431
github.com/tidwall/tinylru v1.1.0/go.mod h1:3+bX+TJ2baOLMWTnlyNWHh4QMnFyARg2TLTQ6OFbzw8=
432+
github.com/tidwall/wal v1.1.7 h1:emc1TRjIVsdKKSnpwGBAcsAGg0767SvUk8+ygx7Bb+4=
433+
github.com/tidwall/wal v1.1.7/go.mod h1:r6lR1j27W9EPalgHiB7zLJDYu3mzW5BQP5KrzBpYY/E=
432434
github.com/torquem-ch/mdbx-go v0.27.5 h1:bbhXQGFCmoxbRDXKYEJwxSOOTeBKwoD4pFBUpK9+V1g=
433435
github.com/torquem-ch/mdbx-go v0.27.5/go.mod h1:T2fsoJDVppxfAPTLd1svUgH1kpPmeXdPESmroSHcL1E=
434436
github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=
@@ -449,8 +451,6 @@ github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:
449451
github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y=
450452
github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
451453
github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI=
452-
github.com/yihuang/wal v1.1.8-0.20230620041632-0865755fe1a0 h1:giEmWxnE9m1Gqno6CehTW5oMXVoin36ClWaYYOTkQKc=
453-
github.com/yihuang/wal v1.1.8-0.20230620041632-0865755fe1a0/go.mod h1:r6lR1j27W9EPalgHiB7zLJDYu3mzW5BQP5KrzBpYY/E=
454454
github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg=
455455
github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM=
456456
github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZkTdatxwunjIkc=

versiondb/go.mod

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,5 +166,4 @@ replace (
166166
github.com/tendermint/tendermint => github.com/cometbft/cometbft v0.34.29
167167
// https://github.com/crypto-org-chain/tm-db/tree/release/v0.6.x
168168
github.com/tendermint/tm-db => github.com/crypto-org-chain/tm-db v0.6.8-0.20230424032152-87c7e7f4fb61
169-
github.com/tidwall/wal => github.com/yihuang/wal v1.1.8-0.20230620041632-0865755fe1a0
170169
)

versiondb/go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -991,6 +991,8 @@ github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhso
991991
github.com/tidwall/sjson v1.2.4/go.mod h1:098SZ494YoMWPmMO6ct4dcFnqxwj9r/gF0Etp19pSNM=
992992
github.com/tidwall/tinylru v1.1.0 h1:XY6IUfzVTU9rpwdhKUF6nQdChgCdGjkMfLzbWyiau6I=
993993
github.com/tidwall/tinylru v1.1.0/go.mod h1:3+bX+TJ2baOLMWTnlyNWHh4QMnFyARg2TLTQ6OFbzw8=
994+
github.com/tidwall/wal v1.1.7 h1:emc1TRjIVsdKKSnpwGBAcsAGg0767SvUk8+ygx7Bb+4=
995+
github.com/tidwall/wal v1.1.7/go.mod h1:r6lR1j27W9EPalgHiB7zLJDYu3mzW5BQP5KrzBpYY/E=
994996
github.com/tinylib/msgp v1.0.2/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE=
995997
github.com/tinylib/msgp v1.1.5/go.mod h1:eQsjooMTnV42mHu917E26IogZ2930nFyBQdofk10Udg=
996998
github.com/tklauser/go-sysconf v0.3.5/go.mod h1:MkWzOF4RMCshBAMXuhXJs64Rte09mITnppBXY/rYEFI=
@@ -1034,8 +1036,6 @@ github.com/xlab/treeprint v0.0.0-20180616005107-d6fb6747feb6/go.mod h1:ce1O1j6Ut
10341036
github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
10351037
github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI=
10361038
github.com/ybbus/jsonrpc v2.1.2+incompatible/go.mod h1:XJrh1eMSzdIYFbM08flv0wp5G35eRniyeGut1z+LSiE=
1037-
github.com/yihuang/wal v1.1.8-0.20230620041632-0865755fe1a0 h1:giEmWxnE9m1Gqno6CehTW5oMXVoin36ClWaYYOTkQKc=
1038-
github.com/yihuang/wal v1.1.8-0.20230620041632-0865755fe1a0/go.mod h1:r6lR1j27W9EPalgHiB7zLJDYu3mzW5BQP5KrzBpYY/E=
10391039
github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg=
10401040
github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM=
10411041
github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZkTdatxwunjIkc=

0 commit comments

Comments
 (0)