Skip to content

JetStream data-race between checkBytesLimits() and reserveStreamResources() [v2.11.3] #7288

@keon94

Description

@keon94

Observed behavior

Running our tests with the go 'race' flag at times produces this:

==================
WARNING: DATA RACE

Read at 0x00c000b72020 by goroutine 378:
  github.com/nats-io/nats-server/v2/server.(*jetStream).checkBytesLimits()
      /builds/.go/pkg/mod/github.com/nats-io/nats-server/[email protected]/server/jetstream.go:2329 +0x1c7
  github.com/nats-io/nats-server/v2/server.(*jetStream).checkLimits()
      /builds/.go/pkg/mod/github.com/nats-io/nats-server/[email protected]/server/jetstream.go:2302 +0x151
  github.com/nats-io/nats-server/v2/server.(*jetStream).checkAllLimits()
      /builds/.go/pkg/mod/github.com/nats-io/nats-server/[email protected]/server/jetstream.go:2290 +0x272
  github.com/nats-io/nats-server/v2/server.(*Account).jsNonClusteredStreamLimitsCheck()
      /builds/.go/pkg/mod/github.com/nats-io/nats-server/[email protected]/server/jetstream_api.go:3738 +0x233
  github.com/nats-io/nats-server/v2/server.(*Server).jsStreamCreateRequest()
      /builds/.go/pkg/mod/github.com/nats-io/nats-server/[email protected]/server/jetstream_api.go:1629 +0xba4
  github.com/nats-io/nats-server/v2/server.(*Server).jsStreamCreateRequest-fm()
      <autogenerated>:1 +0xcb
  github.com/nats-io/nats-server/v2/server.(*jetStream).apiDispatch()
      /builds/.go/pkg/mod/github.com/nats-io/nats-server/[email protected]/server/jetstream_api.go:876 +0xb0a
  github.com/nats-io/nats-server/v2/server.(*jetStream).apiDispatch-fm()
      <autogenerated>:1 +0xcb
  github.com/nats-io/nats-server/v2/server.(*client).deliverMsg()
      /builds/.go/pkg/mod/github.com/nats-io/nats-server/[email protected]/server/client.go:3628 +0xfd0
  github.com/nats-io/nats-server/v2/server.(*client).processMsgResults()
      /builds/.go/pkg/mod/github.com/nats-io/nats-server/[email protected]/server/client.go:4840 +0x1314
  github.com/nats-io/nats-server/v2/server.(*client).processServiceImport()
      /builds/.go/pkg/mod/github.com/nats-io/nats-server/[email protected]/server/client.go:4576 +0x2099
  github.com/nats-io/nats-server/v2/server.(*Account).addServiceImportSub.func1()
      /builds/.go/pkg/mod/github.com/nats-io/nats-server/[email protected]/server/accounts.go:2149 +0x4d
  github.com/nats-io/nats-server/v2/server.(*client).deliverMsg()
      /builds/.go/pkg/mod/github.com/nats-io/nats-server/[email protected]/server/client.go:3622 +0x10a2
  github.com/nats-io/nats-server/v2/server.(*client).processMsgResults()
      /builds/.go/pkg/mod/github.com/nats-io/nats-server/[email protected]/server/client.go:4840 +0x1314
  github.com/nats-io/nats-server/v2/server.(*client).processInboundClientMsg()
      /builds/.go/pkg/mod/github.com/nats-io/nats-server/[email protected]/server/client.go:4141 +0x172c
  github.com/nats-io/nats-server/v2/server.(*client).processInboundMsg()
      /builds/.go/pkg/mod/github.com/nats-io/nats-server/[email protected]/server/client.go:3967 +0x88
  github.com/nats-io/nats-server/v2/server.(*client).parse()
      /builds/.go/pkg/mod/github.com/nats-io/nats-server/[email protected]/server/parser.go:511 +0x3597
  github.com/nats-io/nats-server/v2/server.(*client).readLoop()
      /builds/.go/pkg/mod/github.com/nats-io/nats-server/[email protected]/server/client.go:1404 +0x1ae4
  github.com/nats-io/nats-server/v2/server.(*Server).createClientEx.func1()
      /builds/.go/pkg/mod/github.com/nats-io/nats-server/[email protected]/server/server.go:3380 +0x54
  github.com/nats-io/nats-server/v2/server.(*Server).startGoRoutine.func1()
      /builds/.go/pkg/mod/github.com/nats-io/nats-server/[email protected]/server/server.go:3880 +0x59
      
      
