Class ThrottledInputStream

All Implemented Interfaces:
Closeable, AutoCloseable

public final class ThrottledInputStream extends CountingInputStream
Provides bandwidth throttling on a specified InputStream. It is implemented as a wrapper on top of another InputStream instance. The throttling works by examining the number of bytes read from the underlying InputStream from the beginning, and sleep()ing for a time interval if the byte-transfer is found exceed the specified tolerable maximum. (Thus, while the read-rate might exceed the maximum for a short interval, the average tends towards the specified maximum, overall.)

To build an instance, see ThrottledInputStream.Builder

Inspired by Apache HBase's class of the same name.

Since:
2.16.0
See Also:
  • Field Details

    • maxBytesPerSecond

      private final long maxBytesPerSecond
    • startTime

      private final long startTime
    • totalSleepDuration

      private Duration totalSleepDuration
  • Constructor Details

    • ThrottledInputStream

      private ThrottledInputStream(InputStream proxy, long maxBytesPerSecond)
  • Method Details

    • builder

      public static ThrottledInputStream.Builder builder()
      Returns:
      a new ThrottledInputStream.Builder.
    • toSleepMillis

      static long toSleepMillis(long bytesRead, long maxBytesPerSec, long elapsedMillis)
    • beforeRead

      protected void beforeRead(int n) throws IOException
      Description copied from class: ProxyInputStream
      Invoked by the read methods before the call is proxied. The number of bytes that the caller wanted to read (1 for the ProxyInputStream.read() method, buffer length for ProxyInputStream.read(byte[]), etc.) is given as an argument.

      Subclasses can override this method to add common pre-processing functionality without having to override all the read methods. The default implementation does nothing.

      Note this method is not called from ProxyInputStream.skip(long) or ProxyInputStream.reset(). You need to explicitly override those methods if you want to add pre-processing steps also to them.

      Overrides:
      beforeRead in class ProxyInputStream
      Parameters:
      n - number of bytes that the caller asked to be read.
      Throws:
      IOException - if the pre-processing fails in a subclass.
    • getBytesPerSecond

      private long getBytesPerSecond()
      Gets the read-rate from this stream, since creation. Calculated as bytesRead/elapsedTimeSinceStart.
      Returns:
      Read rate, in bytes/sec.
    • getSleepMillis

      private long getSleepMillis()
    • getTotalSleepDuration

      Duration getTotalSleepDuration()
      Gets the total duration spent in sleep.
      Returns:
      Duration spent in sleep.
    • throttle

      private void throttle() throws InterruptedIOException
      Throws:
      InterruptedIOException
    • toString

      public String toString()
      Overrides:
      toString in class Object