Changeset View
Changeset View
Standalone View
Standalone View
src/addrman.cpp
Show First 20 Lines • Show All 266 Lines • ▼ Show 20 Lines | void CAddrMan::Good_(const CService &addr, bool test_before_evict, | ||||
} | } | ||||
// which tried bucket to move the entry to | // which tried bucket to move the entry to | ||||
int tried_bucket = info.GetTriedBucket(nKey); | int tried_bucket = info.GetTriedBucket(nKey); | ||||
int tried_bucket_pos = info.GetBucketPosition(nKey, false, tried_bucket); | int tried_bucket_pos = info.GetBucketPosition(nKey, false, tried_bucket); | ||||
// Will moving this address into tried evict another entry? | // Will moving this address into tried evict another entry? | ||||
if (test_before_evict && (vvTried[tried_bucket][tried_bucket_pos] != -1)) { | if (test_before_evict && (vvTried[tried_bucket][tried_bucket_pos] != -1)) { | ||||
LogPrint(BCLog::ADDRMAN, "Collision inserting element into " | LogPrint(BCLog::ADDRMAN, | ||||
"tried table, moving %s to " | "Collision inserting element into tried table, moving %s to " | ||||
"m_tried_collisions=%d\n", | "m_tried_collisions=%d\n", | ||||
addr.ToString(), m_tried_collisions.size()); | addr.ToString(), m_tried_collisions.size()); | ||||
if (m_tried_collisions.size() < ADDRMAN_SET_TRIED_COLLISION_SIZE) { | if (m_tried_collisions.size() < ADDRMAN_SET_TRIED_COLLISION_SIZE) { | ||||
m_tried_collisions.insert(nId); | m_tried_collisions.insert(nId); | ||||
} | } | ||||
} else { | } else { | ||||
LogPrint(BCLog::ADDRMAN, "Moving %s to tried\n", addr.ToString()); | LogPrint(BCLog::ADDRMAN, "Moving %s to tried\n", addr.ToString()); | ||||
// move nId to the tried tables | // move nId to the tried tables | ||||
▲ Show 20 Lines • Show All 122 Lines • ▼ Show 20 Lines | CAddrInfo CAddrMan::Select_(bool newOnly) { | ||||
// Use a 50% chance for choosing between tried and new table entries. | // Use a 50% chance for choosing between tried and new table entries. | ||||
if (!newOnly && (nTried > 0 && (nNew == 0 || RandomInt(2) == 0))) { | if (!newOnly && (nTried > 0 && (nNew == 0 || RandomInt(2) == 0))) { | ||||
// use a tried node | // use a tried node | ||||
double fChanceFactor = 1.0; | double fChanceFactor = 1.0; | ||||
while (1) { | while (1) { | ||||
int nKBucket = RandomInt(ADDRMAN_TRIED_BUCKET_COUNT); | int nKBucket = RandomInt(ADDRMAN_TRIED_BUCKET_COUNT); | ||||
int nKBucketPos = RandomInt(ADDRMAN_BUCKET_SIZE); | int nKBucketPos = RandomInt(ADDRMAN_BUCKET_SIZE); | ||||
while (vvTried[nKBucket][nKBucketPos] == -1) { | while (vvTried[nKBucket][nKBucketPos] == -1) { | ||||
nKBucket = | nKBucket = (nKBucket + insecure_rand.randbits( | ||||
(nKBucket + | ADDRMAN_TRIED_BUCKET_COUNT_LOG2)) % | ||||
insecure_rand.randbits(ADDRMAN_TRIED_BUCKET_COUNT_LOG2)) % | |||||
ADDRMAN_TRIED_BUCKET_COUNT; | ADDRMAN_TRIED_BUCKET_COUNT; | ||||
nKBucketPos = | nKBucketPos = (nKBucketPos + insecure_rand.randbits( | ||||
(nKBucketPos + | ADDRMAN_BUCKET_SIZE_LOG2)) % | ||||
insecure_rand.randbits(ADDRMAN_BUCKET_SIZE_LOG2)) % | |||||
ADDRMAN_BUCKET_SIZE; | ADDRMAN_BUCKET_SIZE; | ||||
} | } | ||||
int nId = vvTried[nKBucket][nKBucketPos]; | int nId = vvTried[nKBucket][nKBucketPos]; | ||||
assert(mapInfo.count(nId) == 1); | assert(mapInfo.count(nId) == 1); | ||||
CAddrInfo &info = mapInfo[nId]; | CAddrInfo &info = mapInfo[nId]; | ||||
if (RandomInt(1 << 30) < | if (RandomInt(1 << 30) < | ||||
fChanceFactor * info.GetChance() * (1 << 30)) { | fChanceFactor * info.GetChance() * (1 << 30)) { | ||||
return info; | return info; | ||||
} | } | ||||
fChanceFactor *= 1.2; | fChanceFactor *= 1.2; | ||||
} | } | ||||
} else { | } else { | ||||
// use a new node | // use a new node | ||||
double fChanceFactor = 1.0; | double fChanceFactor = 1.0; | ||||
while (1) { | while (1) { | ||||
int nUBucket = RandomInt(ADDRMAN_NEW_BUCKET_COUNT); | int nUBucket = RandomInt(ADDRMAN_NEW_BUCKET_COUNT); | ||||
int nUBucketPos = RandomInt(ADDRMAN_BUCKET_SIZE); | int nUBucketPos = RandomInt(ADDRMAN_BUCKET_SIZE); | ||||
while (vvNew[nUBucket][nUBucketPos] == -1) { | while (vvNew[nUBucket][nUBucketPos] == -1) { | ||||
nUBucket = | nUBucket = (nUBucket + insecure_rand.randbits( | ||||
(nUBucket + | ADDRMAN_NEW_BUCKET_COUNT_LOG2)) % | ||||
insecure_rand.randbits(ADDRMAN_NEW_BUCKET_COUNT_LOG2)) % | |||||
ADDRMAN_NEW_BUCKET_COUNT; | ADDRMAN_NEW_BUCKET_COUNT; | ||||
nUBucketPos = | nUBucketPos = (nUBucketPos + insecure_rand.randbits( | ||||
(nUBucketPos + | ADDRMAN_BUCKET_SIZE_LOG2)) % | ||||
insecure_rand.randbits(ADDRMAN_BUCKET_SIZE_LOG2)) % | |||||
ADDRMAN_BUCKET_SIZE; | ADDRMAN_BUCKET_SIZE; | ||||
} | } | ||||
int nId = vvNew[nUBucket][nUBucketPos]; | int nId = vvNew[nUBucket][nUBucketPos]; | ||||
assert(mapInfo.count(nId) == 1); | assert(mapInfo.count(nId) == 1); | ||||
CAddrInfo &info = mapInfo[nId]; | CAddrInfo &info = mapInfo[nId]; | ||||
if (RandomInt(1 << 30) < | if (RandomInt(1 << 30) < | ||||
fChanceFactor * info.GetChance() * (1 << 30)) { | fChanceFactor * info.GetChance() * (1 << 30)) { | ||||
return info; | return info; | ||||
} | } | ||||
▲ Show 20 Lines • Show All 268 Lines • Show Last 20 Lines |