void CAddrMan::MakeTried(CAddrInfo& info, int nId, int nOrigin) { assert(vvNew[nOrigin].count(nId) == 1); // remove the entry from all new buckets for (std::vector<std::set<int> >::iterator it = vvNew.begin(); it != vvNew.end(); it++) { if ((*it).erase(nId)) info.nRefCount--; } nNew--; assert(info.nRefCount == 0); // what tried bucket to move the entry to int nKBucket = info.GetTriedBucket(nKey); std::vector<int> &vTried = vvTried[nKBucket]; // first check whether there is place to just add it if (vTried.size() < ADDRMAN_TRIED_BUCKET_SIZE) { vTried.push_back(nId); nTried++; info.fInTried = true; return; } // otherwise, find an item to evict int nPos = SelectTried(nKBucket); // find which new bucket it belongs to assert(mapInfo.count(vTried[nPos]) == 1); int nUBucket = mapInfo[vTried[nPos]].GetNewBucket(nKey); std::set<int> &vNew = vvNew[nUBucket]; // remove the to-be-replaced tried entry from the tried set CAddrInfo& infoOld = mapInfo[vTried[nPos]]; infoOld.fInTried = false; infoOld.nRefCount = 1; // do not update nTried, as we are going to move something else there immediately // check whether there is place in that one, if (vNew.size() < ADDRMAN_NEW_BUCKET_SIZE) { // if so, move it back there vNew.insert(vTried[nPos]); } else { // otherwise, move it to the new bucket nId came from (there is certainly place there) vvNew[nOrigin].insert(vTried[nPos]); } nNew++; vTried[nPos] = nId; // we just overwrote an entry in vTried; no need to update nTried info.fInTried = true; return; }
void CAddrMan::MakeTried(CAddrInfo& info, int nId, int nOrigin) { assert(vvNew[nOrigin].count(nId) == 1); // remove the entry from all new buckets удаление записей из всех новых бакетов for (std::vector<std::set<int> >::iterator it = vvNew.begin(); it != vvNew.end(); it++) { if ((*it).erase(nId)) info.nRefCount--; } nNew--; assert(info.nRefCount == 0); // what tried bucket to move the entry to что пытались бакет для перемещения записи int nKBucket = info.GetTriedBucket(nKey); std::vector<int> &vTried = vvTried[nKBucket]; // first check whether there is place to just add it сначала проверьте, есть ли место, чтобы просто добавить его if (vTried.size() < ADDRMAN_TRIED_BUCKET_SIZE) { vTried.push_back(nId); nTried++; info.fInTried = true; return; } // otherwise, find an item to evict в противном случае, найти пункт, чтобы выселить int nPos = SelectTried(nKBucket); // find which new bucket it belongs to найти, к какому новому бакету он принадлежит assert(mapInfo.count(vTried[nPos]) == 1); int nUBucket = mapInfo[vTried[nPos]].GetNewBucket(nKey); std::set<int> &vNew = vvNew[nUBucket]; // remove the to-be-replaced tried entry from the tried set удаление быть-замененой проверенную запись из проверяемого набора CAddrInfo& infoOld = mapInfo[vTried[nPos]]; infoOld.fInTried = false; infoOld.nRefCount = 1; // do not update nTried, as we are going to move something else there immediately не модернизирорать nTried, поскольку мы собираемся перемещать что-то еще туда немедленно // check whether there is place in that one, проверьте, есть ли место для одного if (vNew.size() < ADDRMAN_NEW_BUCKET_SIZE) { // if so, move it back there если это так, переместить его туда vNew.insert(vTried[nPos]); } else { // otherwise, move it to the new bucket nId came from (there is certainly place there) иначе, переместить его в новый бакет nId (безусловно есть там) vvNew[nOrigin].insert(vTried[nPos]); } nNew++; vTried[nPos] = nId; // we just overwrote an entry in vTried; no need to update nTried мы просто переписываем запись в vTried, не нужно обновлять nTried info.fInTried = true; return; }
void CAddrMan::MakeTried(CAddrInfo& info, int nId) { // remove the entry from all new buckets for (int bucket = 0; bucket < ADDRMAN_NEW_BUCKET_COUNT; bucket++) { int pos = info.GetBucketPosition(nKey, true, bucket); if (vvNew[bucket][pos] == nId) { vvNew[bucket][pos] = -1; info.nRefCount--; } } nNew--; assert(info.nRefCount == 0); // which tried bucket to move the entry to int nKBucket = info.GetTriedBucket(nKey); int nKBucketPos = info.GetBucketPosition(nKey, false, nKBucket); // first make space to add it (the existing tried entry there is moved to new, deleting whatever is there). if (vvTried[nKBucket][nKBucketPos] != -1) { // find an item to evict int nIdEvict = vvTried[nKBucket][nKBucketPos]; assert(mapInfo.count(nIdEvict) == 1); CAddrInfo& infoOld = mapInfo[nIdEvict]; // Remove the to-be-evicted item from the tried set. infoOld.fInTried = false; vvTried[nKBucket][nKBucketPos] = -1; nTried--; // find which new bucket it belongs to int nUBucket = infoOld.GetNewBucket(nKey); int nUBucketPos = infoOld.GetBucketPosition(nKey, true, nUBucket); ClearNew(nUBucket, nUBucketPos); assert(vvNew[nUBucket][nUBucketPos] == -1); // Enter it into the new set again. infoOld.nRefCount = 1; vvNew[nUBucket][nUBucketPos] = nIdEvict; nNew++; } assert(vvTried[nKBucket][nKBucketPos] == -1); vvTried[nKBucket][nKBucketPos] = nId; nTried++; info.fInTried = true; }
void CAddrMan::MakeTried(CAddrInfo& info, int nId) { for (int bucket = 0; bucket < ADDRMAN_NEW_BUCKET_COUNT; bucket++) { int pos = info.GetBucketPosition(nKey, true, bucket); if (vvNew[bucket][pos] == nId) { vvNew[bucket][pos] = -1; info.nRefCount--; } } nNew--; assert(info.nRefCount == 0); int nKBucket = info.GetTriedBucket(nKey); int nKBucketPos = info.GetBucketPosition(nKey, false, nKBucket); if (vvTried[nKBucket][nKBucketPos] != -1) { int nIdEvict = vvTried[nKBucket][nKBucketPos]; assert(mapInfo.count(nIdEvict) == 1); CAddrInfo& infoOld = mapInfo[nIdEvict]; infoOld.fInTried = false; vvTried[nKBucket][nKBucketPos] = -1; nTried--; int nUBucket = infoOld.GetNewBucket(nKey); int nUBucketPos = infoOld.GetBucketPosition(nKey, true, nUBucket); ClearNew(nUBucket, nUBucketPos); assert(vvNew[nUBucket][nUBucketPos] == -1); infoOld.nRefCount = 1; vvNew[nUBucket][nUBucketPos] = nIdEvict; nNew++; } assert(vvTried[nKBucket][nKBucketPos] == -1); vvTried[nKBucket][nKBucketPos] = nId; nTried++; info.fInTried = true; }