use io.LimitedReader; fix logger prefix concurrent

This commit is contained in:
hdt3213
2021-07-10 22:00:43 +08:00
parent a4cfd87a44
commit 3e4531348c
3 changed files with 18 additions and 39 deletions

8
aof.go
View File

@@ -5,7 +5,6 @@ import (
"github.com/hdt3213/godis/datastruct/dict"
"github.com/hdt3213/godis/datastruct/lock"
"github.com/hdt3213/godis/lib/logger"
"github.com/hdt3213/godis/lib/utils"
"github.com/hdt3213/godis/redis/parser"
"github.com/hdt3213/godis/redis/reply"
"io"
@@ -78,7 +77,12 @@ func (db *DB) loadAof(maxBytes int) {
}
defer file.Close()
reader := utils.NewLimitedReader(file, maxBytes)
var reader io.Reader
if maxBytes > 0 {
reader = io.LimitReader(file, int64(maxBytes))
} else {
reader = file
}
ch := parser.ParseStream(reader)
for p := range ch {
if p.Err != nil {

View File

@@ -7,6 +7,7 @@ import (
"os"
"path/filepath"
"runtime"
"sync"
"time"
)
@@ -23,6 +24,7 @@ var (
defaultPrefix = ""
defaultCallerDepth = 2
logger *log.Logger
mu sync.Mutex
logPrefix = ""
levelFlags = []string{"DEBUG", "INFO", "WARN", "ERROR", "FATAL"}
)
@@ -75,30 +77,40 @@ func setPrefix(level logLevel) {
// Debug prints debug log
func Debug(v ...interface{}) {
mu.Lock()
defer mu.Unlock()
setPrefix(DEBUG)
logger.Println(v...)
}
// Info prints normal log
func Info(v ...interface{}) {
mu.Lock()
defer mu.Unlock()
setPrefix(INFO)
logger.Println(v...)
}
// Warn prints warning log
func Warn(v ...interface{}) {
mu.Lock()
defer mu.Unlock()
setPrefix(WARNING)
logger.Println(v...)
}
// Error prints error log
func Error(v ...interface{}) {
mu.Lock()
defer mu.Unlock()
setPrefix(ERROR)
logger.Println(v...)
}
// Fatal prints error log then stop the program
func Fatal(v ...interface{}) {
mu.Lock()
defer mu.Unlock()
setPrefix(FATAL)
logger.Fatalln(v...)
}

View File

@@ -1,37 +0,0 @@
package utils
import (
"errors"
"io"
)
// LimitedReader implements io.Reader, but you can only read the given number of bytes
type LimitedReader struct {
src io.Reader
n int
limit int
}
// NewLimitedReader wraps an io.Reader to LimitedReader
func NewLimitedReader(src io.Reader, limit int) *LimitedReader {
return &LimitedReader{
src: src,
limit: limit,
}
}
// Read reads up to len(p) bytes into p. if meets EOF from src or reach limit, it returns EOF
func (r *LimitedReader) Read(p []byte) (n int, err error) {
if r.src == nil {
return 0, errors.New("no data source")
}
if r.limit > 0 && r.n >= r.limit {
return 0, io.EOF
}
n, err = r.src.Read(p)
if err != nil {
return n, err
}
r.n += n
return
}