@Override
    final long reserveEarliestAvailable(int requiredPermits, long nowMicros) {
        resync(nowMicros);
        long returnValue = nextFreeTicketMicros;
        double storedPermitsToSpend = min(requiredPermits, this.storedPermits);
        double freshPermits = requiredPermits - storedPermitsToSpend;
        long waitMicros = storedPermitsToWaitTime(this.storedPermits, storedPermitsToSpend)
                + (long) (freshPermits * stableIntervalMicros);

        try {
            this.nextFreeTicketMicros = checkedAdd(nextFreeTicketMicros, waitMicros);
        } catch (ArithmeticException e) {
            this.nextFreeTicketMicros = Long.MAX_VALUE;
        }
        this.storedPermits -= storedPermitsToSpend;
        return returnValue;
    }
The time when the next request (no matter its size) will be granted. After granting a
request, this is pushed further in the future. Large requests push this further than small
requests.
lts-core/src/main/java/com/github/ltsopensource/core/commons/concurrent/limiter/SmoothRateLimiter.java