Uploaded image for project: 'Core Server'
  1. Core Server
  2. SERVER-47195

Allow failCommand failpoint to trigger only on a specific MongoClient

    XMLWordPrintable

    Details

    • Type: New Feature
    • Status: Closed
    • Priority: Major - P3
    • Resolution: Fixed
    • Affects Version/s: None
    • Fix Version/s: 4.4.0-rc2, 4.2.9, 4.7.0
    • Component/s: None
    • Labels:
      None
    • Backwards Compatibility:
      Fully Compatible
    • Backport Requested:
      v4.4, v4.2
    • Sprint:
      Service arch 2020-04-20

      Description

      For streamable isMaster, drivers would like to add tests that fail isMaster commands, like this:

      db.adminCommand({"configureFailpoint": "failCommand", "mode": {"times": 2}, "data": {"failCommands": ["isMaster"], "errorCode": 94, "closeConnection": false}})
      

      And:

      db.adminCommand({"configureFailpoint": "failCommand", "mode": "alwaysOn", "data": {"failCommands": ["isMaster"], "errorCode": 94, "closeConnection": false}})
      

      However, failing isMaster with failCommand is tricky because:

      1. driver tests often have 1 (or more) MongoClients running in the background of the test suite. These clients will likely trigger the failpoint in addition to the MongoClient we want to test.
      2. using "mode": "alwaysOn" makes it impossible for a driver to re-discover the server after it is marked Unknown because SDAM discovery depends on a successful isMaster. This means it may not be possible to disable the "alwaysOn" failpoint without other workarounds. (A driver needs to reserve a connection in order to disable the failpoint and/or ensure that the node is still selectable.)

      It would be great if the failCommand failpoint was able to filter which clients trigger the failure.

      One proposal to fix these issues would be to implement an "appName" filter on the failCommand failpoint. "appName" would work similar to the "threadName" (SERVER-38054) feature but instead of the individual connection name (eg "conn8") we'd use the "appName" from the connection handshake. This would allow driver tests to control which clients trigger a failpoint:

      db.adminCommand({"configureFailpoint": "failCommand", "mode": "alwaysOn", "data": {"failCommands": ["isMaster"], "errorCode": 94, "closeConnection": false, "appName": "failingIsMasterTest"}})
      ...
      # Only this client will trigger the failpoint
      client = MongoClient(appName="failingIsMasterTest")
      

        Attachments

          Activity

            People

            Assignee:
            spencer Spencer Brody (Inactive)
            Reporter:
            shane.harvey Shane Harvey
            Participants:
            Votes:
            1 Vote for this issue
            Watchers:
            9 Start watching this issue

              Dates

              Created:
              Updated:
              Resolved: