Class 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 time PeerCoordinator.CHECK_PERIOD each 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 Detail

      • BandwidthManager

        BandwidthManager​(I2PAppContext ctx,
                         int upLimit,
                         int downLimit)
    • Method Detail

      • 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
      • 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