Previous write at 0x00c000b72020 by goroutine 396:
  github.com/nats-io/nats-server/v2/server.(*jetStream).reserveStreamResources()
      /builds/.go/pkg/mod/github.com/nats-io/nats-server/[email protected]/server/jetstream.go:2487 +0x144
  github.com/nats-io/nats-server/v2/server.(*Account).addStreamWithAssignment()
      /builds/.go/pkg/mod/github.com/nats-io/nats-server/[email protected]/server/stream.go:778 +0x3729
  github.com/nats-io/nats-server/v2/server.(*Account).addStreamPedantic()
      /builds/.go/pkg/mod/github.com/nats-io/nats-server/[email protected]/server/stream.go:475 +0xbe4
  github.com/nats-io/nats-server/v2/server.(*Server).jsStreamCreateRequest()
      /builds/.go/pkg/mod/github.com/nats-io/nats-server/[email protected]/server/jetstream_api.go:1635 +0xbae
  github.com/nats-io/nats-server/v2/server.(*Server).jsStreamCreateRequest-fm()
      <autogenerated>:1 +0xcb
  github.com/nats-io/nats-server/v2/server.(*jetStream).apiDispatch()
      /builds/.go/pkg/mod/github.com/nats-io/nats-server/[email protected]/server/jetstream_api.go:876 +0xb0a
  github.com/nats-io/nats-server/v2/server.(*jetStream).apiDispatch-fm()
      <autogenerated>:1 +0xcb
  github.com/nats-io/nats-server/v2/server.(*client).deliverMsg()
      /builds/.go/pkg/mod/github.com/nats-io/nats-server/[email protected]/server/client.go:3628 +0xfd0
  github.com/nats-io/nats-server/v2/server.(*client).processMsgResults()
      /builds/.go/pkg/mod/github.com/nats-io/nats-server/[email protected]/server/client.go:4840 +0x1314
  github.com/nats-io/nats-server/v2/server.(*client).processServiceImport()
      /builds/.go/pkg/mod/github.com/nats-io/nats-server/[email protected]/server/client.go:4576 +0x2099
  github.com/nats-io/nats-server/v2/server.(*Account).addServiceImportSub.func1()
      /builds/.go/pkg/mod/github.com/nats-io/nats-server/[email protected]/server/accounts.go:2149 +0x4d
  github.com/nats-io/nats-server/v2/server.(*client).deliverMsg()
      /builds/.go/pkg/mod/github.com/nats-io/nats-server/[email protected]/server/client.go:3622 +0x10a2
  github.com/nats-io/nats-server/v2/server.(*client).processMsgResults()
      /builds/.go/pkg/mod/github.com/nats-io/nats-server/[email protected]/server/client.go:4840 +0x1314
  github.com/nats-io/nats-server/v2/server.(*client).processInboundClientMsg()
      /builds/.go/pkg/mod/github.com/nats-io/nats-server/[email protected]/server/client.go:4141 +0x172c
  github.com/nats-io/nats-server/v2/server.(*client).processInboundMsg()
      /builds/.go/pkg/mod/github.com/nats-io/nats-server/[email protected]/server/client.go:3967 +0x88
  github.com/nats-io/nats-server/v2/server.(*client).parse()
      /builds/.go/pkg/mod/github.com/nats-io/nats-server/[email protected]/server/parser.go:511 +0x3597
  github.com/nats-io/nats-server/v2/server.(*client).readLoop()
      /builds/.go/pkg/mod/github.com/nats-io/nats-server/[email protected]/server/client.go:1404 +0x1ae4
  github.com/nats-io/nats-server/v2/server.(*Server).createClientEx.func1()
      /builds/.go/pkg/mod/github.com/nats-io/nats-server/[email protected]/server/server.go:3380 +0x54
  github.com/nats-io/nats-server/v2/server.(*Server).startGoRoutine.func1()
      /builds/.go/pkg/mod/github.com/nats-io/nats-server/[email protected]/server/server.go:3880 +0x59
      
      
