Skip to content

Race condition disconnecting a socket while connecting a different one #1862

@davidbau

Description

@davidbau

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions