Skip to content

Commit d2ca8b7

Browse files
committed
fix: fix "read aof file failed" error
1 parent 0046b84 commit d2ca8b7

File tree

3 files changed

+25
-13
lines changed

3 files changed

+25
-13
lines changed

Diff for: internal/reader/sync_standalone_reader.go

+5-6
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"bufio"
55
"bytes"
66
"context"
7+
"errors"
78
"encoding/json"
89
"fmt"
910
"io"
@@ -477,7 +478,7 @@ func (r *syncStandaloneReader) sendRDB(rdbFilePath string) {
477478
}
478479

479480
func (r *syncStandaloneReader) sendAOF(offset int64) {
480-
aofReader := rotate.NewAOFReader(r.stat.Name, r.stat.Dir, offset)
481+
aofReader := rotate.NewAOFReader(r.ctx, r.stat.Name, r.stat.Dir, offset)
481482
defer aofReader.Close()
482483
protoReader := proto.NewReader(bufio.NewReader(aofReader))
483484
for {
@@ -488,12 +489,10 @@ func (r *syncStandaloneReader) sendAOF(offset int64) {
488489

489490
iArgv, err := protoReader.ReadReply()
490491
if err != nil {
491-
if err == io.EOF {
492-
time.Sleep(10 * time.Millisecond)
493-
continue
494-
} else {
495-
log.Panicf("[%s] read aof file failed. error=[%v]", r.stat.Name, err)
492+
if errors.Is(err, context.Canceled) {
493+
return
496494
}
495+
log.Panicf("[%s] read aof file failed. error=[%v]", r.stat.Name, err)
497496
}
498497

499498
argv := client.ArrayString(iArgv, nil)

Diff for: internal/utils/file_rotate/aof_reader.go

+19-6
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,15 @@ package rotate
33
import (
44
"RedisShake/internal/log"
55
"RedisShake/internal/utils"
6+
"context"
67
"fmt"
78
"io"
89
"os"
910
"time"
1011
)
1112

1213
type AOFReader struct {
14+
ctx context.Context
1315
name string
1416
dir string
1517
file *os.File
@@ -18,8 +20,9 @@ type AOFReader struct {
1820
filepath string
1921
}
2022

21-
func NewAOFReader(name string, dir string, offset int64) *AOFReader {
23+
func NewAOFReader(ctx context.Context, name string, dir string, offset int64) *AOFReader {
2224
r := new(AOFReader)
25+
r.ctx = ctx
2326
r.name = name
2427
r.dir = dir
2528

@@ -69,17 +72,27 @@ func (r *AOFReader) readNextFile(offset int64) bool {
6972

7073
func (r *AOFReader) Read(buf []byte) (n int, err error) {
7174
n, err = r.file.Read(buf)
72-
if err == io.EOF {
73-
if !r.readNextFile(r.offset) {
74-
return n, io.EOF
75+
for err == io.EOF {
76+
// sleep or context
77+
timer := time.NewTimer(1 * time.Millisecond)
78+
select {
79+
case <-r.ctx.Done():
80+
return n, r.ctx.Err()
81+
case <-timer.C:
7582
}
83+
r.readNextFile(r.offset) // try to read next file
7684
_, err = r.file.Seek(0, 1)
7785
if err != nil {
7886
log.Panicf(err.Error())
7987
}
8088
n, err = r.file.Read(buf)
81-
if err != nil {
82-
return n, err
89+
90+
if err == nil {
91+
break
92+
} else if err == io.EOF {
93+
continue
94+
} else {
95+
log.Panicf("[%s] read file failed. filename=[%s], err=[%v]", r.name, r.filepath, err)
8396
}
8497
}
8598
if err != nil {

Diff for: internal/writer/file_writer.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ func (w *fileWriter) processWrite(ctx context.Context) {
9090
defer ticker.Stop()
9191
file, err := os.Create(w.path)
9292
if err != nil {
93-
log.Panicf("create file failed:", err)
93+
log.Panicf("create file failed: %v", err)
9494
return
9595
}
9696
defer file.Close()

0 commit comments

Comments
 (0)