code: private void maybeSendNewPermitRequest() {
      if (!this.requestSemaphore.tryAcquire()) {
        return;
      }
      if (!this.retryStatus.canRetryNow()) {
        this.requestSemaphore.release();
        return;
      }
      try {
        long permits = computeNextPermitRequest();
        if (permits <= 0) {
          this.requestSemaphore.release();
          return;
        }
  
        PermitRequest permitRequest = this.basePermitRequest.copy();
        permitRequest.setPermits(permits);
        permitRequest.setMinPermits((long) this.permitsOutstanding.getAverageWeightOrZero());
        permitRequest.setVersion(ThrottlingProtocolVersion.WAIT_ON_CLIENT.ordinal());
        if (BatchedPermitsRequester.this.restRequestHistogram != null) {
          BatchedPermitsRequester.this.restRequestHistogram.update(permits);
        }
  
        log.debug("Sending permit request " + permitRequest);
  
        this.requestSender.sendRequest(permitRequest, new AllocationCallback(
            BatchedPermitsRequester.this.restRequestTimer == null ? NoopCloseable.INSTANCE :
                BatchedPermitsRequester.this.restRequestTimer.time(), new Sleeper()));
      } catch (CloneNotSupportedException cnse) {
        // This should never happen.
        this.requestSemaphore.release();
        throw new RuntimeException(cnse);
      }
    }
docs: Send a new permit request to the server.