Source File
sink.go
Belonging Package
google.golang.org/grpc/internal/binarylog
package binarylog
import (
pb
)
var (
defaultSink Sink = &noopSink{} // TODO(blog): change this default (file in /tmp).
)
func ( Sink) {
if defaultSink != nil {
defaultSink.Close()
}
defaultSink =
}
func ( io.Writer) *writerSink {
return &writerSink{out: }
}
type writerSink struct {
out io.Writer
}
func ( *writerSink) ( *pb.GrpcLogEntry) error {
, := proto.Marshal()
if != nil {
grpclogLogger.Infof("binary logging: failed to marshal proto message: %v", )
}
:= make([]byte, 4)
binary.BigEndian.PutUint32(, uint32(len()))
if , := .out.Write(); != nil {
return
}
if , := .out.Write(); != nil {
return
}
return nil
}
func ( *writerSink) () error { return nil }
type bufWriteCloserSink struct {
mu sync.Mutex
closer io.Closer
out *writerSink // out is built on buf.
buf *bufio.Writer // buf is kept for flush.
writeStartOnce sync.Once
writeTicker *time.Ticker
}
.writeStartOnce.Do(.startFlushGoroutine)
.mu.Lock()
if := .out.Write(); != nil {
.mu.Unlock()
return
}
.mu.Unlock()
return nil
}
const (
bufFlushDuration = 60 * time.Second
)
func ( *bufWriteCloserSink) () {
.writeTicker = time.NewTicker(bufFlushDuration)
go func() {
for range .writeTicker.C {
.mu.Lock()
.buf.Flush()
.mu.Unlock()
}
}()
}
func ( *bufWriteCloserSink) () error {
if .writeTicker != nil {
.writeTicker.Stop()
}
.mu.Lock()
.buf.Flush()
.closer.Close()
.out.Close()
.mu.Unlock()
return nil
}
func ( io.WriteCloser) Sink {
:= bufio.NewWriter()
return &bufWriteCloserSink{
closer: ,
out: newWriterSink(),
buf: ,
}
}
![]() |
The pages are generated with Golds v0.3.2-preview. (GOOS=darwin GOARCH=amd64) Golds is a Go 101 project developed by Tapir Liu. PR and bug reports are welcome and can be submitted to the issue list. Please follow @Go100and1 (reachable from the left QR code) to get the latest news of Golds. |