diff --git a/aof.go b/aof.go index d410a86..6dfa4ad 100644 --- a/aof.go +++ b/aof.go @@ -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 { diff --git a/lib/logger/logger.go b/lib/logger/logger.go index 2bfbfe9..ddacba5 100644 --- a/lib/logger/logger.go +++ b/lib/logger/logger.go @@ -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...) } diff --git a/lib/utils/limited_reader.go b/lib/utils/limited_reader.go deleted file mode 100644 index f02fa31..0000000 --- a/lib/utils/limited_reader.go +++ /dev/null @@ -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 -}