• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

nats-io / nats-server / 31074553791
77%

Build:
DEFAULT BRANCH: main
Ran 06 Aug 2026 06:40AM UTC
Jobs 1
Files 67
Run time 1min
Badge
Embed ▾
README BADGES
x

If you need to use a raster PNG badge, change the '.svg' to '.png' in the link

Markdown

Textile

RDoc

HTML

Rst

04 Aug 2026 03:38PM UTC coverage: 77.369% (+1.7%) from 75.699%
31074553791

push

github

web-flow
[FIXED] SetLoggerV2 deadlocks when prev logger errors on close (#8430)

Calling `s.Errorf(...)` within `s.logging.Lock(); ...;
s.logging.Unlock()` would result in a deadlock, 'cause `s.Errorf()`
tries to acquire the same mutex (`s.logging`).

Reproduction:

```go

// failingCloseLogger implements both server.Logger and io.Closer.
type failingCloseLogger struct{}

func (l *failingCloseLogger) Noticef(format string, v ...any) {}
// ... other server.Logger functions
func (l *failingCloseLogger) Close() error {
	return errors.New("simulated close error")
}

func main() {
	opts := &server.Options{
		Host:   "127.0.0.1",
		Port:   -1,
		NoLog:  true,
		NoSigs: true,
	}

	s, err := server.NewServer(opts)
	if err != nil {
		os.Exit(1)
	}

	s.SetLogger(&failingCloseLogger{}, false, false)
	fmt.Println("First logger installed.")

	done := make(chan struct{})
	go func() {
		s.SetLogger(&failingCloseLogger{}, false, false)
		close(done)
	}()

	select {
	case <-done:
		fmt.Println("Second logger installed.")
	case <-time.After(3 * time.Second):
		buf := make([]byte, 64<<10)
		numBytes := runtime.Stack(buf, true)
		fmt.Println(string(buf[:numBytes]))
		panic("deadlocked")
	}
}
```

Results in:

```sh
$ go run main.go

First logger installed.
goroutine 1 [running]:
main.main()
	eadlock-repro/main.go:54 +0x200

goroutine 5 [sync.RWMutex.RLock]:
sync.runtime_SemacquireRWMutexR(0x8adc4b17ee8?, 0xdc?, 0x10?)
	/opt/homebrew/Cellar/go/1.26.1/libexec/src/runtime/sema.go:100 +0x28
sync.(*RWMutex).RLock(...)
	/opt/homebrew/Cellar/go/1.26.1/libexec/src/sync/rwmutex.go:74
github.com/nats-io/nats-server/v2/server.(*Server).executeLogCall(0x8adc4c5a008, 0x104daab70, {0x1046cccfc, 0x18}, {0x8adc4ad2b20, 0x1, 0x1})
	nats-server/server/log.go:288 +0x90
github.com/nats-io/nats-server/v2/server.(*Server).Errorf(...)
	nats-server/server/log.go:189
github.com/nats-io/nats-server/v2/server.(*Server).SetLoggerV2(0x8adc4c5a008, {0x104db8088, 0x104e64e00}, 0x0?, 0x0?, 0x0?)
	nats-server/se... (continued)

73419 of 94894 relevant lines covered (77.37%)

540484.65 hits per line

Coverage Regressions

Lines Coverage ∆ File
67
79.02
-1.12% src/github.com/nats-io/nats-server/server/raft.go
54
82.91
-0.25% src/github.com/nats-io/nats-server/server/jetstream_cluster.go
30
87.83
0.08% src/github.com/nats-io/nats-server/server/consumer.go
13
74.09
2.27% src/github.com/nats-io/nats-server/server/jetstream_api.go
7
58.15
1.29% src/github.com/nats-io/nats-server/server/jetstream_errors_generated.go
6
70.67
0.41% src/github.com/nats-io/nats-server/server/monitor.go
5
79.27
0.01% src/github.com/nats-io/nats-server/server/filestore.go
4
63.42
1.09% src/github.com/nats-io/nats-server/server/opts.go
2
84.94
0.05% src/github.com/nats-io/nats-server/server/events.go
2
93.88
0.12% src/github.com/nats-io/nats-server/server/gateway.go
2
84.83
0.37% src/github.com/nats-io/nats-server/server/jetstream.go
Jobs
ID Job ID Ran Files Coverage
1 31074553791.1 06 Aug 2026 06:40AM UTC 67
77.37
GitHub Action Run
Source Files on build 31074553791
  • Tree
  • List 67
  • Changed 28
  • Source Changed 0
  • Coverage Changed 28
Coverage ∆ File Lines Relevant Covered Missed Hits/Line
  • Back to Repo
  • Github Actions Build #31074553791
  • db0a2c8c on github
  • Prev Build on main (#30978441327)
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE TRIAL · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc