Skip to content

Commit

Permalink
Change buffer to be managed by another structure
Browse files Browse the repository at this point in the history
  • Loading branch information
daichirata committed Dec 15, 2017
1 parent 38301f4 commit e0f40b1
Show file tree
Hide file tree
Showing 2 changed files with 68 additions and 32 deletions.
48 changes: 48 additions & 0 deletions buffer.go
Original file line number Original file line Diff line number Diff line change
@@ -0,0 +1,48 @@
package fluent

import (
"sync"
)

type buffer struct {
buf []byte
mu sync.Mutex
Dirty chan struct{}
}

func newBuffer() buffer {
return buffer{
buf: []byte{},
Dirty: make(chan struct{}),
}
}

func (buffer *buffer) Add(raw []byte) {
buffer.mu.Lock()
defer buffer.mu.Unlock()

buffer.buf = append(buffer.buf, raw...)
go func() {
buffer.Dirty <- struct{}{}
}()
}

func (buffer *buffer) Remove() []byte {
buffer.mu.Lock()
defer buffer.mu.Unlock()

if len(buffer.buf) == 0 {
return nil
}

data := buffer.buf
buffer.buf = buffer.buf[:0]
return data
}

func (buffer *buffer) Back(raw []byte) {
buffer.mu.Lock()
defer buffer.mu.Unlock()

buffer.buf = append(buffer.buf, raw...)
}
52 changes: 20 additions & 32 deletions logger.go
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -34,22 +34,19 @@ func withDefaultConfig(c Config) Config {
} }


type Logger struct { type Logger struct {
conf Config conf Config
conn io.WriteCloser conn io.WriteCloser
bmu sync.Mutex mu sync.Mutex
cmu sync.Mutex buf buffer
buf []byte wg sync.WaitGroup
wg sync.WaitGroup done chan struct{}
done chan struct{}
dirty chan struct{}
} }


func NewLogger(c Config) (*Logger, error) { func NewLogger(c Config) (*Logger, error) {
logger := &Logger{ logger := &Logger{
conf: withDefaultConfig(c), conf: withDefaultConfig(c),
buf: []byte{}, buf: newBuffer(),
done: make(chan struct{}), done: make(chan struct{}),
dirty: make(chan struct{}),
} }
if err := logger.connect(); err != nil { if err := logger.connect(); err != nil {
return nil, err return nil, err
Expand All @@ -74,15 +71,7 @@ func (logger *Logger) PostWithTime(tag string, t time.Time, obj interface{}) err
if err := enc.Encode(record); err != nil { if err := enc.Encode(record); err != nil {
return err return err
} }
raw := buf.Bytes() logger.buf.Add(buf.Bytes())

logger.bmu.Lock()
logger.buf = append(logger.buf, raw...)
logger.bmu.Unlock()

go func() {
logger.dirty <- struct{}{}
}()
return nil return nil
} }


Expand All @@ -92,8 +81,8 @@ func (logger *Logger) Close() error {
} }


func (logger *Logger) connect() error { func (logger *Logger) connect() error {
logger.cmu.Lock() logger.mu.Lock()
defer logger.cmu.Unlock() defer logger.mu.Unlock()


if logger.conn != nil { if logger.conn != nil {
return nil return nil
Expand All @@ -116,8 +105,8 @@ func (logger *Logger) connect() error {
} }


func (logger *Logger) disconnect() error { func (logger *Logger) disconnect() error {
logger.cmu.Lock() logger.mu.Lock()
defer logger.cmu.Unlock() defer logger.mu.Unlock()


if logger.conn == nil { if logger.conn == nil {
return nil return nil
Expand All @@ -130,26 +119,25 @@ func (logger *Logger) disconnect() error {
const maxWriteAttempts = 3 const maxWriteAttempts = 3


func (logger *Logger) send() error { func (logger *Logger) send() error {
logger.bmu.Lock() data := logger.buf.Remove()
defer logger.bmu.Unlock()

data := logger.buf
if len(data) == 0 { if len(data) == 0 {
return nil return nil
} }

var err error var err error
for i := 0; i < maxWriteAttempts; i++ { for i := 0; i < maxWriteAttempts; i++ {
err = logger.connect() err = logger.connect()
if err == nil { if err == nil {
_, err := logger.conn.Write(data) _, err := logger.conn.Write(data)
if err == nil { if err == nil {
logger.buf = logger.buf[:0]
break break
} }
} }
logger.disconnect() logger.disconnect()
} }

if err != nil {
logger.buf.Back(data)
}
return err return err
} }


Expand All @@ -163,7 +151,7 @@ func (logger *Logger) start() {
case <-logger.done: case <-logger.done:
logger.send() logger.send()
return return
case <-logger.dirty: case <-logger.buf.Dirty:
case <-ticker.C: case <-ticker.C:
} }
logger.send() logger.send()
Expand Down

0 comments on commit e0f40b1

Please sign in to comment.