Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

blockwise transfer: fix race #427

Merged
merged 4 commits into from
Jan 30, 2023
Merged

blockwise transfer: fix race #427

merged 4 commits into from
Jan 30, 2023

Conversation

jkralik
Copy link
Member

@jkralik jkralik commented Jan 27, 2023

Because cached messages are released when "do" operations end and incoming responses are processed simultaneously, a race may occur.

==================
WARNING: DATA RACE
Read at 0x00c000401054 by goroutine 281:
  github.com/plgd-dev/go-coap/v3/message/pool.(*Message).Type()
      /home/jkralik/go/pkg/mod/github.com/plgd-dev/go-coap/v3@v3.1.0/message/pool/message.go:109 +0x46
  github.com/plgd-dev/go-coap/v3/net/blockwise.(*BlockWise[...]).getSentRequest()
      /home/jkralik/go/pkg/mod/github.com/plgd-dev/go-coap/v3@v3.1.0/net/blockwise/blockwise.go:572 +0x43c
  github.com/plgd-dev/go-coap/v3/net/blockwise.(*BlockWise[...]).processReceivedMessage()
      /home/jkralik/go/pkg/mod/github.com/plgd-dev/go-coap/v3@v3.1.0/net/blockwise/blockwise.go:756 +0x951
  github.com/plgd-dev/go-coap/v3/net/blockwise.(*BlockWise[...]).handleReceivedMessage()
      /home/jkralik/go/pkg/mod/github.com/plgd-dev/go-coap/v3@v3.1.0/net/blockwise/blockwise.go:468 +0xa90
  github.com/plgd-dev/go-coap/v3/net/blockwise.(*BlockWise[...]).Handle()
      /home/jkralik/go/pkg/mod/github.com/plgd-dev/go-coap/v3@v3.1.0/net/blockwise/blockwise.go:422 +0x7c8
  github.com/plgd-dev/go-coap/v3/udp/client.(*Conn).handle()
      /home/jkralik/go/pkg/mod/github.com/plgd-dev/go-coap/v3@v3.1.0/udp/client/conn.go:532 +0x270
  github.com/plgd-dev/go-coap/v3/udp/client.(*Conn).handleReq()
      /home/jkralik/go/pkg/mod/github.com/plgd-dev/go-coap/v3@v3.1.0/udp/client/conn.go:690 +0x6e5
  github.com/plgd-dev/go-coap/v3/udp/client.(*Conn).handleReq-fm()
      <autogenerated>:1 +0x6b
  github.com/plgd-dev/go-coap/v3/udp/client.(*Conn).ProcessReceivedMessageWithHandler()
      /home/jkralik/go/pkg/mod/github.com/plgd-dev/go-coap/v3@v3.1.0/udp/client/conn.go:717 +0x4b2
  github.com/plgd-dev/go-coap/v3/udp/client.processReceivedMessage()
      /home/jkralik/go/pkg/mod/github.com/plgd-dev/go-coap/v3@v3.1.0/udp/client/conn.go:241 +0x5e
  github.com/plgd-dev/go-coap/v3/udp/client.(*Conn).ProcessReceivedMessage()
      /home/jkralik/go/pkg/mod/github.com/plgd-dev/go-coap/v3@v3.1.0/udp/client/conn.go:245 +0x10b
  github.com/plgd-dev/go-coap/v3/net/client.(*ReceivedMessageReader[...]).loop()
      /home/jkralik/go/pkg/mod/github.com/plgd-dev/go-coap/v3@v3.1.0/net/client/receivedMessageReader.go:66 +0x39d
  github.com/plgd-dev/go-coap/v3/net/client.(*ReceivedMessageReader[...]).TryToReplaceLoop.func2()
      /home/jkralik/go/pkg/mod/github.com/plgd-dev/go-coap/v3@v3.1.0/net/client/receivedMessageReader.go:95 +0x97

Previous write at 0x00c000401054 by goroutine 8:
  github.com/plgd-dev/go-coap/v3/message/pool.(*Message).SetType()
      /home/jkralik/go/pkg/mod/github.com/plgd-dev/go-coap/v3@v3.1.0/message/pool/message.go:96 +0x52
  github.com/plgd-dev/go-coap/v3/message/pool.(*Message).UpsertType()
      /home/jkralik/go/pkg/mod/github.com/plgd-dev/go-coap/v3@v3.1.0/message/pool/message.go:105 +0x94
  github.com/plgd-dev/go-coap/v3/udp/client.(*Conn).writeMessage()
      /home/jkralik/go/pkg/mod/github.com/plgd-dev/go-coap/v3@v3.1.0/udp/client/conn.go:417 +0x79
  github.com/plgd-dev/go-coap/v3/udp/client.(*Conn).doInternal()
      /home/jkralik/go/pkg/mod/github.com/plgd-dev/go-coap/v3@v3.1.0/udp/client/conn.go:284 +0x6bc
  github.com/plgd-dev/go-coap/v3/udp/client.(*Conn).do.func1()
      /home/jkralik/go/pkg/mod/github.com/plgd-dev/go-coap/v3@v3.1.0/udp/client/conn.go:313 +0x22d
  github.com/plgd-dev/go-coap/v3/net/blockwise.(*BlockWise[...]).Do()
      /home/jkralik/go/pkg/mod/github.com/plgd-dev/go-coap/v3@v3.1.0/net/blockwise/blockwise.go:225 +0x1f13
  github.com/plgd-dev/go-coap/v3/udp/client.(*Conn).do()
      /home/jkralik/go/pkg/mod/github.com/plgd-dev/go-coap/v3@v3.1.0/udp/client/conn.go:309 +0x237
  github.com/plgd-dev/go-coap/v3/udp/client.(*Conn).do-fm()
      <autogenerated>:1 +0x94
  github.com/plgd-dev/go-coap/v3/net/client/limitParallelRequests.(*LimitParallelRequests).Do()
      /home/jkralik/go/pkg/mod/github.com/plgd-dev/go-coap/v3@v3.1.0/net/client/limitParallelRequests/limitParallelRequests.go:120 +0x98a
  github.com/plgd-dev/go-coap/v3/net/client/limitParallelRequests.(*LimitParallelRequests).Do-fm()
      <autogenerated>:1 +0x94
  github.com/plgd-dev/go-coap/v3/net/observation.(*Observation[...]).Cancel()
      /home/jkralik/go/pkg/mod/github.com/plgd-dev/go-coap/v3@v3.1.0/net/observation/handler.go:219 +0xaa7
  github.com/plgd-dev/go-coap/v3/net/observation.(*Observation[...]).Cancel()
      <autogenerated>:1 +0x91
  github.com/plgd-dev/device/v2/client/core.(*observation).stop()
      /home/jkralik/go/src/github.com/plgd-dev/device/client/core/observeResource.go:142 +0x1c1
  github.com/plgd-dev/device/v2/client/core.(*observation).Stop()
      /home/jkralik/go/src/github.com/plgd-dev/device/client/core/observeResource.go:152 +0x84
  github.com/plgd-dev/device/v2/client/core.(*Device).stopObservingResource()
      /home/jkralik/go/src/github.com/plgd-dev/device/client/core/observeResource.go:72 +0x237
  github.com/plgd-dev/device/v2/client/core.(*Device).StopObservingResource()
      /home/jkralik/go/src/github.com/plgd-dev/device/client/core/observeResource.go:85 +0xee
  github.com/plgd-dev/device/v2/client.(*Client).StopObservingResource()
      /home/jkralik/go/src/github.com/plgd-dev/device/client/observeResource.go:269 +0x5aa
  github.com/plgd-dev/device/v2/client_test.TestClientBUGiotivityLite.func2()
      /home/jkralik/go/src/github.com/plgd-dev/device/client/updateResource_test.go:57 +0xd2
  github.com/plgd-dev/device/v2/client_test.TestClientBUGiotivityLite.func5()
      /home/jkralik/go/src/github.com/plgd-dev/device/client/updateResource_test.go:59 +0x64
  runtime.deferreturn()
      /usr/local/go/src/runtime/panic.go:476 +0x32
  testing.tRunner()
      /usr/local/go/src/testing/testing.go:1446 +0x398
  testing.(*T).Run.func1()
      /usr/local/go/src/testing/testing.go:1493 +0x5b

Goroutine 281 (running) created at:

@jkralik jkralik force-pushed the jkralik/fix/bwt-race branch 2 times, most recently from 1890800 to 32d2520 Compare January 27, 2023 17:19
@jkralik jkralik marked this pull request as ready for review January 27, 2023 17:27
@sonarcloud
Copy link

sonarcloud bot commented Jan 27, 2023

Kudos, SonarCloud Quality Gate passed!    Quality Gate passed

Bug A 0 Bugs
Vulnerability A 0 Vulnerabilities
Security Hotspot A 0 Security Hotspots
Code Smell A 0 Code Smells

86.5% 86.5% Coverage
0.0% 0.0% Duplication

@jkralik jkralik merged commit b5febd8 into master Jan 30, 2023
@jkralik jkralik deleted the jkralik/fix/bwt-race branch January 30, 2023 10:38
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

2 participants