All Downloads are FREE. Search and download functionalities are using the official Maven repository.

alluxio.util.RateLimiter Maven / Gradle / Ivy

There is a newer version: 313
Show newest version
/*
 * The Alluxio Open Foundation licenses this work under the Apache License, version 2.0
 * (the "License"). You may not use this work except in alluxio.shaded.client.com.liance with the License, which is
 * available at www.apache.alluxio.shaded.client.org.licenses/LICENSE-2.0
 *
 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
 * either express or implied, as more fully set forth in the License.
 *
 * See the NOTICE file distributed with this work for information regarding copyright ownership.
 */

package alluxio.util;

import java.util.Optional;

/**
 * Used to limit the rate of operations. This rate limiter is not thread safe
 * and the operations are non-blocking. It is used by acquiring a permit for
 * each operation, then checking how the operation should wait by calling
 * {@link RateLimiter#getWaitTimeNanos(long)}.
 */
public interface RateLimiter {

  /**
   * Acquire a permit for the next operation.
   * @return {@link Optional#empty()} if no waiting is needed, otherwise
   * the value contained in the returned optional is the permit, which
   * can be used in calls to {@link RateLimiter#getWaitTimeNanos}
   * to see how long to wait for the operation to be ready.
   */
  Optional acquire();

  /**
   * Checks how long is needed to wait for this permit to be ready.
   * @param permit the permit returned by {@link RateLimiter#acquire()}
   * @return the amount of time needed to wait in nanoseconds
   */
  long getWaitTimeNanos(long permit);

  /**
   * @param permitsPerSecond permits per second
   * @return a rate limiter
   */
  static RateLimiter createRateLimiter(long permitsPerSecond) {
    if (permitsPerSecond <= 0) {
      return new RateLimiter() {
        @Override
        public Optional acquire() {
          return Optional.empty();
        }

        @Override
        public long getWaitTimeNanos(long permit) {
          return 0;
        }
      };
    }
    return new SimpleRateLimiter(permitsPerSecond);
  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy