From 49015b00fecc72ff01dd8487ddf7f82b15de5a54 Mon Sep 17 00:00:00 2001 From: Joe Tsai Date: Tue, 11 Jul 2023 10:51:51 -0700 Subject: [PATCH] logtail: fix race condition with sockstats label (#8578) Updates tailscale/corp#8427 Signed-off-by: Joe Tsai --- logtail/logtail.go | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/logtail/logtail.go b/logtail/logtail.go index 26abe0918..0ca028145 100644 --- a/logtail/logtail.go +++ b/logtail/logtail.go @@ -146,7 +146,6 @@ func NewLogger(cfg Config, logf tslogger.Logf) *Logger { flushDelayFn: cfg.FlushDelayFn, timeNow: cfg.TimeNow, metricsDelta: cfg.MetricsDelta, - sockstatsLabel: sockstats.LabelLogtailLogger, procID: procID, includeProcSequence: cfg.IncludeProcSequence, @@ -154,6 +153,7 @@ func NewLogger(cfg Config, logf tslogger.Logf) *Logger { shutdownStart: make(chan struct{}), shutdownDone: make(chan struct{}), } + l.SetSockstatsLabel(sockstats.LabelLogtailLogger) if cfg.NewZstdEncoder != nil { l.zstdEncoder = cfg.NewZstdEncoder() } @@ -188,7 +188,7 @@ type Logger struct { metricsDelta func() string // or nil privateID logid.PrivateID httpDoCalls atomic.Int32 - sockstatsLabel sockstats.Label + sockstatsLabel atomicSocktatsLabel procID uint32 includeProcSequence bool @@ -202,6 +202,11 @@ type Logger struct { shutdownDone chan struct{} // closed when shutdown complete } +type atomicSocktatsLabel struct{ p atomic.Uint32 } + +func (p *atomicSocktatsLabel) Load() sockstats.Label { return sockstats.Label(p.p.Load()) } +func (p *atomicSocktatsLabel) Store(label sockstats.Label) { p.p.Store(uint32(label)) } + // SetVerbosityLevel controls the verbosity level that should be // written to stderr. 0 is the default (not verbose). Levels 1 or higher // are increasingly verbose. @@ -219,7 +224,7 @@ func (l *Logger) SetNetMon(lm *netmon.Monitor) { // SetSockstatsLabel sets the label used in sockstat logs to identify network traffic from this logger. func (l *Logger) SetSockstatsLabel(label sockstats.Label) { - l.sockstatsLabel = label + l.sockstatsLabel.Store(label) } // PrivateID returns the logger's private log ID. @@ -445,7 +450,7 @@ func (l *Logger) awaitInternetUp(ctx context.Context) { // origlen of -1 indicates that the body is not compressed. func (l *Logger) upload(ctx context.Context, body []byte, origlen int) (retryAfter time.Duration, err error) { const maxUploadTime = 45 * time.Second - ctx = sockstats.WithSockStats(ctx, l.sockstatsLabel, l.Logf) + ctx = sockstats.WithSockStats(ctx, l.sockstatsLabel.Load(), l.Logf) ctx, cancel := context.WithTimeout(ctx, maxUploadTime) defer cancel()