Skip to content

Commit

Permalink
Fix idle flushing corner case in lib/logbuf by using lib/bufwriter pa…
Browse files Browse the repository at this point in the history
…ckage.
  • Loading branch information
rgooch committed Feb 3, 2019
1 parent 400d678 commit 8ee3f45
Show file tree
Hide file tree
Showing 2 changed files with 9 additions and 11 deletions.
4 changes: 2 additions & 2 deletions lib/logbuf/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
package logbuf

import (
"bufio"
"container/ring"
"flag"
"io"
Expand All @@ -18,6 +17,7 @@ import (
"sync"
"time"

"github.com/Symantec/Dominator/lib/bufwriter"
"github.com/Symantec/Dominator/lib/flagutil"
)

Expand All @@ -38,7 +38,7 @@ type LogBuffer struct {
rwMutex sync.RWMutex
buffer *ring.Ring // Always points to next insert position.
file *os.File
writer *bufio.Writer
writer *bufwriter.Writer
fileSize flagutil.Size
usage flagutil.Size
writeNotifier chan<- struct{}
Expand Down
16 changes: 7 additions & 9 deletions lib/logbuf/impl.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import (
"syscall"
"time"

"github.com/Symantec/Dominator/lib/bufwriter"
"github.com/Symantec/Dominator/lib/flagutil"
"github.com/Symantec/Dominator/lib/format"
)
Expand Down Expand Up @@ -61,7 +62,7 @@ func (lb *LogBuffer) setupFileLogging() error {
}
writeNotifier := make(chan struct{}, 1)
lb.writeNotifier = writeNotifier
go lb.flushWhenIdle(writeNotifier)
go lb.idleMarker(writeNotifier)
return nil
}

Expand Down Expand Up @@ -196,7 +197,7 @@ func (lb *LogBuffer) openNewFile() error {
syscall.Dup2(int(file.Fd()), int(os.Stderr.Fd()))
}
lb.file = file
lb.writer = bufio.NewWriter(file)
lb.writer = bufwriter.NewWriter(file, time.Second)
symlink := path.Join(lb.options.Directory, "latest")
tmpSymlink := symlink + "~"
os.Remove(tmpSymlink)
Expand Down Expand Up @@ -275,23 +276,20 @@ func (lb *LogBuffer) enforceQuota() error {
return nil
}

func (lb *LogBuffer) flushWhenIdle(writeNotifier <-chan struct{}) {
flushTimer := time.NewTimer(time.Second)
func (lb *LogBuffer) idleMarker(writeNotifier <-chan struct{}) {
idleMarkDuration := lb.options.IdleMarkTimeout
if idleMarkDuration < 1 {
idleMarkDuration = time.Hour * 24 * 365 * 280 // Far in the future.
for {
<-writeNotifier
}
}
idleMarkTimer := time.NewTimer(idleMarkDuration)
for {
select {
case <-writeNotifier:
flushTimer.Reset(time.Second)
idleMarkTimer.Reset(idleMarkDuration)
case <-flushTimer.C:
lb.flush()
case <-idleMarkTimer.C:
lb.writeMark()
flushTimer.Reset(time.Second)
idleMarkTimer.Reset(idleMarkDuration)
}
}
Expand Down

0 comments on commit 8ee3f45

Please sign in to comment.