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

nats-io / nats-server / 30978441327
77%

Build:
DEFAULT BRANCH: main
Ran 05 Aug 2026 06:38AM 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: 75.699% (-1.6%) from 77.3%
30978441327

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)

71834 of 94894 relevant lines covered (75.7%)

603330.68 hits per line

Coverage Regressions

Lines Coverage ∆ File
401
83.16
0.18% src/github.com/nats-io/nats-server/server/jetstream_cluster.go
318
76.55
-11.28% src/github.com/nats-io/nats-server/server/leafnode.go
285
78.69
-8.29% src/github.com/nats-io/nats-server/server/accounts.go
223
44.65
-18.79% src/github.com/nats-io/nats-server/server/websocket.go
115
76.23
-8.59% src/github.com/nats-io/nats-server/server/auth.go
111
87.75
0.23% src/github.com/nats-io/nats-server/server/consumer.go
105
71.82
-2.66% src/github.com/nats-io/nats-server/server/jetstream_api.go
83
85.04
-2.55% src/github.com/nats-io/nats-server/server/server.go
78
87.68
-1.58% src/github.com/nats-io/nats-server/server/client.go
78
49.22
-15.18% src/github.com/nats-io/nats-server/server/dirstore.go
75
85.38
-1.08% src/github.com/nats-io/nats-server/server/stream.go
63
43.98
-32.98% src/github.com/nats-io/nats-server/server/jwt.go
63
62.33
-0.87% src/github.com/nats-io/nats-server/server/opts.go
54
51.67
-2.78% src/github.com/nats-io/nats-server/server/reload.go
33
80.14
0.68% src/github.com/nats-io/nats-server/server/raft.go
32
71.01
-1.5% src/github.com/nats-io/nats-server/server/memstore.go
26
55.91
0.42% src/github.com/nats-io/nats-server/server/log.go
24
56.86
-1.47% src/github.com/nats-io/nats-server/server/jetstream_errors_generated.go
18
70.26
-0.41% src/github.com/nats-io/nats-server/server/monitor.go
18
81.95
-0.72% src/github.com/nats-io/nats-server/server/route.go
14
84.9
-0.42% src/github.com/nats-io/nats-server/server/events.go
10
84.46
-0.37% src/github.com/nats-io/nats-server/server/jetstream.go
8
81.57
-0.75% src/github.com/nats-io/nats-server/server/parser.go
7
79.26
0.62% src/github.com/nats-io/nats-server/server/filestore.go
5
89.66
-0.42% src/github.com/nats-io/nats-server/server/sublist.go
4
97.16
-2.84% src/github.com/nats-io/nats-server/server/jetstream_versioning.go
4
86.07
-1.64% src/github.com/nats-io/nats-server/server/util.go
3
90.9
-0.38% src/github.com/nats-io/nats-server/server/jetstream_batching.go
1
93.76
0.04% src/github.com/nats-io/nats-server/server/gateway.go
Jobs
ID Job ID Ran Files Coverage
1 30978441327.1 05 Aug 2026 06:38AM UTC 67
75.7
GitHub Action Run
Source Files on build 30978441327
  • Tree
  • List 67
  • Changed 30
  • Source Changed 3
  • Coverage Changed 30
Coverage ∆ File Lines Relevant Covered Missed Hits/Line
  • Back to Repo
  • Github Actions Build #30978441327
  • db0a2c8c on github
  • Prev Build on main (#30881091947)
  • Next Build on main (#31074553791)
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