docs: private void drain() {
      assert scheduler.inEventLoop();
      long now = clock.nanoTime();
      lock.lock();
      try {
        if (closed || queue.isEmpty()) {
          return;
        }
        int toDequeue = acquire(now, queue.size());
        LOG.trace("[{}] Dequeuing {}/{} elements", logPrefix, toDequeue, queue.size());
        for (int i = 0; i < toDequeue; i++) {
          LOG.trace("[{}] Starting dequeued request", logPrefix);
          queue.poll().onThrottleReady(true);
        }
        if (!queue.isEmpty()) {
          LOG.trace(
              "[{}] {} elements remaining in queue, rescheduling drain task",
              logPrefix,
              queue.size());
          scheduler.schedule(this::drain, drainIntervalNanos, TimeUnit.NANOSECONDS);
        }
      } finally {
        lock.unlock();
      }
    }