private OptionalInt findUnusedPort()

in alpha/alpha-server/src/main/java/org/apache/servicecomb/pack/alpha/server/GrpcStartable.java [151:210]


  private OptionalInt findUnusedPort(GrpcServerConfig serverConfig) throws IOException{
    IntStream trialPorts;
    if(serverConfig.getPort()==0){
      LOG.info("No explicit port is given, system will pick up an ephemeral port.");
      if(serverConfig.isPortAutoIncrement() && serverConfig.getPortCount()>0){
        LOG.info("Port trial count must be positive: {}",serverConfig.getPortCount());
        trialPorts = IntStream.range(serverConfig.getInitialPort(),serverConfig.getInitialPort()+serverConfig.getPortCount());
      }else{
        trialPorts = IntStream.range(serverConfig.getInitialPort(),serverConfig.getInitialPort()+1);
      }
    }else{
      trialPorts = IntStream.range(serverConfig.getPort(),serverConfig.getPort()+1);
    }

    IOException[] error = new IOException[1];
    OptionalInt bindPort =  trialPorts.filter(port -> {
      try{
        ServerSocketChannel preBindServerSocketChannel = null;
        ServerSocket preBindServerSocket = null;
        InetSocketAddress inetSocketAddress = new InetSocketAddress(serverConfig.getHost(), port);
        try {
          preBindServerSocketChannel = ServerSocketChannel.open();
          preBindServerSocket = preBindServerSocketChannel.socket();
          preBindServerSocket.setReuseAddress(true);
          preBindServerSocket.setSoTimeout((int)TimeUnit.SECONDS.toMillis(1));
          preBindServerSocket.bind(inetSocketAddress, 100);
          LOG.info("Bind successful to inet socket address {}", inetSocketAddress);
          preBindServerSocketChannel.configureBlocking(false);
          return true;
        } catch (IOException e) {
          LOG.info("Bind failed to inet socket address {}", inetSocketAddress);
          throw e;
        }finally {
          if (preBindServerSocket != null) {
            try {
              preBindServerSocket.close();
            } catch (IOException ex) {
              LOG.error("closeResource failed", ex);
            }
          }
          if(preBindServerSocketChannel != null){
            try {
              preBindServerSocketChannel.close();
            } catch (IOException ex) {
              LOG.error("closeResource failed", ex);
            }
          }
        }
      }catch (IOException e){
        error[0] = e;
      }
      return false;
    }).findAny();

    if(bindPort.isPresent()){
      return bindPort;
    }else{
      throw error[0];
    }
  }