Uploaded image for project: 'Node.js Driver'
  1. Node.js Driver
  2. NODE-1340

Reconnecting to Mongos proxy server never fires the reconnect event

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Major - P3
    • Resolution: Fixed
    • 3.0.2
    • 3.2.0
    • Core, MongoDB 3.4
    • Ubuntu, Docker, AWS

    Description

      *BUG*

      *EXPECTED BEHAVIOR*
      When a Mongos server resets the reconnect event should fired on the connection.

      *ACTUAL BEHAVIOR*
      The reconnect event is never fired.

      *STEP TO REPRODUCE*
      1. I'm using a Mongos container
      2. Simple connection:

      import { MongoClient } from 'mongodb'
       
      const dburl = 'mongodb://YOURCONTAINERADRESS:27017/'
       
      MongoClient.connect(
        dburl,
        {
          reconnectTries: Number.MAX_VALUE,
          reconnectInterval: 1000
        },
       
        function(err, db) {
          db.on('close', () => console.log('closed'))
          db.on('reconnect', () => console.log('reconnect'))
          db.on('disconnect', () => console.log('disconnect'))
        }
      )
      

      3. Restart the container

      With the same code but on my local machine and doing: service mongod stop -> service mongod start the reconnect event is properly fired.

      **POSSIBLE CAUSE**
      After digging a bit I found out that in
      mongodb-core/mongos.js

      return reconnectProxies(self, self.disconnectedProxies, function() {
              if (self.state === DESTROYED || self.state === UNREFERENCED) return;
       
              // Are we connected ? emit connect event
              if (self.state === CONNECTING && options.firstConnect) {
                self.emit('connect', self);
                self.emit('fullsetup', self);
                self.emit('all', self);
              } else if (self.isConnected()) {
                self.emit('reconnect', self);
              } else if (!self.isConnected() && self.listeners('close').length > 0) {
                self.emit('close', self);
              }
       
              // Perform topology monitor
              topologyMonitor(self);
            });
      

      the self.isConnected() is never true on a reconnection therefore the reconnect event is never emitted. This is because the connectedProxies array is alway empty at this point in time.

      Attachments

        Issue Links

          Activity

            People

              matt.broadstone@mongodb.com Matt Broadstone
              maloguertin Malo Guertin
              Votes:
              2 Vote for this issue
              Watchers:
              4 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved: