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.
71 lines
1.3 KiB
71 lines
1.3 KiB
package rotate
|
|
|
|
import (
|
|
"RedisShake/internal/log"
|
|
"fmt"
|
|
"os"
|
|
)
|
|
|
|
const MaxFileSize = 1024 * 1024 * 1024 // 1G
|
|
|
|
type AOFWriter struct {
|
|
name string
|
|
dir string
|
|
|
|
file *os.File
|
|
offset int64
|
|
filepath string
|
|
filesize int64
|
|
}
|
|
|
|
func NewAOFWriter(name string, dir string, offset int64) *AOFWriter {
|
|
w := new(AOFWriter)
|
|
w.name = name
|
|
w.dir = dir
|
|
w.openFile(offset)
|
|
return w
|
|
}
|
|
|
|
func (w *AOFWriter) openFile(offset int64) {
|
|
w.filepath = fmt.Sprintf("%s/%d.aof", w.dir, w.offset)
|
|
var err error
|
|
w.file, err = os.OpenFile(w.filepath, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0644)
|
|
if err != nil {
|
|
log.Panicf(err.Error())
|
|
}
|
|
w.offset = offset
|
|
w.filesize = 0
|
|
log.Debugf("[%s] open file for write. filename=[%s]", w.name, w.filepath)
|
|
}
|
|
|
|
func (w *AOFWriter) Write(buf []byte) {
|
|
_, err := w.file.Write(buf)
|
|
if err != nil {
|
|
log.Panicf(err.Error())
|
|
}
|
|
w.offset += int64(len(buf))
|
|
w.filesize += int64(len(buf))
|
|
if w.filesize > MaxFileSize {
|
|
w.Close()
|
|
w.openFile(w.offset)
|
|
}
|
|
err = w.file.Sync()
|
|
if err != nil {
|
|
log.Panicf(err.Error())
|
|
}
|
|
}
|
|
|
|
func (w *AOFWriter) Close() {
|
|
if w.file == nil {
|
|
return
|
|
}
|
|
err := w.file.Sync()
|
|
if err != nil {
|
|
log.Panicf(err.Error())
|
|
}
|
|
err = w.file.Close()
|
|
if err != nil {
|
|
log.Panicf(err.Error())
|
|
}
|
|
log.Infof("[%s] close file. filename=[%s], filesize=[%d]", w.name, w.filepath, w.filesize)
|
|
}
|
|
|