Class PeerProfile

java.lang.Object
net.i2p.router.peermanager.PeerProfile

public class PeerProfile extends Object
Copied from http://www.i2p2.i2p/how_peerselection.html See also main() below for additional commentary by zzz. Currently, there is no 'ejection' strategy to get rid of the profiles for peers that are no longer active (or when the network consists of thousands of peers, to get rid of peers that are performing poorly). However, the size of each profile is fairly small, and is unrelated to how much data is collected about the peer, so that a router can keep a few thousand active peer profiles before the overhead becomes a serious concern. Once it becomes necessary, we can simply compact the poorly performing profiles (keeping only the most basic data) and maintain hundreds of thousands of profiles in memory. Beyond that size, we can simply eject the peers (e.g. keeping the best 100,000). TODO most of the methods should be synchronized.
  • Field Details

    • ENABLE_TUNNEL_TEST_RESPONSE_TIME

      static final boolean ENABLE_TUNNEL_TEST_RESPONSE_TIME
      See Also:
  • Constructor Details

    • PeerProfile

      public PeerProfile(RouterContext context, Hash peer)
      Caller should call setLastHeardAbout() and setFirstHeardAbout()
      Parameters:
      peer - non-null
  • Method Details

    • getPeer

      public Hash getPeer()
      what peer is being profiled, non-null
    • getIsExpanded

      public boolean getIsExpanded()
      are we keeping an expanded profile on the peer, or just the bare minimum. If we aren't keeping the expanded profile, all of the rates as well as the TunnelHistory and DBHistory will not be available.
    • getIsExpandedDB

      public boolean getIsExpandedDB()
    • getIsActive

      public boolean getIsActive()
      Is this peer active at the moment (sending/receiving messages within the last 5 minutes)
    • isEstablished

      boolean isEstablished()
      Since:
      0.8.11
    • wasUnreachable

      boolean wasUnreachable()
      Since:
      0.8.11
    • isSameCountry

      boolean isSameCountry()
      Since:
      0.8.11
    • getXORDistance

      int getXORDistance()
      For now, just a one-byte comparison
      Returns:
      -127 to +128, lower is closer
      Since:
      0.8.11
    • getIsActive

      public boolean getIsActive(long period)
      Is this peer active at the moment (sending/receiving messages within the given period?) Also mark active if it is connected, as this will tend to encourage use of already-connected peers. Note: this appears to be the only use for these two RateStats. Update: Rewritten so we can get rid of the two RateStats. This also helps by not having it depend on coalesce boundaries.
      Parameters:
      period - must be one of the periods in the RateStat constructors below (5*60*1000 or 60*60*1000)
    • getFirstHeardAbout

      public long getFirstHeardAbout()
      When did we first hear about this peer?
      Returns:
      greater than zero, set to now in consturctor
    • setFirstHeardAbout

      void setFirstHeardAbout(long when)
      Set when did we first heard about this peer, only if older. Package private, only set by profile management subsystem.
    • getLastHeardAbout

      public long getLastHeardAbout()
      when did we last hear about this peer?
      Returns:
      0 if unset
    • setLastHeardAbout

      public void setLastHeardAbout(long when)
      Set when did we last hear about this peer, only if unset or newer Also sets FirstHeardAbout if earlier
    • getLastSendSuccessful

      public long getLastSendSuccessful()
      when did we last send to this peer successfully?
    • setLastSendSuccessful

      public void setLastSendSuccessful(long when)
    • getLastSendFailed

      public long getLastSendFailed()
      when did we last have a problem sending to this peer?
    • setLastSendFailed

      public void setLastSendFailed(long when)
    • getLastHeardFrom

      public long getLastHeardFrom()
      when did we last hear from the peer?
    • setLastHeardFrom

      public void setLastHeardFrom(long when)
    • getTunnelHistory

      public TunnelHistory getTunnelHistory()
      history of tunnel activity with the peer Warning - may return null if !getIsExpanded()
    • setTunnelHistory

      public void setTunnelHistory(TunnelHistory history)
    • getDBHistory

      public DBHistory getDBHistory()
      history of db activity with the peer Warning - may return null if !getIsExpandedDB()
    • setDBHistory

      public void setDBHistory(DBHistory hist)
    • getDbResponseTime

      public RateStat getDbResponseTime()
      how long it takes to get a db response from the peer (in milliseconds), calculated over a 1 minute, 1 hour, and 1 day period Warning - may return null if !getIsExpandedDB()
    • getTunnelCreateResponseTime

      public RateStat getTunnelCreateResponseTime()
      how long it takes to get a tunnel create response from the peer (in milliseconds), calculated over a 1 minute, 1 hour, and 1 day period Warning - may return null if !getIsExpanded()
    • getTunnelTestResponseTime

      @Deprecated public RateStat getTunnelTestResponseTime()
      Deprecated.
      unused
      How long it takes to successfully test a tunnel this peer participates in (in milliseconds), calculated over a 10 minute, 1 hour, and 1 day period Warning - may return null if !getIsExpanded()
      Returns:
      null always
    • getDbIntroduction

      public RateStat getDbIntroduction()
      how many new peers we get from dbSearchReplyMessages or dbStore messages, calculated over a 1 hour, 1 day, and 1 week period Warning - may return null if !getIsExpandedDB()
    • getSpeedBonus

      public int getSpeedBonus()
      extra factor added to the speed ranking - this can be updated in the profile written to disk to affect how the algorithm ranks speed. Negative values are penalties
    • setSpeedBonus

      public void setSpeedBonus(int bonus)
    • getCapacityBonus

      public int getCapacityBonus()
      extra factor added to the capacity ranking - this can be updated in the profile written to disk to affect how the algorithm ranks capacity. Negative values are penalties
    • setCapacityBonus

      public void setCapacityBonus(int bonus)
    • getIntegrationBonus

      public int getIntegrationBonus()
      extra factor added to the integration ranking - this can be updated in the profile written to disk to affect how the algorithm ranks integration. Negative values are penalties
    • setIntegrationBonus

      public void setIntegrationBonus(int bonus)
    • getSpeedValue

      public float getSpeedValue()
      How fast is the peer, taking into consideration both throughput and latency. This may even be made to take into consideration current rates vs. estimated (or measured) max rates, allowing this speed to reflect the speed /available/.
    • getCapacityValue

      public float getCapacityValue()
      How many tunnels do we think this peer can handle over the next hour?
    • getIntegrationValue

      public float getIntegrationValue()
      How well integrated into the network is this peer (as measured by how much they've told us that we didn't already know). Higher numbers means better integrated
    • getIsFailing

      public boolean getIsFailing()
      is this peer actively failing (aka not worth touching)? deprecated - unused - always false
    • getTunnelTestTimeAverage

      @Deprecated public float getTunnelTestTimeAverage()
      Deprecated.
      unused
      Returns:
      0 always
    • setTunnelTestTimeAverage

      @Deprecated void setTunnelTestTimeAverage(float avg)
      Deprecated.
      unused
    • updateTunnelTestTimeAverage

      @Deprecated void updateTunnelTestTimeAverage(long ms)
      Deprecated.
      unused
    • getPeakThroughputKBps

      public float getPeakThroughputKBps()
    • setPeakThroughputKBps

      void setPeakThroughputKBps(float kBps)
      Only for restoration from persisted profile.
    • dataPushed

      void dataPushed(int size)
    • tunnelDataTransferred

      void tunnelDataTransferred(long tunnelByteLifetime)
      the tunnel pushed that much data in its lifetime
    • getPeakTunnelThroughputKBps

      public float getPeakTunnelThroughputKBps()
    • setPeakTunnelThroughputKBps

      void setPeakTunnelThroughputKBps(float kBps)
      Only for restoration from persisted profile.
    • dataPushed1m

      void dataPushed1m(int size)
      the tunnel pushed that much data in a 1 minute period
    • getPeakTunnel1mThroughputKBps

      public float getPeakTunnel1mThroughputKBps()
      This is the speed value
      Returns:
      the average of the three fastest one-minute data transfers, on a per-tunnel basis, through this peer. Ever. Except that the peak values are cut in half periodically by coalesceThroughput().
    • setPeakTunnel1mThroughputKBps

      void setPeakTunnel1mThroughputKBps(float kBps)
      Only for restoration from persisted profile.
    • expandProfile

      public void expandProfile()
      When the given peer is performing well enough that we want to keep detailed stats on them again, call this to set up the info we dropped during shrinkProfile. This will not however overwrite any existing data, so it can be safely called repeatedly
    • expandDBProfile

      public void expandDBProfile()
      For floodfills
    • coalesceStats

      void coalesceStats()
      Update the stats and rates. This is only called by addProfile()
    • coalesceOnly

      void coalesceOnly(boolean shouldDecay)
      Caller must next call updateValues()
      Since:
      0.9.4
    • updateValues

      void updateValues()
      Copy over the new values generated by coalesceOnly()
      Since:
      0.9.4
    • setIsFailing

      void setIsFailing(boolean val)
      deprecated - unused - always false
    • getContext

      RouterContext getContext()
      Helper for calculators
      Since:
      0.9.2
    • hashCode

      public int hashCode()
      Overrides:
      hashCode in class Object
    • equals

      public boolean equals(Object obj)
      Overrides:
      equals in class Object
    • toString

      public String toString()
      Overrides:
      toString in class Object