hashicorp / memberlist

Golang package for gossip based membership and failure detection
Mozilla Public License 2.0
3.61k stars 435 forks source link

DATA RACE in invokeAckHandler #261

Open spikeekips opened 2 years ago

spikeekips commented 2 years ago

I implemented my own memberlist Transport for quic and I met data race like below.

==================
WARNING: DATA RACE
Read at 0x00c00000e370 by goroutine 19:
  github.com/hashicorp/memberlist.(*Memberlist).invokeAckHandler()
      .pkg/mod/github.com/hashicorp/memberlist@v0.3.1/state.go:874 +0x137
  github.com/hashicorp/memberlist.(*Memberlist).handleAck()
      .pkg/mod/github.com/hashicorp/memberlist@v0.3.1/net.go:669 +0x267
  github.com/hashicorp/memberlist.(*Memberlist).handleCommand()
      .pkg/mod/github.com/hashicorp/memberlist@v0.3.1/net.go:439 +0x1a4
  github.com/hashicorp/memberlist.(*Memberlist).ingestPacket()
      .pkg/mod/github.com/hashicorp/memberlist@v0.3.1/net.go:414 +0x8d8
  github.com/hashicorp/memberlist.(*Memberlist).packetListen()
      .pkg/mod/github.com/hashicorp/memberlist@v0.3.1/net.go:352 +0xe9
  github.com/hashicorp/memberlist.newMemberlist·dwrap·5()
      .pkg/mod/github.com/hashicorp/memberlist@v0.3.1/memberlist.go:228 +0x39

Previous write at 0x00c00000e370 by goroutine 24:
  github.com/hashicorp/memberlist.(*Memberlist).setProbeChannels()
      .pkg/mod/github.com/hashicorp/memberlist@v0.3.1/state.go:835 +0x353
  github.com/hashicorp/memberlist.(*Memberlist).probeNode()
      .pkg/mod/github.com/hashicorp/memberlist@v0.3.1/state.go:310 +0x628
  github.com/hashicorp/memberlist.(*Memberlist).probe()
      .pkg/mod/github.com/hashicorp/memberlist@v0.3.1/state.go:255 +0x364
  github.com/hashicorp/memberlist.(*Memberlist).probe-fm()
      .pkg/mod/github.com/hashicorp/memberlist@v0.3.1/state.go:214 +0x39
  github.com/hashicorp/memberlist.(*Memberlist).triggerFunc()
      .pkg/mod/github.com/hashicorp/memberlist@v0.3.1/state.go:157 +0x156
  github.com/hashicorp/memberlist.(*Memberlist).schedule·dwrap·38()
      .pkg/mod/github.com/hashicorp/memberlist@v0.3.1/state.go:121 +0x71

Goroutine 19 (running) created at:
  github.com/hashicorp/memberlist.newMemberlist()
      .pkg/mod/github.com/hashicorp/memberlist@v0.3.1/memberlist.go:228 +0x146a
  github.com/hashicorp/memberlist.Create()
      .pkg/mod/github.com/hashicorp/memberlist@v0.3.1/memberlist.go:239 +0x30
  quicstream/discovery.NewServer()
      quicstream/discovery/server.go:26 +0x4a
  main.main()
      quicstream/cmd/discovery.go:135 +0xc5c

Goroutine 24 (running) created at:
  github.com/hashicorp/memberlist.(*Memberlist).schedule()
      .pkg/mod/github.com/hashicorp/memberlist@v0.3.1/state.go:121 +0x3f4
  github.com/hashicorp/memberlist.Create()
      .pkg/mod/github.com/hashicorp/memberlist@v0.3.1/memberlist.go:247 +0x84
  quicstream/discovery.NewServer()
      quicstream/discovery/server.go:26 +0x4a
  main.main()
      quicstream/cmd/discovery.go:135 +0xc5c
==================
==================
WARNING: DATA RACE
Read at 0x00c0005942a0 by goroutine 19:
  time.(*Timer).Stop()
      /home/spikeekips/.gvm/gos/go1.17.7/src/time/sleep.go:78 +0x150
  github.com/hashicorp/memberlist.(*Memberlist).invokeAckHandler()
      .pkg/mod/github.com/hashicorp/memberlist@v0.3.1/state.go:874 +0x128
  github.com/hashicorp/memberlist.(*Memberlist).handleAck()
      .pkg/mod/github.com/hashicorp/memberlist@v0.3.1/net.go:669 +0x267
  github.com/hashicorp/memberlist.(*Memberlist).handleCommand()
      .pkg/mod/github.com/hashicorp/memberlist@v0.3.1/net.go:439 +0x1a4
  github.com/hashicorp/memberlist.(*Memberlist).ingestPacket()
      .pkg/mod/github.com/hashicorp/memberlist@v0.3.1/net.go:414 +0x8d8
  github.com/hashicorp/memberlist.(*Memberlist).packetListen()
      .pkg/mod/github.com/hashicorp/memberlist@v0.3.1/net.go:352 +0xe9
  github.com/hashicorp/memberlist.newMemberlist·dwrap·5()
      .pkg/mod/github.com/hashicorp/memberlist@v0.3.1/memberlist.go:228 +0x39

Previous write at 0x00c0005942a0 by goroutine 24:
  time.AfterFunc()
      /home/spikeekips/.gvm/gos/go1.17.7/src/time/sleep.go:168 +0x55
  github.com/hashicorp/memberlist.(*Memberlist).setProbeChannels()
      .pkg/mod/github.com/hashicorp/memberlist@v0.3.1/state.go:835 +0x344
  github.com/hashicorp/memberlist.(*Memberlist).probeNode()
      .pkg/mod/github.com/hashicorp/memberlist@v0.3.1/state.go:310 +0x628
  github.com/hashicorp/memberlist.(*Memberlist).probe()
      .pkg/mod/github.com/hashicorp/memberlist@v0.3.1/state.go:255 +0x364
  github.com/hashicorp/memberlist.(*Memberlist).probe-fm()
      .pkg/mod/github.com/hashicorp/memberlist@v0.3.1/state.go:214 +0x39
  github.com/hashicorp/memberlist.(*Memberlist).triggerFunc()
      .pkg/mod/github.com/hashicorp/memberlist@v0.3.1/state.go:157 +0x156
  github.com/hashicorp/memberlist.(*Memberlist).schedule·dwrap·38()
      .pkg/mod/github.com/hashicorp/memberlist@v0.3.1/state.go:121 +0x71

Goroutine 19 (running) created at:
  github.com/hashicorp/memberlist.newMemberlist()
      .pkg/mod/github.com/hashicorp/memberlist@v0.3.1/memberlist.go:228 +0x146a
  github.com/hashicorp/memberlist.Create()
      .pkg/mod/github.com/hashicorp/memberlist@v0.3.1/memberlist.go:239 +0x30
  quicstream/discovery.NewServer()
      quicstream/discovery/server.go:26 +0x4a
  main.main()
      quicstream/cmd/discovery.go:135 +0xc5c

Goroutine 24 (running) created at:
  github.com/hashicorp/memberlist.(*Memberlist).schedule()
      .pkg/mod/github.com/hashicorp/memberlist@v0.3.1/state.go:121 +0x3f4
  github.com/hashicorp/memberlist.Create()
      .pkg/mod/github.com/hashicorp/memberlist@v0.3.1/memberlist.go:247 +0x84
  quicstream/discovery.NewServer()
      quicstream/discovery/server.go:26 +0x4a
  main.main()
      quicstream/cmd/discovery.go:135 +0xc5c
==================