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

inconsistent locking order #97

Closed
Tracked by #1690
marten-seemann opened this issue Sep 5, 2022 · 0 comments · Fixed by #98
Closed
Tracked by #1690

inconsistent locking order #97

marten-seemann opened this issue Sep 5, 2022 · 0 comments · Fixed by #98
Assignees
Labels
effort/hours Estimated to take one or several hours exp/beginner Can be confidently tackled by newcomers kind/bug A bug in existing code (including security flaws)

Comments

@marten-seemann
Copy link
Contributor

Running our test suite with https://github.com/sasha-s/go-deadlock yields the following potential deadlock:

=== RUN   TestCloseRead
POTENTIAL DEADLOCK: Inconsistent locking. saw this ordering in one goroutine:
happened before
stream.go:396 v3.(*Stream).processFlags { s.stateLock.Lock() } <<<<<
stream.go:395 v3.(*Stream).processFlags {  }
stream.go:437 v3.(*Stream).incrSendWindow { // Increase window, unblock a sender }
session.go:706 v3.(*Session).handleStreamMessage { stream.incrSendWindow(hdr, flags) }
session.go:666 v3.(*Session).recvLoop {  }
session.go:614 v3.(*Session).recv { func (s *Session) recv() { }

happened after
session.go:865 v3.(*Session).establishStream { s.streamLock.Lock() } <<<<<
session.go:864 v3.(*Session).establishStream { func (s *Session) establishStream(id uint32) { }
stream.go:403 v3.(*Stream).processFlags { } }
stream.go:437 v3.(*Stream).incrSendWindow { // Increase window, unblock a sender }
session.go:706 v3.(*Session).handleStreamMessage { stream.incrSendWindow(hdr, flags) }
session.go:666 v3.(*Session).recvLoop {  }
session.go:614 v3.(*Session).recv { func (s *Session) recv() { }

in another goroutine: happened before
session.go:294 v3.(*Session).Close { s.streamLock.Lock() } <<<<<
session.go:293 v3.(*Session).Close {  }
session.go:316 v3.(*Session).exitErr { s.Close() }
session.go:489 v3.(*Session).send { } }

happened after
stream.go:363 v3.(*Stream).forceClose { s.stateLock.Lock() } <<<<<
stream.go:362 v3.(*Stream).forceClose { func (s *Stream) forceClose() { }
session.go:299 v3.(*Session).Close { stream.forceClose() }
session.go:316 v3.(*Session).exitErr { s.Close() }
session.go:489 v3.(*Session).send { } }

Other goroutines holding locks:
goroutine 3013287 lock 0xc0008d1888
session.go:278 v3.(*Session).Close { s.shutdownLock.Lock() } <<<<<
session.go:277 v3.(*Session).Close { func (s *Session) Close() error { }
session_test.go:841 v3.TestCloseRead { } }

goroutine 3013287 lock 0xc0008d1828
session.go:294 v3.(*Session).Close { s.streamLock.Lock() } <<<<<
session.go:293 v3.(*Session).Close {  }
session_test.go:841 v3.TestCloseRead { } }

goroutine 3013290 lock 0xc0008d1768
session.go:278 v3.(*Session).Close { s.shutdownLock.Lock() } <<<<<
session.go:277 v3.(*Session).Close { func (s *Session) Close() error { }
session.go:316 v3.(*Session).exitErr { s.Close() }
session.go:489 v3.(*Session).send { } }

goroutine 3013287 lock 0xc0165bc348
deadline.go:33 v3.(*pipeDeadline).set { d.mu.Lock() } <<<<<
deadline.go:32 v3.(*pipeDeadline).set { func (d *pipeDeadline) set(t time.Time) { }
stream.go:374 v3.(*Stream).forceClose { s.readDeadline.set(time.Time{}) }
session.go:299 v3.(*Session).Close { stream.forceClose() }
session_test.go:841 v3.TestCloseRead { } }

goroutine 3013290 lock 0xc0008d1708
session.go:294 v3.(*Session).Close { s.streamLock.Lock() } <<<<<
session.go:293 v3.(*Session).Close {  }
session.go:316 v3.(*Session).exitErr { s.Close() }
session.go:489 v3.(*Session).send { } }
@marten-seemann marten-seemann added kind/bug A bug in existing code (including security flaws) exp/beginner Can be confidently tackled by newcomers effort/hours Estimated to take one or several hours labels Sep 5, 2022
@marten-seemann marten-seemann self-assigned this Sep 5, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
effort/hours Estimated to take one or several hours exp/beginner Can be confidently tackled by newcomers kind/bug A bug in existing code (including security flaws)
Projects
None yet
Development

Successfully merging a pull request may close this issue.

1 participant