-
Notifications
You must be signed in to change notification settings - Fork 10.1k
Description
When a client uses socket.disconnect when simultaneously setting up a different socket that happens to connect to the same server, the second connection never completes.
This race condition is timing-dependent and shouldn't be there: one socket should have no reason to care about what is going on with another socket. Notice that if timing is changed around then both disconnect and connect on both sockets work fine - the only problem is when a specific coincidence happens.
To repro:
(1) Copy this additional mocha test into socket.io/test from
https://github.com/davidbau/socket.io/blob/disconnect-race/test/disconnect.js
OR
git clone -b disconnect-race https://github.com/davidbau/socket.io.git
cd socket.io; npm install
(2) Run the test to try setting up two sockets and disconnecting them with different timing relationships.
./node_modules/.bin/mocha --reporter=spec test/disconnect.js
(3) Observe one of the timing arrangements fails. The other 3 pass.
I get this sequence of events:
base socket.io disconnect server connected socket on /chat P6X7U2XZN7ilSmKsAAAA client connected socket on /chat. server connected socket on /news P6X7U2XZN7ilSmKsAAAA client connected socket on /news. client disconnecting socket on /chat. server disconnected socket on /chat P6X7U2XZN7ilSmKsAAAA client disconnecting socket on /news. server disconnected socket on /news P6X7U2XZN7ilSmKsAAAA ✓ connect twice in 0ms, disconnect after 200ms (247ms) server connected socket on /chat WEyIULIr9j42KZoBAAAB client connected socket on /chat. client disconnecting socket on /chat. server disconnected socket on /chat WEyIULIr9j42KZoBAAAB server connected socket on /news 6cjBaEUFKndJ4wURAAAC client connected socket on /news. client disconnecting socket on /news. server disconnected socket on /news 6cjBaEUFKndJ4wURAAAC ✓ connect twice in 100ms, disconnect after 0ms (218ms) server connected socket on /chat 4HSKZeQIHdItu-0KAAAD client connected socket on /chat. server connected socket on /news 4HSKZeQIHdItu-0KAAAD client connected socket on /news. client disconnecting socket on /chat. server disconnected socket on /chat 4HSKZeQIHdItu-0KAAAD client disconnecting socket on /news. server disconnected socket on /news 4HSKZeQIHdItu-0KAAAD ✓ connect twice in 100ms, disconnect after 200ms (320ms) server connected socket on /chat oFJHK5AE72OJQoqvAAAE client connected socket on /chat. client disconnecting socket on /chat. server connected socket on /news oFJHK5AE72OJQoqvAAAE server disconnected socket on /chat oFJHK5AE72OJQoqvAAAE server disconnected socket on /news oFJHK5AE72OJQoqvAAAE 1) connect twice in 0ms, disconnect after 0ms 3 passing (3s) 1 failing 1) base socket.io disconnect connect twice in 0ms, disconnect after 0ms: Error: timeout of 2000ms exceeded