/**
   * Starts communication.
   *
   * @throws IgniteCheckedException If failed.
   */
  public void start() throws IgniteCheckedException {
    try {
      locHost = U.getLocalHost();
    } catch (IOException e) {
      throw new IgniteCheckedException("Failed to initialize local address.", e);
    }

    try {
      shmemSrv = resetShmemServer();
    } catch (IgniteCheckedException e) {
      U.warn(log, "Failed to start shared memory communication server.", e);
    }

    try {
      // This method potentially resets local port to the value
      // local node was bound to.
      nioSrvr = resetNioServer();
    } catch (IgniteCheckedException e) {
      throw new IgniteCheckedException("Failed to initialize TCP server: " + locHost, e);
    }

    locProcDesc.address(locHost.getHostAddress());
    locProcDesc.sharedMemoryPort(boundTcpShmemPort);
    locProcDesc.tcpPort(boundTcpPort);

    locIdMsg = new ProcessHandshakeMessage(locProcDesc);

    if (shmemSrv != null) {
      shmemAcceptWorker = new ShmemAcceptWorker(shmemSrv);

      new IgniteThread(shmemAcceptWorker).start();
    }

    nioSrvr.start();
  }
  /**
   * @param desc Process descriptor.
   * @return Client.
   * @throws IgniteCheckedException If failed.
   */
  @Nullable
  protected HadoopCommunicationClient createNioClient(HadoopProcessDescriptor desc)
      throws IgniteCheckedException {
    assert desc != null;

    int shmemPort = desc.sharedMemoryPort();

    // If remote node has shared memory server enabled and has the same set of MACs
    // then we are likely to run on the same host and shared memory communication could be tried.
    if (shmemPort != -1 && locProcDesc.parentNodeId().equals(desc.parentNodeId())) {
      try {
        return createShmemClient(desc, shmemPort);
      } catch (IgniteCheckedException e) {
        if (e.hasCause(IpcOutOfSystemResourcesException.class))
          // Has cause or is itself the IpcOutOfSystemResourcesException.
          LT.warn(log, null, OUT_OF_RESOURCES_TCP_MSG);
        else if (log.isDebugEnabled())
          log.debug(
              "Failed to establish shared memory connection with local hadoop process: " + desc);
      }
    }

    return createTcpClient(desc);
  }