#include <PeerStorage.h>
Public Member Functions | |
~PeerStorage () | |
size_t | size () |
const PeerHashMap::iterator | find (const IPvXAddress &ip) |
const PeerHashMap::iterator | begin () |
const PeerHashMap::iterator | end () |
std::pair< const PeerHashMap::iterator, bool > | insert (const std::pair< IPvXAddress, BootstrapEntry > &element) |
void | erase (const PeerHashMap::iterator it) |
const PeerHashMap::iterator | getRandomNode (int32_t nodeType, bool bootstrappedNeeded, bool inoffensiveNeeded) |
void | setMalicious (const PeerHashMap::iterator it, bool malicious) |
void | setBootstrapped (const PeerHashMap::iterator it, bool bootstrapped) |
const PeerHashMap & | getPeerHashMap () |
Private Member Functions | |
void | insertMapIteratorIntoVector (PeerHashMap::iterator it) |
void | removeMapIteratorFromVector (PeerHashMap::iterator it) |
size_t | offsetSize () |
uint8_t | calcOffset (bool bootstrapped, bool malicious) |
Private Attributes | |
PeerHashMap | peerHashMap |
std::vector< std::vector < PeerHashMap::iterator > > | peerVector |
std::vector< std::vector < uint32_t > > | freeVector |
Definition at line 58 of file PeerStorage.h.
PeerStorage::~PeerStorage | ( | ) |
Definition at line 30 of file PeerStorage.cc.
{ PeerHashMap::iterator it; for (it = peerHashMap.begin(); it != peerHashMap.end(); it++) { delete it->second.info; delete it->second.node; } }
const PeerHashMap::iterator PeerStorage::begin | ( | ) |
Definition at line 49 of file PeerStorage.cc.
Referenced by GlobalNodeList::sendNotificationToAllPeers().
{ return peerHashMap.begin(); }
uint8_t PeerStorage::calcOffset | ( | bool | bootstrapped, | |
bool | malicious | |||
) | [inline, private] |
Definition at line 64 of file PeerStorage.cc.
Referenced by insertMapIteratorIntoVector(), and removeMapIteratorFromVector().
{ uint8_t offset = 0; if (bootstrapped) offset += 1<<0; if (malicious) offset += 1<<1; return offset; }
const PeerHashMap::iterator PeerStorage::end | ( | ) |
Definition at line 54 of file PeerStorage.cc.
Referenced by GlobalNodeList::getBootstrapNode(), GlobalNodeList::getPeerInfo(), GlobalNodeList::getRandomAliveNode(), GlobalNodeList::getRandomNode(), GlobalNodeList::getRandomPeerInfo(), GlobalNodeList::killPeer(), GlobalNodeList::refreshEntry(), GlobalNodeList::registerPeer(), GlobalNodeList::removePeer(), and GlobalNodeList::sendNotificationToAllPeers().
{ return peerHashMap.end(); }
void PeerStorage::erase | ( | const PeerHashMap::iterator | it | ) |
Definition at line 149 of file PeerStorage.cc.
Referenced by GlobalNodeList::killPeer().
{ removeMapIteratorFromVector(it); delete it->second.info; delete it->second.node; peerHashMap.erase(it); }
const PeerHashMap::iterator PeerStorage::find | ( | const IPvXAddress & | ip | ) |
Definition at line 44 of file PeerStorage.cc.
Referenced by GlobalNodeList::getBootstrapNode(), GlobalNodeList::getPeerInfo(), GlobalNodeList::killPeer(), GlobalNodeList::refreshEntry(), GlobalNodeList::registerPeer(), GlobalNodeList::removePeer(), and GlobalNodeList::setMalicious().
{ return peerHashMap.find(ip); }
const PeerHashMap& PeerStorage::getPeerHashMap | ( | ) | [inline] |
Definition at line 73 of file PeerStorage.h.
Referenced by GlobalNodeList::initialize().
{ return peerHashMap; };
const PeerHashMap::iterator PeerStorage::getRandomNode | ( | int32_t | nodeType, | |
bool | bootstrappedNeeded, | |||
bool | inoffensiveNeeded | |||
) |
Definition at line 180 of file PeerStorage.cc.
Referenced by GlobalNodeList::getRandomAliveNode(), GlobalNodeList::getRandomNode(), and GlobalNodeList::getRandomPeerInfo().
{ if (peerHashMap.size() == 0) { std::cout << "getRandomNode: empty!" << std::endl; return peerHashMap.end(); } size_t sum = 0; //std::cout << "getRandomNode(): nodeType: " << nodeType << " boostrapped: " // << bootstrappedNeeded << " inoffensive: " << inoffensiveNeeded // << std::endl; for (uint i = 0; i < peerVector.size(); i++) { if (((nodeType > -1) && ((uint)nodeType != i/offsetSize())) || (bootstrappedNeeded && !(i & 1)) || (inoffensiveNeeded && (i & 2))) { continue; } //std::cout << "Using i=" << i << std::endl; sum += (peerVector[i].size() - freeVector[i].size()); //std::cout << "new sum: " << sum << std::endl; } if (sum == 0) { return peerHashMap.end(); } size_t random = intuniform(1, sum); uint i = 0; while ((i < peerVector.size())) { if (((nodeType > -1) && ((uint)nodeType != i/offsetSize())) || (bootstrappedNeeded && !(i & 1)) || (inoffensiveNeeded && (i & 2))) { i++; continue; } else if ((peerVector[i].size() - freeVector[i].size()) < random) { random -= peerVector[i].size() - freeVector[i].size(); i++; } else { break; } } random = intuniform(1, peerVector[i].size()); PeerHashMap::iterator it = peerVector[i][random-1]; while (it == peerHashMap.end()) { if (random == peerVector[i].size()) { random = 0; } it = peerVector[i][(++random)-1]; } //std::cout << "Using node from vector i=" << i << " and position=" << random-1 << std::endl; return it; }
std::pair< const PeerHashMap::iterator, bool > PeerStorage::insert | ( | const std::pair< IPvXAddress, BootstrapEntry > & | element | ) |
Definition at line 136 of file PeerStorage.cc.
Referenced by GlobalNodeList::addPeer().
{ std::pair<PeerHashMap::iterator, bool> ret; ret = peerHashMap.insert(element); if (ret.second) { insertMapIteratorIntoVector(ret.first); } return ret; }
void PeerStorage::insertMapIteratorIntoVector | ( | PeerHashMap::iterator | it | ) | [private] |
Definition at line 72 of file PeerStorage.cc.
Referenced by insert(), setBootstrapped(), and setMalicious().
{ PeerInfo* peerInfo = it->second.info; bool bootstrapped = peerInfo->isBootstrapped(); bool malicious = peerInfo->isMalicious(); size_t partition = peerInfo->getTypeID(); size_t offset = calcOffset(bootstrapped, malicious); size_t partitionIndex = partition*offsetSize()+offset; #if 0 std::cout << "INSERT " << it->first << " partitionIndex:" << partitionIndex << " bootstrapped:" << bootstrapped << " malicious:" << malicious << std::endl; #endif if (peerVector.size() < (partition + 1)*offsetSize()) { int i = peerVector.size(); peerVector.resize(offsetSize()*(partition + 1)); freeVector.resize(offsetSize()*(partition + 1)); while (i < (int)(peerVector.size())) { peerVector[i++].reserve(30000); freeVector[i++].reserve(30000); } } size_t index = -1; if ((freeVector.size() >= (partition + 1)*offsetSize()) && (freeVector[partitionIndex].size())) { index = freeVector[partitionIndex].back(); freeVector[partitionIndex].pop_back(); peerVector[partitionIndex][index] = it; //std::cout << "\t REUSING position " << index << std::endl; } else { index = peerVector[partitionIndex].size(); peerVector[partitionIndex].push_back(it); //std::cout << "\t APPENDING at position " << index << std::endl; } it->second.peerVectorIndex = index; }
size_t PeerStorage::offsetSize | ( | ) | [inline, private] |
Definition at line 59 of file PeerStorage.cc.
Referenced by getRandomNode(), insertMapIteratorIntoVector(), and removeMapIteratorFromVector().
{
return 1<<2;
}
void PeerStorage::removeMapIteratorFromVector | ( | PeerHashMap::iterator | it | ) | [private] |
Definition at line 116 of file PeerStorage.cc.
Referenced by erase(), setBootstrapped(), and setMalicious().
{ PeerInfo* peerInfo = it->second.info; bool bootstrapped = peerInfo->isBootstrapped(); bool malicious = peerInfo->isMalicious(); size_t partition = peerInfo->getTypeID(); size_t offset = calcOffset(bootstrapped, malicious); size_t index = it->second.peerVectorIndex; size_t partitionIndex = partition*offsetSize()+offset; if (peerVector[partitionIndex].size() == (index + 1)) { peerVector[partitionIndex].pop_back(); } else { peerVector[partitionIndex][index] = peerHashMap.end(); freeVector[partitionIndex].push_back(index); } //std::cout << "ERASE " << it->first << " partitionIndex:" << partitionIndex // << " index: " << index << std::endl; }
void PeerStorage::setBootstrapped | ( | const PeerHashMap::iterator | it, | |
bool | bootstrapped | |||
) |
Definition at line 168 of file PeerStorage.cc.
Referenced by GlobalNodeList::registerPeer(), and GlobalNodeList::removePeer().
{ if (it == peerHashMap.end()) { throw cRuntimeError("GlobalNodeList::setMalicious(): Node not found!"); } removeMapIteratorFromVector(it); //std::cout << "setBootstrapped: " << bootstrapped << std::endl; it->second.info->setBootstrapped(bootstrapped); insertMapIteratorIntoVector(it); }
void PeerStorage::setMalicious | ( | const PeerHashMap::iterator | it, | |
bool | malicious | |||
) |
Definition at line 157 of file PeerStorage.cc.
Referenced by GlobalNodeList::setMalicious().
{ if (it == peerHashMap.end()) { throw cRuntimeError("GlobalNodeList::setMalicious(): Node not found!"); } removeMapIteratorFromVector(it); it->second.info->setMalicious(malicious); insertMapIteratorIntoVector(it); }
size_t PeerStorage::size | ( | ) |
Definition at line 39 of file PeerStorage.cc.
Referenced by GlobalNodeList::addPeer(), GlobalNodeList::getNumNodes(), GlobalNodeList::getRandomAliveNode(), getRandomNode(), GlobalNodeList::handleMessage(), insertMapIteratorIntoVector(), and removeMapIteratorFromVector().
{ return peerHashMap.size(); }
std::vector<std::vector<uint32_t> > PeerStorage::freeVector [private] |
Definition at line 83 of file PeerStorage.h.
Referenced by getRandomNode(), insertMapIteratorIntoVector(), and removeMapIteratorFromVector().
PeerHashMap PeerStorage::peerHashMap [private] |
Definition at line 81 of file PeerStorage.h.
Referenced by begin(), end(), erase(), find(), getPeerHashMap(), getRandomNode(), insert(), removeMapIteratorFromVector(), setBootstrapped(), setMalicious(), size(), and ~PeerStorage().
std::vector<std::vector<PeerHashMap::iterator> > PeerStorage::peerVector [private] |
Definition at line 82 of file PeerStorage.h.
Referenced by getRandomNode(), insertMapIteratorIntoVector(), and removeMapIteratorFromVector().