/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.twitter.distributedlog.benchmark.utils;

import com.google.common.util.concurrent.RateLimiter;

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

/**
 * A wrapper over rate limiter
 */
public class ShiftableRateLimiter implements Runnable {

    private final RateLimiter rateLimiter;
    private final ScheduledExecutorService executor;
    private final double initialRate, maxRate, changeRate;
    private double nextRate;

    public ShiftableRateLimiter(double initialRate,
                                double maxRate,
                                double changeRate,
                                long changeInterval,
                                TimeUnit changeIntervalUnit) {
        this.initialRate = initialRate;
        this.maxRate = maxRate;
        this.changeRate = changeRate;
        this.nextRate = initialRate;
        this.rateLimiter = RateLimiter.create(initialRate);
        this.executor = Executors.newSingleThreadScheduledExecutor();
        this.executor.scheduleAtFixedRate(this, changeInterval, changeInterval, changeIntervalUnit);
    }

    @Override
    public void run() {
        this.nextRate = Math.min(nextRate + changeRate, maxRate);
        this.rateLimiter.setRate(nextRate);
    }

    public RateLimiter getLimiter() {
        return this.rateLimiter;
    }
}
