code: def _process_change(self, server_description):
          
          td_old = self._description
          if self._publish_server:
              old_server_description = td_old._server_descriptions[
                  server_description.address]
              self._events.put((
                  self._listeners.publish_server_description_changed,
                  (old_server_description, server_description,
                   server_description.address, self._topology_id)))
  
          self._description = updated_topology_description(
              self._description, server_description)
  
          self._update_servers()
          self._receive_cluster_time_no_lock(server_description.cluster_time)
  
          if self._publish_tp:
              self._events.put((
                  self._listeners.publish_topology_description_changed,
                  (td_old, self._description, self._topology_id)))
  
          # Wake waiters in select_servers().
          self._condition.notify_all()
docs: Process a new ServerDescription on an opened topology.
  
          Hold the lock when calling this.