You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
88 lines
1.6 KiB
88 lines
1.6 KiB
package rotate
|
|
|
|
import (
|
|
"RedisShake/internal/log"
|
|
"RedisShake/internal/utils"
|
|
"fmt"
|
|
"io"
|
|
"os"
|
|
"time"
|
|
)
|
|
|
|
type AOFReader struct {
|
|
name string
|
|
dir string
|
|
file *os.File
|
|
offset int64
|
|
pos int64
|
|
filepath string
|
|
}
|
|
|
|
func NewAOFReader(name string, dir string, offset int64) *AOFReader {
|
|
r := new(AOFReader)
|
|
r.name = name
|
|
r.dir = dir
|
|
r.openFile(offset)
|
|
return r
|
|
}
|
|
|
|
func (r *AOFReader) openFile(offset int64) {
|
|
r.filepath = fmt.Sprintf("%s/%d.aof", r.dir, r.offset)
|
|
var err error
|
|
r.file, err = os.OpenFile(r.filepath, os.O_RDONLY, 0644)
|
|
if err != nil {
|
|
log.Panicf(err.Error())
|
|
}
|
|
r.offset = offset
|
|
r.pos = 0
|
|
log.Debugf("[%s] open file for read. filename=[%s]", r.name, r.filepath)
|
|
}
|
|
|
|
func (r *AOFReader) readNextFile(offset int64) {
|
|
filepath := fmt.Sprintf("%s/%d.aof", r.dir, r.offset)
|
|
if utils.IsExist(filepath) {
|
|
r.Close()
|
|
err := os.Remove(r.filepath)
|
|
if err != nil {
|
|
return
|
|
}
|
|
r.openFile(offset)
|
|
}
|
|
}
|
|
|
|
func (r *AOFReader) Read(buf []byte) (n int, err error) {
|
|
n, err = r.file.Read(buf)
|
|
for err == io.EOF {
|
|
if r.filepath != fmt.Sprintf("%s/%d.aof", r.dir, r.offset) {
|
|
r.readNextFile(r.offset)
|
|
}
|
|
time.Sleep(time.Millisecond * 10)
|
|
_, err = r.file.Seek(0, 1)
|
|
if err != nil {
|
|
log.Panicf(err.Error())
|
|
}
|
|
n, err = r.file.Read(buf)
|
|
}
|
|
if err != nil {
|
|
log.Panicf(err.Error())
|
|
}
|
|
r.offset += int64(n)
|
|
r.pos += int64(n)
|
|
return n, nil
|
|
}
|
|
|
|
func (r *AOFReader) Offset() int64 {
|
|
return r.offset
|
|
}
|
|
|
|
func (r *AOFReader) Close() {
|
|
if r.file == nil {
|
|
return
|
|
}
|
|
err := r.file.Close()
|
|
if err != nil {
|
|
log.Panicf(err.Error())
|
|
}
|
|
r.file = nil
|
|
log.Infof("[%s] close file. filename=[%s]", r.name, r.filepath)
|
|
}
|
|
|