String connectAndTrack(ConnectionFactory connectionFactory, String host, Port port, DataNodeId dataNodeId)
      throws IOException {
    String connId = connectionFactory.connect(host, port);
    HostPortPoolManager hostPortPoolManager = getHostPortPoolManager(host, port, dataNodeId);
    hostPortPoolManager.incrementPoolCount();
    connectionIdToPoolManager.put(connId, hostPortPoolManager);
    totalManagedConnectionsCount++;
    if (hostPortPoolManager.hasMinActiveConnections()) {
      poolManagersBelowMinActiveConnections.remove(hostPortPoolManager);
    }
    return connId;
  }
Initiate a new connection using the provided {@link ConnectionFactory} and start tracking a new connection id
associated with the given host and port. Note that this connection will not be made available for checking out
until a {@link #checkInConnection} is called on it.
@param connectionFactory the {@link ConnectionFactory} for interfacing with the networking layer.
@param host the host to which this connection belongs.
@param port the port on the host to which this connection belongs.
@return the connection id of the connection returned by {@link ConnectionFactory#connect}.
@param dataNodeId the {@link DataNodeId} associated with this connection
ambry-network/src/main/java/com/github/ambry/network/ConnectionTracker.java