code: func (iter *Iter) acquireSocket() (*mongoSocket, error) {
  	socket, err := iter.session.acquireSocket(true)
  	if err != nil {
  		return nil, err
  	}
  	if socket.Server() != iter.server {
  		// Socket server changed during iteration. This may happen
  		// with Eventual sessions, if a Refresh is done, or if a
  		// monotonic session gets a write and shifts from secondary
  		// to primary. Our cursor is in a specific server, though.
  		iter.session.m.Lock()
  		sockTimeout := iter.session.sockTimeout
  		iter.session.m.Unlock()
  		socket.Release()
  		socket, _, err = iter.server.AcquireSocket(0, sockTimeout)
  		if err != nil {
  			return nil, err
  		}
  		err := iter.session.socketLogin(socket)
  		if err != nil {
  			socket.Release()
  			return nil, err
  		}
  	}
  	return socket, nil
  }
docs: // acquireSocket acquires a socket from the same server that the iterator
  // cursor was obtained from.
  //
  // WARNING: This method must not be called with iter.m locked. Acquiring the
  // socket depends on the cluster sync loop, and the cluster sync loop might
  // attempt actions which cause replyFunc to be called, inducing a deadlock.