Class BandwidthManager

java.lang.Object
org.klomp.snark.BandwidthManager
All Implemented Interfaces:
BandwidthListener

public class BandwidthManager extends Object implements BandwidthListener
Bandwidth and bandwidth limits Maintain three bandwidth estimators: Sent, received, and requested. There are three layers of BandwidthListeners:
  BandwidthManager (total)
      PeerCoordinator (per-torrent)
          Peer/WebPeer (per-connection)
Here at the top, we use SyntheticRedQueues for accurate and current moving averages of up, down, and requested bandwidth. At the lower layers, simple weighted moving averages of three buckets of 40 seconds each (2 minutes total) are used for up and down, and requested is delegated here. The lower layers must report to the next-higher layer. At the Peer layer, we report inbound piece data per-read, not per-piece, to get a smoother inbound estimate. Only the following data are counted by the BandwidthListeners:
  • Pieces (both Peer and WebPeer)
  • ut_metadata
No overhead at any layer is accounted for.
Since:
0.9.62
  • Constructor Details

    • BandwidthManager

      BandwidthManager(I2PAppContext ctx, int upLimit, int downLimit)
  • Method Details

    • setUpBWLimit

      void setUpBWLimit(long upLimit)
      Current limit in Bps
    • setDownBWLimit

      void setDownBWLimit(long downLimit)
      Current limit in Bps
    • getRequestRate

      long getRequestRate()
      The average rate in Bps
    • getUploadRate

      public long getUploadRate()
      The average rate in Bps
      Specified by:
      getUploadRate in interface BandwidthListener
    • getDownloadRate

      public long getDownloadRate()
      The average rate in Bps
      Specified by:
      getDownloadRate in interface BandwidthListener
    • uploaded

      public void uploaded(int size)
      We unconditionally sent this many bytes
      Specified by:
      uploaded in interface BandwidthListener
    • downloaded

      public void downloaded(int size)
      We received this many bytes
      Specified by:
      downloaded in interface BandwidthListener
    • shouldSend

      public boolean shouldSend(int size)
      Should we send this many bytes? Do NOT call uploaded() if this returns true.
      Specified by:
      shouldSend in interface BandwidthListener
    • shouldRequest

      public boolean shouldRequest(Peer peer, int size)
      Should we request this many bytes?
      Specified by:
      shouldRequest in interface BandwidthListener
      Parameters:
      peer - ignored
    • getUpBWLimit

      public long getUpBWLimit()
      Current limit in BPS
      Specified by:
      getUpBWLimit in interface BandwidthListener
    • getDownBWLimit

      public long getDownBWLimit()
      Current limit in BPS
      Specified by:
      getDownBWLimit in interface BandwidthListener
    • overUpBWLimit

      public boolean overUpBWLimit()
      Are we currently over the limit?
      Specified by:
      overUpBWLimit in interface BandwidthListener
    • overDownBWLimit

      public boolean overDownBWLimit()
      Are we currently over the limit?
      Specified by:
      overDownBWLimit in interface BandwidthListener
    • toString

      public String toString()
      In HTML for debug page
      Overrides:
      toString in class Object