diff options
author | Felix Lange <fjl@users.noreply.github.com> | 2018-10-12 02:32:14 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-10-12 02:32:14 +0800 |
commit | dcae0d348bb7f5d9052e50a83383a33538ce376a (patch) | |
tree | 9dee15f209bd31c3adf32fef3835a06bda8f18e4 /p2p/simulations/adapters/ws.go | |
parent | f951e23fb5ad2f7017f314a95287bc0506a67d05 (diff) | |
download | dexon-dcae0d348bb7f5d9052e50a83383a33538ce376a.tar.gz dexon-dcae0d348bb7f5d9052e50a83383a33538ce376a.tar.zst dexon-dcae0d348bb7f5d9052e50a83383a33538ce376a.zip |
p2p/simulations: fix a deadlock and clean up adapters (#17891)
This fixes a rare deadlock with the inproc adapter:
- A node is stopped, which acquires Network.lock.
- The protocol code being simulated (swarm/network in my case)
waits for its goroutines to shut down.
- One of those goroutines calls into the simulation to add a peer,
which waits for Network.lock.
The fix for the deadlock is really simple, just release the lock
before stopping the simulation node.
Other changes in this PR clean up the exec adapter so it reports
node startup errors better and remove the docker adapter because
it just adds overhead.
In the exec adapter, node information is now posted to a one-shot
server. This avoids log parsing and allows reporting startup
errors to the simulation host.
A small change in package node was needed because simulation
nodes use port zero. Node.{HTTP,WS}Endpoint now return the live
endpoints after startup by checking the TCP listener.
Diffstat (limited to 'p2p/simulations/adapters/ws.go')
-rw-r--r-- | p2p/simulations/adapters/ws.go | 51 |
1 files changed, 0 insertions, 51 deletions
diff --git a/p2p/simulations/adapters/ws.go b/p2p/simulations/adapters/ws.go deleted file mode 100644 index 979a21709..000000000 --- a/p2p/simulations/adapters/ws.go +++ /dev/null @@ -1,51 +0,0 @@ -package adapters - -import ( - "bufio" - "errors" - "io" - "regexp" - "strings" - "time" -) - -// wsAddrPattern is a regex used to read the WebSocket address from the node's -// log -var wsAddrPattern = regexp.MustCompile(`ws://[\d.:]+`) - -func matchWSAddr(str string) (string, bool) { - if !strings.Contains(str, "WebSocket endpoint opened") { - return "", false - } - - return wsAddrPattern.FindString(str), true -} - -// findWSAddr scans through reader r, looking for the log entry with -// WebSocket address information. -func findWSAddr(r io.Reader, timeout time.Duration) (string, error) { - ch := make(chan string) - - go func() { - s := bufio.NewScanner(r) - for s.Scan() { - addr, ok := matchWSAddr(s.Text()) - if ok { - ch <- addr - } - } - close(ch) - }() - - var wsAddr string - select { - case wsAddr = <-ch: - if wsAddr == "" { - return "", errors.New("empty result") - } - case <-time.After(timeout): - return "", errors.New("timed out") - } - - return wsAddr, nil -} |