Skip to content
Snippets Groups Projects
Commit 4d7c1a06 authored by Semyon Krestyaninov's avatar Semyon Krestyaninov
Browse files

refactor: убран конструктор и опции для BufferedWriteSyncer

parent 597105d1
No related branches found
No related tags found
No related merge requests found
...@@ -9,6 +9,12 @@ import ( ...@@ -9,6 +9,12 @@ import (
"git.perx.ru/perxis/perxis-go/pkg/log" "git.perx.ru/perxis/perxis-go/pkg/log"
) )
const (
defaultMaxBufferSize = 1000
defaultMaxSyncQueueSize = 16
defaultFlushInterval = 5 * time.Second
)
var SyncQueueOverflow = errors.New("sync queue overflow") var SyncQueueOverflow = errors.New("sync queue overflow")
// BufferedWriteSyncer это WriteSyncer, который отправляет записи в log.Service. // BufferedWriteSyncer это WriteSyncer, который отправляет записи в log.Service.
...@@ -44,17 +50,23 @@ type BufferedWriteSyncer struct { ...@@ -44,17 +50,23 @@ type BufferedWriteSyncer struct {
stopped bool // stopped указывает, был ли выполнен Stop stopped bool // stopped указывает, был ли выполнен Stop
} }
func NewBufferedWriteSyncer(service log.Service, options ...Option) *BufferedWriteSyncer { func (ws *BufferedWriteSyncer) start() {
cfg := newConfig(options) if ws.Service == nil {
return &BufferedWriteSyncer{ panic("service is required")
FlushInterval: cfg.flushInterval,
MaxBufferSize: cfg.maxBufferSize,
MaxSyncQueueSize: cfg.maxSyncQueueSize,
Service: service,
} }
if ws.FlushInterval == 0 {
ws.FlushInterval = defaultFlushInterval
}
if ws.MaxBufferSize == 0 {
ws.MaxBufferSize = defaultMaxBufferSize
}
if ws.MaxSyncQueueSize == 0 {
ws.MaxSyncQueueSize = defaultMaxSyncQueueSize
} }
func (ws *BufferedWriteSyncer) start() {
ws.buffer = make([]*log.Entry, 0, ws.MaxBufferSize) ws.buffer = make([]*log.Entry, 0, ws.MaxBufferSize)
ws.syncQueue = make(chan []*log.Entry, ws.MaxSyncQueueSize) ws.syncQueue = make(chan []*log.Entry, ws.MaxSyncQueueSize)
ws.flushStop = make(chan struct{}) ws.flushStop = make(chan struct{})
......
...@@ -22,7 +22,7 @@ func TestBufferedWriteSyncer_Write(t *testing.T) { ...@@ -22,7 +22,7 @@ func TestBufferedWriteSyncer_Write(t *testing.T) {
}). }).
Once() Once()
ws := NewBufferedWriteSyncer(service) ws := &BufferedWriteSyncer{Service: service}
err := ws.Write(&log.Entry{Message: "first log message"}) err := ws.Write(&log.Entry{Message: "first log message"})
require.NoError(t, err) require.NoError(t, err)
...@@ -46,7 +46,7 @@ func TestBufferedWriteSyncer_Write_Concurrent(t *testing.T) { ...@@ -46,7 +46,7 @@ func TestBufferedWriteSyncer_Write_Concurrent(t *testing.T) {
}). }).
Once() Once()
ws := NewBufferedWriteSyncer(service) ws := &BufferedWriteSyncer{Service: service}
var wg sync.WaitGroup var wg sync.WaitGroup
for i := 0; i < 100; i++ { for i := 0; i < 100; i++ {
...@@ -77,7 +77,7 @@ func TestBufferedWriteSyncer_Flush(t *testing.T) { ...@@ -77,7 +77,7 @@ func TestBufferedWriteSyncer_Flush(t *testing.T) {
}). }).
Times(10) Times(10)
ws := NewBufferedWriteSyncer(service) ws := &BufferedWriteSyncer{Service: service}
for i := 0; i < 10; i++ { for i := 0; i < 10; i++ {
for j := 0; j < 10; j++ { for j := 0; j < 10; j++ {
...@@ -104,7 +104,7 @@ func TestBufferedWriteSyncer_MaxBufferSize(t *testing.T) { ...@@ -104,7 +104,7 @@ func TestBufferedWriteSyncer_MaxBufferSize(t *testing.T) {
}). }).
Times(10) Times(10)
ws := NewBufferedWriteSyncer(service, WithMaxBufferSize(10)) ws := &BufferedWriteSyncer{Service: service, MaxBufferSize: 10}
for i := 0; i < 100; i++ { for i := 0; i < 100; i++ {
err := ws.Write(&log.Entry{Message: "log message"}) err := ws.Write(&log.Entry{Message: "log message"})
...@@ -127,7 +127,7 @@ func TestBufferedWriteSyncer_FlushInterval(t *testing.T) { ...@@ -127,7 +127,7 @@ func TestBufferedWriteSyncer_FlushInterval(t *testing.T) {
}). }).
Once() Once()
ws := NewBufferedWriteSyncer(service, WithFlushInterval(time.Second)) ws := &BufferedWriteSyncer{Service: service, FlushInterval: time.Second}
for j := 0; j < 10; j++ { for j := 0; j < 10; j++ {
err := ws.Write(&log.Entry{Message: "log message"}) err := ws.Write(&log.Entry{Message: "log message"})
......
package zap
import (
"time"
)
const (
defaultMaxBufferSize = 1000
defaultMaxSyncQueueSize = 16
defaultFlushInterval = 5 * time.Second
)
type config struct {
flushInterval time.Duration
maxBufferSize int
maxSyncQueueSize int
}
func newConfig(options []Option) *config {
cfg := new(config)
for _, option := range options {
option(cfg)
}
if cfg.flushInterval == 0 {
cfg.flushInterval = defaultFlushInterval
}
if cfg.maxBufferSize == 0 {
cfg.maxBufferSize = defaultMaxBufferSize
}
if cfg.maxSyncQueueSize == 0 {
cfg.maxSyncQueueSize = defaultMaxSyncQueueSize
}
return cfg
}
type Option func(config *config)
// WithFlushInterval устанавливает значение для BufferedWriteSyncer.FlushInterval
func WithFlushInterval(interval time.Duration) Option {
return func(config *config) {
config.flushInterval = interval
}
}
// WithMaxBufferSize устанавливает значение для BufferedWriteSyncer.MaxBufferSize
func WithMaxBufferSize(size int) Option {
return func(config *config) {
config.maxBufferSize = size
}
}
// WithMaxSyncQueueSize устанавливает значение для BufferedWriteSyncer.MaxSyncQueueSize
func WithMaxSyncQueueSize(size int) Option {
return func(config *config) {
config.maxSyncQueueSize = size
}
}
...@@ -52,7 +52,7 @@ func TestExample(t *testing.T) { ...@@ -52,7 +52,7 @@ func TestExample(t *testing.T) {
}). }).
Once() Once()
ws := NewBufferedWriteSyncer(service) ws := &BufferedWriteSyncer{Service: service}
logger := zap.New(NewCore(ws)) logger := zap.New(NewCore(ws))
logger.Info("создан элемент коллекции", logger.Info("создан элемент коллекции",
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment