Pre-Submission Checklist
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:
- The main goroutine writing logs via
RotatingLogWriter.Write()
- A background goroutine running
rotator.Run() that reads from the same rotator instance
Steps to Reproduce
-
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
-
Build lnd with race detector:
go build -race -o lnd-race ./cmd/lnd
-
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
-
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.
Pre-Submission Checklist
LND Version
v0.20.99-beta-f21262dd6
LND Configuration
Minimal configuration for simnet with btcd backend (no
lnd.conffile used, all parameters passed via command line):Backend Version
btcd version 0.26.0-betarc1
Backend Configuration
btcd started with minimal simnet configuration:
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:
RotatingLogWriter.Write()rotator.Run()that reads from the same rotator instanceSteps to Reproduce
Start btcd in simnet mode:
Build lnd with race detector:
Start lnd with race detector in simnet mode:
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
Environment