Goroutine 378 (running) created at:
  github.com/nats-io/nats-server/v2/server.(*Server).startGoRoutine()
      /builds/.go/pkg/mod/github.com/nats-io/nats-server/[email protected]/server/server.go:3878 +0x1af
  github.com/nats-io/nats-server/v2/server.(*Server).createClientEx()
      /builds/.go/pkg/mod/github.com/nats-io/nats-server/[email protected]/server/server.go:3380 +0x1b3b
  github.com/nats-io/nats-server/v2/server.(*Server).createClient()
      /builds/.go/pkg/mod/github.com/nats-io/nats-server/[email protected]/server/server.go:3135 +0x44
  github.com/nats-io/nats-server/v2/server.(*Server).AcceptLoop.func2()
      /builds/.go/pkg/mod/github.com/nats-io/nats-server/[email protected]/server/server.go:2746 +0xe
  github.com/nats-io/nats-server/v2/server.(*Server).acceptConnections.func1()
      /builds/.go/pkg/mod/github.com/nats-io/nats-server/[email protected]/server/server.go:2798 +0x6d
  github.com/nats-io/nats-server/v2/server.(*Server).startGoRoutine.func1()
      /builds/.go/pkg/mod/github.com/nats-io/nats-server/[email protected]/server/server.go:3880 +0x59
      
      
Goroutine 396 (running) created at:
  github.com/nats-io/nats-server/v2/server.(*Server).startGoRoutine()
      /builds/.go/pkg/mod/github.com/nats-io/nats-server/[email protected]/server/server.go:3878 +0x1af
  github.com/nats-io/nats-server/v2/server.(*Server).createClientEx()
      /builds/.go/pkg/mod/github.com/nats-io/nats-server/[email protected]/server/server.go:3380 +0x1b3b
  github.com/nats-io/nats-server/v2/server.(*Server).createClient()
      /builds/.go/pkg/mod/github.com/nats-io/nats-server/[email protected]/server/server.go:3135 +0x44
  github.com/nats-io/nats-server/v2/server.(*Server).AcceptLoop.func2()
      /builds/.go/pkg/mod/github.com/nats-io/nats-server/[email protected]/server/server.go:2746 +0xe
  github.com/nats-io/nats-server/v2/server.(*Server).acceptConnections.func1()
      /builds/.go/pkg/mod/github.com/nats-io/nats-server/[email protected]/server/server.go:2798 +0x6d
  github.com/nats-io/nats-server/v2/server.(*Server).startGoRoutine.func1()
      /builds/.go/pkg/mod/github.com/nats-io/nats-server/[email protected]/server/server.go:3880 +0x59
==================

context:

Several Jetstream consumers (each on a goroutine) that interact with a Jetstream KV store (read and write) and possibly publish a message back to a consumer each time they receive a message and Ack/Nack it.

Main goroutine publishing message to one of these consumers and performing Put on the Jetstream KV store.

Expected behavior

No race condition reports.

Server and client version

server: v2.11.9, client v1.45.0
&
server v2.11.3, client v1.42.0

Host environment

Dockerized local Linux environment, x86 CPU arch.

Steps to reproduce

No response

Metadata

Metadata

Assignees

Labels

defectSuspected defect such as a bug or regression

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions