Skip to content

socket Error: EPIPE, Broken pipe when closing many clients at once #483

@tommedema

Description

@tommedema

When I have a socket.io server running, and then open 1 chrome browser window with 10 tabs to this server, there are 10 connected sockets.

If I then close the window at once, about 4 socket disconnections are correctly displayed on the server side, but then I get the following exception:

DEBUG: a client emitted an exception: { stack: [Getter/Setter],
  arguments: undefined,
  type: undefined,
  message: 'EPIPE, Broken pipe',
  errno: 32,
  code: 'EPIPE',
  syscall: 'write' }
   info  - socket error Error: EPIPE, Broken pipe
    at Socket._writeImpl (net.js:159:14)
    at Socket._writeOut (net.js:450:25)
    at Socket.write (net.js:377:17)
    at WebSocket.write (/media/sda3/Workspaces/Node.js/Project/node_modules/socket.io/lib/transports/websocket.js:184:23)
    at WebSocket.onDispatch (/media/sda3/Workspaces/Node.js/Project/node_modules/socket.io/lib/transport.js:222:10)
    at Manager.onDispatch (/media/sda3/Workspaces/Node.js/Project/node_modules/socket.io/lib/manager.js:342:31)
    at SocketNamespace.packet (/media/sda3/Workspaces/Node.js/Project/node_modules/socket.io/lib/namespace.js:156:16)
    at SocketNamespace.emit (/media/sda3/Workspaces/Node.js/Project/node_modules/socket.io/lib/namespace.js:188:15)
    at _emitUnreg (/media/sda3/Workspaces/Node.js/Project/src2/routines/csio/clientinfo/clients.js:35:26)
    at Client.get (/media/sda3/Workspaces/Node.js/Project/node_modules/socket.io/lib/stores/memory.js:86:3)
DEBUG: a client emitted an exception: { stack: [Getter/Setter],
  arguments: undefined,
  type: undefined,
  message: 'EPIPE, Broken pipe',
  errno: 32,
  code: 'EPIPE',
  syscall: 'write' }
   info  - socket error Error: EPIPE, Broken pipe
    at Socket._writeImpl (net.js:159:14)
    at Socket._writeOut (net.js:450:25)
    at Socket.write (net.js:377:17)
    at WebSocket.write (/media/sda3/Workspaces/Node.js/Project/node_modules/socket.io/lib/transports/websocket.js:184:23)
    at WebSocket.onDispatch (/media/sda3/Workspaces/Node.js/Project/node_modules/socket.io/lib/transport.js:222:10)
    at Manager.onDispatch (/media/sda3/Workspaces/Node.js/Project/node_modules/socket.io/lib/manager.js:342:31)
    at SocketNamespace.packet (/media/sda3/Workspaces/Node.js/Project/node_modules/socket.io/lib/namespace.js:156:16)
    at SocketNamespace.emit (/media/sda3/Workspaces/Node.js/Project/node_modules/socket.io/lib/namespace.js:188:15)
    at _emitUnreg (/media/sda3/Workspaces/Node.js/Project/src2/routines/csio/clientinfo/clients.js:35:26)
    at Client.get (/media/sda3/Workspaces/Node.js/Project/node_modules/socket.io/lib/stores/memory.js:86:3)
DEBUG: a client emitted an exception: { stack: [Getter/Setter],
  arguments: undefined,
  type: undefined,
  message: 'EPIPE, Broken pipe',
  errno: 32,
  code: 'EPIPE',
  syscall: 'write' }
   info  - socket error Error: EPIPE, Broken pipe
    at Socket._writeImpl (net.js:159:14)
    at Socket._writeOut (net.js:450:25)
    at Socket.write (net.js:377:17)
    at WebSocket.write (/media/sda3/Workspaces/Node.js/Project/node_modules/socket.io/lib/transports/websocket.js:184:23)
    at WebSocket.onDispatch (/media/sda3/Workspaces/Node.js/Project/node_modules/socket.io/lib/transport.js:222:10)
    at Manager.onDispatch (/media/sda3/Workspaces/Node.js/Project/node_modules/socket.io/lib/manager.js:342:31)
    at SocketNamespace.packet (/media/sda3/Workspaces/Node.js/Project/node_modules/socket.io/lib/namespace.js:156:16)
    at SocketNamespace.emit (/media/sda3/Workspaces/Node.js/Project/node_modules/socket.io/lib/namespace.js:188:15)
    at _emitUnreg (/media/sda3/Workspaces/Node.js/Project/src2/routines/csio/clientinfo/clients.js:35:26)
    at Client.get (/media/sda3/Workspaces/Node.js/Project/node_modules/socket.io/lib/stores/memory.js:86:3)
DEBUG: a client emitted an exception: { stack: [Getter/Setter],
  arguments: undefined,
  type: undefined,
  message: 'EPIPE, Broken pipe',
  errno: 32,
  code: 'EPIPE',
  syscall: 'write' }
   info  - socket error Error: EPIPE, Broken pipe
    at Socket._writeImpl (net.js:159:14)
    at Socket._writeOut (net.js:450:25)
    at Socket.write (net.js:377:17)
    at WebSocket.write (/media/sda3/Workspaces/Node.js/Project/node_modules/socket.io/lib/transports/websocket.js:184:23)
    at WebSocket.onDispatch (/media/sda3/Workspaces/Node.js/Project/node_modules/socket.io/lib/transport.js:222:10)
    at Manager.onDispatch (/media/sda3/Workspaces/Node.js/Project/node_modules/socket.io/lib/manager.js:342:31)
    at SocketNamespace.packet (/media/sda3/Workspaces/Node.js/Project/node_modules/socket.io/lib/namespace.js:156:16)
    at SocketNamespace.emit (/media/sda3/Workspaces/Node.js/Project/node_modules/socket.io/lib/namespace.js:188:15)
    at _emitUnreg (/media/sda3/Workspaces/Node.js/Project/src2/routines/csio/clientinfo/clients.js:35:26)
    at Client.get (/media/sda3/Workspaces/Node.js/Project/node_modules/socket.io/lib/stores/memory.js:86:3)
DEBUG: a client emitted an exception: { stack: [Getter/Setter],
  arguments: undefined,
  type: undefined,
  message: 'EPIPE, Broken pipe',
  errno: 32,
  code: 'EPIPE',
  syscall: 'write' }
   info  - socket error Error: EPIPE, Broken pipe
    at Socket._writeImpl (net.js:159:14)
    at Socket._writeOut (net.js:450:25)
    at Socket.write (net.js:377:17)
    at WebSocket.write (/media/sda3/Workspaces/Node.js/Project/node_modules/socket.io/lib/transports/websocket.js:184:23)
    at WebSocket.onDispatch (/media/sda3/Workspaces/Node.js/Project/node_modules/socket.io/lib/transport.js:222:10)
    at Manager.onDispatch (/media/sda3/Workspaces/Node.js/Project/node_modules/socket.io/lib/manager.js:342:31)
    at SocketNamespace.packet (/media/sda3/Workspaces/Node.js/Project/node_modules/socket.io/lib/namespace.js:156:16)
    at SocketNamespace.emit (/media/sda3/Workspaces/Node.js/Project/node_modules/socket.io/lib/namespace.js:188:15)
    at _emitUnreg (/media/sda3/Workspaces/Node.js/Project/src2/routines/csio/clientinfo/clients.js:35:26)
    at Client.get (/media/sda3/Workspaces/Node.js/Project/node_modules/socket.io/lib/stores/memory.js:86:3)
DEBUG: a client emitted an exception: { stack: [Getter/Setter],
  arguments: undefined,
  type: undefined,
  message: 'EPIPE, Broken pipe',
  errno: 32,
  code: 'EPIPE',
  syscall: 'write' }
   info  - socket error Error: EPIPE, Broken pipe
    at Socket._writeImpl (net.js:159:14)
    at Socket._writeOut (net.js:450:25)
    at Socket.write (net.js:377:17)
    at WebSocket.write (/media/sda3/Workspaces/Node.js/Project/node_modules/socket.io/lib/transports/websocket.js:184:23)
    at WebSocket.onDispatch (/media/sda3/Workspaces/Node.js/Project/node_modules/socket.io/lib/transport.js:222:10)
    at Manager.onDispatch (/media/sda3/Workspaces/Node.js/Project/node_modules/socket.io/lib/manager.js:342:31)
    at SocketNamespace.packet (/media/sda3/Workspaces/Node.js/Project/node_modules/socket.io/lib/namespace.js:156:16)
    at SocketNamespace.emit (/media/sda3/Workspaces/Node.js/Project/node_modules/socket.io/lib/namespace.js:188:15)
    at _emitUnreg (/media/sda3/Workspaces/Node.js/Project/src2/routines/csio/clientinfo/clients.js:35:26)
    at Client.get (/media/sda3/Workspaces/Node.js/Project/node_modules/socket.io/lib/stores/memory.js:86:3)
DEBUG: a client emitted an exception: { stack: [Getter/Setter],
  arguments: undefined,
  type: undefined,
  message: 'EPIPE, Broken pipe',
  errno: 32,
  code: 'EPIPE',
  syscall: 'write' }
   info  - socket error Error: EPIPE, Broken pipe
    at Socket._writeImpl (net.js:159:14)
    at Socket._writeOut (net.js:450:25)
    at Socket.write (net.js:377:17)
    at WebSocket.write (/media/sda3/Workspaces/Node.js/Project/node_modules/socket.io/lib/transports/websocket.js:184:23)
    at WebSocket.onDispatch (/media/sda3/Workspaces/Node.js/Project/node_modules/socket.io/lib/transport.js:222:10)
    at Manager.onDispatch (/media/sda3/Workspaces/Node.js/Project/node_modules/socket.io/lib/manager.js:342:31)
    at SocketNamespace.packet (/media/sda3/Workspaces/Node.js/Project/node_modules/socket.io/lib/namespace.js:156:16)
    at SocketNamespace.emit (/media/sda3/Workspaces/Node.js/Project/node_modules/socket.io/lib/namespace.js:188:15)
    at _emitUnreg (/media/sda3/Workspaces/Node.js/Project/src2/routines/csio/clientinfo/clients.js:35:26)
    at Client.get (/media/sda3/Workspaces/Node.js/Project/node_modules/socket.io/lib/stores/memory.js:86:3)
DEBUG: a client emitted an exception: { stack: [Getter/Setter],
  arguments: undefined,
  type: undefined,
  message: 'EPIPE, Broken pipe',
  errno: 32,
  code: 'EPIPE',
  syscall: 'write' }
   info  - socket error Error: EPIPE, Broken pipe
    at Socket._writeImpl (net.js:159:14)
    at Socket._writeOut (net.js:450:25)
    at Socket.write (net.js:377:17)
    at WebSocket.write (/media/sda3/Workspaces/Node.js/Project/node_modules/socket.io/lib/transports/websocket.js:184:23)
    at WebSocket.onDispatch (/media/sda3/Workspaces/Node.js/Project/node_modules/socket.io/lib/transport.js:222:10)
    at Manager.onDispatch (/media/sda3/Workspaces/Node.js/Project/node_modules/socket.io/lib/manager.js:342:31)
    at SocketNamespace.packet (/media/sda3/Workspaces/Node.js/Project/node_modules/socket.io/lib/namespace.js:156:16)
    at SocketNamespace.emit (/media/sda3/Workspaces/Node.js/Project/node_modules/socket.io/lib/namespace.js:188:15)
    at _emitUnreg (/media/sda3/Workspaces/Node.js/Project/src2/routines/csio/clientinfo/clients.js:35:26)
    at Client.get (/media/sda3/Workspaces/Node.js/Project/node_modules/socket.io/lib/stores/memory.js:86:3)
DEBUG: a client emitted an exception: { stack: [Getter/Setter],
  arguments: undefined,
  type: undefined,
  message: 'EPIPE, Broken pipe',
  errno: 32,
  code: 'EPIPE',
  syscall: 'write' }
   info  - socket error Error: EPIPE, Broken pipe
    at Socket._writeImpl (net.js:159:14)
    at Socket._writeOut (net.js:450:25)
    at Socket.write (net.js:377:17)
    at WebSocket.write (/media/sda3/Workspaces/Node.js/Project/node_modules/socket.io/lib/transports/websocket.js:184:23)
    at WebSocket.onDispatch (/media/sda3/Workspaces/Node.js/Project/node_modules/socket.io/lib/transport.js:222:10)
    at Manager.onDispatch (/media/sda3/Workspaces/Node.js/Project/node_modules/socket.io/lib/manager.js:342:31)
    at SocketNamespace.packet (/media/sda3/Workspaces/Node.js/Project/node_modules/socket.io/lib/namespace.js:156:16)
    at SocketNamespace.emit (/media/sda3/Workspaces/Node.js/Project/node_modules/socket.io/lib/namespace.js:188:15)
    at _emitUnreg (/media/sda3/Workspaces/Node.js/Project/src2/routines/csio/clientinfo/clients.js:35:26)
    at Client.get (/media/sda3/Workspaces/Node.js/Project/node_modules/socket.io/lib/stores/memory.js:86:3)
DEBUG: a client emitted an exception: { stack: [Getter/Setter],
  arguments: undefined,
  type: undefined,
  message: 'EPIPE, Broken pipe',
  errno: 32,
  code: 'EPIPE',
  syscall: 'write' }
   info  - socket error Error: EPIPE, Broken pipe
    at Socket._writeImpl (net.js:159:14)
    at Socket._writeOut (net.js:450:25)
    at Socket.write (net.js:377:17)
    at WebSocket.write (/media/sda3/Workspaces/Node.js/Project/node_modules/socket.io/lib/transports/websocket.js:184:23)
    at WebSocket.onDispatch (/media/sda3/Workspaces/Node.js/Project/node_modules/socket.io/lib/transport.js:222:10)
    at Manager.onDispatch (/media/sda3/Workspaces/Node.js/Project/node_modules/socket.io/lib/manager.js:342:31)
    at SocketNamespace.packet (/media/sda3/Workspaces/Node.js/Project/node_modules/socket.io/lib/namespace.js:156:16)
    at SocketNamespace.emit (/media/sda3/Workspaces/Node.js/Project/node_modules/socket.io/lib/namespace.js:188:15)
    at _emitUnreg (/media/sda3/Workspaces/Node.js/Project/src2/routines/csio/clientinfo/clients.js:35:26)
    at Client.get (/media/sda3/Workspaces/Node.js/Project/node_modules/socket.io/lib/stores/memory.js:86:3)
DEBUG: a client emitted an exception: { stack: [Getter/Setter],
  arguments: undefined,
  type: undefined,
  message: 'EPIPE, Broken pipe',
  errno: 32,
  code: 'EPIPE',
  syscall: 'write' }
   info  - socket error Error: EPIPE, Broken pipe
    at Socket._writeImpl (net.js:159:14)
    at Socket._writeOut (net.js:450:25)
    at Socket.write (net.js:377:17)
    at WebSocket.write (/media/sda3/Workspaces/Node.js/Project/node_modules/socket.io/lib/transports/websocket.js:184:23)
    at WebSocket.onDispatch (/media/sda3/Workspaces/Node.js/Project/node_modules/socket.io/lib/transport.js:222:10)
    at Manager.onDispatch (/media/sda3/Workspaces/Node.js/Project/node_modules/socket.io/lib/manager.js:342:31)
    at SocketNamespace.packet (/media/sda3/Workspaces/Node.js/Project/node_modules/socket.io/lib/namespace.js:156:16)
    at SocketNamespace.emit (/media/sda3/Workspaces/Node.js/Project/node_modules/socket.io/lib/namespace.js:188:15)
    at _emitUnreg (/media/sda3/Workspaces/Node.js/Project/src2/routines/csio/clientinfo/clients.js:35:26)
    at Client.get (/media/sda3/Workspaces/Node.js/Project/node_modules/socket.io/lib/stores/memory.js:86:3)

Most interestingly of course is clients.js:35:26. This is the corresponding function:

/* when client unregisters */
mediator.on('csio.client.unregistered', function _informClients(csio, socket) {

    /* inform other clients that this client unregistered */
    socket.get('id', function _emitUnreg(err, id) {
        if (err || !id) return mediator.emit('csio.clients.error', 'unreg cannot get id, err: ' + err);

        /* client unregistered */
        if (socket.connected) {
            socket.broadcast.emit('clients.unregistered', id);
        }
        else {
            csio.sockets.emit('clients.unregistered', id); //THIS IS LINE 35
        }
    });
});

I believe that csio.sockets.emit attempts to emit to disconnected (or maybe better: disconnecting) clients. Apparently, because so many clients disconnect at once, things go very wrong here.

This seems like a bug to me. What do you folks think?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions