Package net.i2p.router.peermanager
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 Summary
Fields Modifier and Type Field Description (package private) static boolean
ENABLE_TUNNEL_TEST_RESPONSE_TIME
-
Constructor Summary
Constructors Constructor Description PeerProfile(RouterContext context, Hash peer)
Caller should call setLastHeardAbout() and setFirstHeardAbout() -
Method Summary
Modifier and Type Method Description (package private) void
coalesceOnly(boolean shouldDecay)
Caller must next call updateValues()(package private) void
coalesceStats()
Update the stats and rates.(package private) void
dataPushed(int size)
(package private) void
dataPushed1m(int size)
the tunnel pushed that much data in a 1 minute periodboolean
equals(Object obj)
void
expandDBProfile()
For floodfillsvoid
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.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.float
getCapacityValue()
How many tunnels do we think this peer can handle over the next hour?(package private) RouterContext
getContext()
Helper for calculatorsDBHistory
getDBHistory()
history of db activity with the peer Warning - may return null if !getIsExpandedDB()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()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()long
getFirstHeardAbout()
When did we first hear about this peer?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.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).boolean
getIsActive()
Is this peer active at the moment (sending/receiving messages within the last 5 minutes)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.boolean
getIsExpanded()
are we keeping an expanded profile on the peer, or just the bare minimum.boolean
getIsExpandedDB()
boolean
getIsFailing()
is this peer actively failing (aka not worth touching)? deprecated - unused - always falselong
getLastHeardAbout()
when did we last hear about this peer?long
getLastHeardFrom()
when did we last hear from the peer?long
getLastSendFailed()
when did we last have a problem sending to this peer?long
getLastSendSuccessful()
when did we last send to this peer successfully?float
getPeakThroughputKBps()
float
getPeakTunnel1mThroughputKBps()
This is the speed valuefloat
getPeakTunnelThroughputKBps()
Hash
getPeer()
what peer is being profiled, non-nullRateStat
getPeerTestResponseTime()
how long it takes for a peer to respond to a direct test (ms)float
getPeerTestTimeAverage()
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.float
getSpeedValue()
How fast is the peer, taking into consideration both throughput and latency.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()TunnelHistory
getTunnelHistory()
history of tunnel activity with the peer Warning - may return null if !getIsExpanded()RateStat
getTunnelTestResponseTime()
Deprecated.unusedfloat
getTunnelTestTimeAverage()
Deprecated.unused(package private) int
getXORDistance()
For now, just a one-byte comparisonint
hashCode()
(package private) boolean
isEstablished()
(package private) boolean
isSameCountry()
void
setCapacityBonus(int bonus)
void
setDBHistory(DBHistory hist)
(package private) void
setFirstHeardAbout(long when)
Set when did we first heard about this peer, only if older.void
setIntegrationBonus(int bonus)
(package private) void
setIsFailing(boolean val)
deprecated - unused - always falsevoid
setLastHeardAbout(long when)
Set when did we last hear about this peer, only if unset or newer Also sets FirstHeardAbout if earliervoid
setLastHeardFrom(long when)
void
setLastSendFailed(long when)
void
setLastSendSuccessful(long when)
(package private) void
setPeakThroughputKBps(float kBps)
Only for restoration from persisted profile.(package private) void
setPeakTunnel1mThroughputKBps(float kBps)
Only for restoration from persisted profile.(package private) void
setPeakTunnelThroughputKBps(float kBps)
Only for restoration from persisted profile.(package private) void
setPeerTestTimeAverage(float testAvg)
void
setSpeedBonus(int bonus)
void
setTunnelHistory(TunnelHistory history)
(package private) void
setTunnelTestTimeAverage(float avg)
Deprecated.unusedString
toString()
(package private) void
tunnelDataTransferred(long tunnelByteLifetime)
the tunnel pushed that much data in its lifetime(package private) void
updatePeerTestTimeAverage(long ms)
(package private) void
updateTunnelTestTimeAverage(long ms)
Deprecated.unused(package private) void
updateValues()
Copy over the new values generated by coalesceOnly()boolean
wasUnreachable()
-
Field Details
-
ENABLE_TUNNEL_TEST_RESPONSE_TIME
static final boolean ENABLE_TUNNEL_TEST_RESPONSE_TIME- See Also:
- Constant Field Values
-
-
Constructor Details
-
PeerProfile
Caller should call setLastHeardAbout() and setFirstHeardAbout()- Parameters:
peer
- non-null
-
-
Method Details
-
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
public 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
history of tunnel activity with the peer Warning - may return null if !getIsExpanded() -
setTunnelHistory
-
getDBHistory
history of db activity with the peer Warning - may return null if !getIsExpandedDB() -
setDBHistory
-
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
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.unusedHow 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
-
getPeerTestResponseTime
how long it takes for a peer to respond to a direct test (ms) -
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.unused- Returns:
- 0 always
-
setTunnelTestTimeAverage
Deprecated.unused -
updateTunnelTestTimeAverage
Deprecated.unused -
getPeerTestTimeAverage
public float getPeerTestTimeAverage() -
setPeerTestTimeAverage
void setPeerTestTimeAverage(float testAvg) -
updatePeerTestTimeAverage
void updatePeerTestTimeAverage(long ms) -
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() -
equals
-
toString
-