Skip to content

[bug]: Data Race in Log Rotator During Startup #10867

Description

@Euler-B

Pre-Submission Checklist

  • I have searched the existing issues and believe this is a new bug.
  • I am not asking a question about how to use lnd, but reporting a bug (otherwise open a discussion).

LND Version

v0.20.99-beta-f21262dd6


LND Configuration

Minimal configuration for simnet with btcd backend (no lnd.conf file used, all parameters passed via command line):

./lnd-race \
  --bitcoin.simnet \
  --bitcoin.node=btcd \
  --btcd.rpcuser=devuser \
  --btcd.rpcpass=devpass \
  --btcd.rpchost=127.0.0.1:18556 \
  --btcd.rpccert=/btcd-data/rpc.cert \
  --lnddir=/lnd-data \
  --noseedbackup \
  --debuglevel=info \
  --rpclisten=127.0.0.1:10009 \
  --listen=127.0.0.1:9735

Backend Version

btcd version 0.26.0-betarc1


Backend Configuration

btcd started with minimal simnet configuration:

btcd --simnet \
  --datadir=/btcd-data \
  --logdir=/btcd-data/logs \
  --rpcuser=devuser \
  --rpcpass=devpass \
  --rpclisten=127.0.0.1:18556 \
  --listen=127.0.0.1:18555 \
  --rpccert=/btcd-data/rpc.cert \
  --rpckey=/btcd-data/rpc.key \
  --txindex \
  --debuglevel=info

OS/Distribution

6.12.91-1-MANJARO x86_64 GNU/Linux

Bug Details & Steps to Reproduce

Description

A data race occurs in the log rotator during lnd startup. The race is between:

  1. The main goroutine writing logs via RotatingLogWriter.Write()
  2. A background goroutine running rotator.Run() that reads from the same rotator instance

Steps to Reproduce

  1. Start btcd in simnet mode:

    btcd --simnet \
      --datadir=/btcd-data \
      --logdir=/btcd-data/logs \
      --rpcuser=devuser \
      --rpcpass=devpass \
      --rpclisten=127.0.0.1:18556 \
      --listen=127.0.0.1:18555 \
      --rpccert=/btcd-data/rpc.cert \
      --rpckey=/btcd-data/rpc.key \
      --txindex \
      --debuglevel=info
  2. Build lnd with race detector:

    go build -race -o lnd-race ./cmd/lnd
  3. Start lnd with race detector in simnet mode:

    ./lnd-race \
      --bitcoin.simnet \
      --bitcoin.node=btcd \
      --btcd.rpcuser=devuser \
      --btcd.rpcpass=devpass \
      --btcd.rpchost=127.0.0.1:18556 \
      --btcd.rpccert=/btcd-data/rpc.cert \
      --lnddir=/lnd-data \
      --noseedbackup \
      --debuglevel=info \
      --rpclisten=127.0.0.1:10009 \
      --listen=127.0.0.1:9735
  4. Observe data race warning immediately during startup (no shutdown required)


Expected Behavior

The log rotator should be thread-safe, allowing concurrent writes from multiple goroutines without triggering data race warnings when built with -race.


Debug Information

==================
WARNING: DATA RACE
Write at 0x00c000723650 by main goroutine:
  github.com/jrick/logrotate/rotator.(*Rotator).Write()
      /home/euler/go/pkg/mod/github.com/jrick/logrotate@v1.1.2/rotator/rotator.go:160 +0x85
  github.com/lightningnetwork/lnd/build.(*RotatingLogWriter).Write()
      /home/euler/Projects/Golang/lnd/build/logrotator.go:92 +0x77
  github.com/btcsuite/btclog/v2.(*DefaultHandler).Handle()
      /home/euler/go/pkg/mod/github.com/btcsuite/btclog/v2@v2.0.1-0.20250728225537-6090e87c6c5b/handler.go:252 +0xf4b
  github.com/lightningnetwork/lnd/build.(*handlerSet).Handle()
      /home/euler/Projects/Golang/lnd/build/handler_sets.go:47 +0x14c
  log/slog.(*Logger).log()
      /usr/lib/go/src/log/slog/logger.go:256 +0x2b6
  log/slog.(*Logger).Log()
      /usr/lib/go/src/log/slog/logger.go:189 +0x156
  github.com/btcsuite/btclog/v2.(*sLogger).Warnf()
      /home/euler/go/pkg/mod/github.com/btcsuite/btclog/v2@v2.0.1-0.20250728225537-6090e87c6c5b/log.go:117 +0xb5
  github.com/lightningnetwork/lnd/build.(*ShutdownLogger).Warnf()
      <autogenerated>:1 +0x75
  github.com/lightningnetwork/lnd.LoadConfig()
      /home/euler/Projects/Golang/lnd/config.go:943 +0xc26
  main.main()
      /home/euler/Projects/Golang/lnd/cmd/lnd/main.go:22 +0x17a

Previous read at 0x00c000723650 by goroutine 28:
  github.com/jrick/logrotate/rotator.(*Rotator).Run()
      /home/euler/go/pkg/mod/github.com/jrick/logrotate@v1.1.2/rotator/rotator.go:118 +0x1bb
  github.com/lightningnetwork/lnd/build.(*RotatingLogWriter).InitLogRotator.func1()
      /home/euler/Projects/Golang/lnd/build/logrotator.go:77 +0x57

Goroutine 28 (running) created at:
  github.com/lightningnetwork/lnd/build.(*RotatingLogWriter).InitLogRotator()
      /home/euler/Projects/Golang/lnd/build/logrotator.go:76 +0x8f2
  github.com/lightningnetwork/lnd.ValidateConfig()
      /home/euler/Projects/Golang/lnd/config.go:1552 +0x8073
  github.com/lightningnetwork/lnd.LoadConfig()
      /home/euler/Projects/Golang/lnd/config.go:913 +0xa99
  main.main()
      /home/euler/Projects/Golang/lnd/cmd/lnd/main.go:22 +0x17a
==================

Environment

  • Network: simnet (private simulation network)
  • Container: None (running directly on host)
  • Other applications: None (clean environment)

Note: This is a different data race from the one reported in issue #6137 ("signal: data-race during shutdown"). While issue #6137 involves the signal package's logger during shutdown, this issue involves the log rotator during startup and is consistently reproducible.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions