Uploaded image for project: 'Python Driver'
  1. Python Driver
  2. PYTHON-3041

Cannot initiate a replica set with pymongo>=4

    • Type: Icon: Bug Bug
    • Resolution: Fixed
    • Priority: Icon: Trivial - P5 Trivial - P5
    • 4.1, 4.0.2
    • Affects Version/s: 4.0.1
    • Component/s: None

      With pymongo >= 4 the document way to initiate a replica set does not work  anymore.

       

      When starting a fresh single-member MongoDB replica set using the docker container:

      podman run --rm -p 27777:27017 docker.io/mongo:4.1 mongod --replSet rep0

      With pymongo 3.12.3 the replica set can successfully initiated with the following code:

      In [1]: from pymongo import MongoClient
      
      In [2]: client = MongoClient("localhost", 27777)
      
      In [3]: client.admin.command("replSetInitiate")
      Out[3]:
      {'info2': 'no configuration specified. Using a default configuration for the set',
       'me': '97b8f1356c65:27017',
       'ok': 1.0,
       '$clusterTime': {'clusterTime': Timestamp(1639392790, 1),
        'signature': {'hash': b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00',
         'keyId': 0}},
       'operationTime': Timestamp(1639392790, 1)}
      
      In [4]: import pymongo
      
      In [5]: pymongo.__version__
      Out[5]: '3.12.3'

      This happens with pymongo 4.0.1:

      In [1]: from pymongo import MongoClient
      
      In [2]: client = MongoClient("localhost", 27777)
      
      In [3]: client.admin.command("replSetInitiate")
      ---------------------------------------------------------------------------
      ServerSelectionTimeoutError               Traceback (most recent call last)<ipython-input-3-5b449124b342> in <module>----> 1 client.admin.command("replSetInitiate")
      /tmp/env/lib/python3.10/site-packages/pymongo/database.py in command(self, command, value, check, allowable_errors, read_preference, codec_options, session, **kwargs)    592             read_preference = ((session and session._txn_read_preference())    593                                or ReadPreference.PRIMARY)--> 594         with self.__client._socket_for_reads(    595                 read_preference, session) as (sock_info, secondary_ok):    596             return self._command(sock_info, command, secondary_ok, value,
      /usr/lib/python3.10/contextlib.py in __enter__(self)    133         del self.args, self.kwds, self.func    134         try:--> 135             return next(self.gen)    136         except StopIteration:    137             raise RuntimeError("generator didn't yield") from None
      /tmp/env/lib/python3.10/site-packages/pymongo/mongo_client.py in _socket_for_reads(self, read_preference, session)   1175         # Thread safe: if the type is single it cannot change.   1176         topology = self._get_topology()-> 1177         server = self._select_server(read_preference, session)   1178         single = topology.description.topology_type == TOPOLOGY_TYPE.Single   1179
      /tmp/env/lib/python3.10/site-packages/pymongo/mongo_client.py in _select_server(self, server_selector, session, address)   1135                                         % address)   1136             else:-> 1137                 server = topology.select_server(server_selector)   1138             return server   1139         except PyMongoError as exc:
      /tmp/env/lib/python3.10/site-packages/pymongo/topology.py in select_server(self, selector, server_selection_timeout, address)    240                       address=None):    241         """Like select_servers, but choose a random server if several match."""--> 242         servers = self.select_servers(    243             selector, server_selection_timeout, address)    244         if len(servers) == 1:
      /tmp/env/lib/python3.10/site-packages/pymongo/topology.py in select_servers(self, selector, server_selection_timeout, address)    198    199         with self._lock:--> 200             server_descriptions = self._select_servers_loop(    201                 selector, server_timeout, address)    202
      /tmp/env/lib/python3.10/site-packages/pymongo/topology.py in _select_servers_loop(self, selector, timeout, address)    214             # No suitable servers.    215             if timeout == 0 or now > end_time:--> 216                 raise ServerSelectionTimeoutError(    217                     "%s, Timeout: %ss, Topology Description: %r" %    218                     (self._error_message(selector), timeout, self.description))
      ServerSelectionTimeoutError: No servers match selector "Primary()", Timeout: 30s, Topology Description: <TopologyDescription id: 61b725c1757d60fe06ed33ef, topology_type: Unknown, servers: [<ServerDescription ('localhost', 27777) server_type: RSGhost, rtt: 0.0013525948277739105>]>
      
      In [4]: import pymongo
      
      In [5]: pymongo.__version__
      Out[5]: '4.0.1'

            Assignee:
            shane.harvey@mongodb.com Shane Harvey
            Reporter:
            johannes.wienke@plan.one Johannes Wienke
            Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

              Created:
              Updated:
              Resolved: