BrooseBucket Class Reference

Broose bucket module. More...

#include <BrooseBucket.h>

List of all members.

Public Member Functions

virtual int numInitStages () const
virtual void initialize (int stage)
virtual void handleMessage (cMessage *msg)
virtual bool add (const NodeHandle &node, bool isAlive=false, simtime_t rtt=MAXTIME)
 adds a broose node handle to the bucket
virtual void remove (const NodeHandle &node)
 removes a broose node handle from the bucket
virtual const BrooseHandleget (uint32_t pos=0)
 returns a specific broose handle
virtual const OverlayKeygetDist (uint32_t pos=0)
 returns distance of a specific broose handle
virtual void initializeBucket (int shiftingBits, uint32_t prefix, int size, Broose *overlay, bool isBBucket=false)
 initializes a bucket
virtual uint32_t getSize ()
 returns number of current entries
virtual uint32_t getMaxSize ()
 returns number of maximal entries
virtual void fillVector (NodeVector *result)
 Fills a NodeVector with all bucket entries.
virtual bool isEmpty ()
 checks if the bucket is empty
virtual void clear ()
 removes all entries from the bucket
virtual int longestPrefix (void)
 return the longest prefix of all entries
virtual bool keyInRange (const OverlayKey &key)
 checks if the key close to the owner's id
virtual int getPos (const NodeHandle &node)
 returns the position of a node in this bucket
virtual int getFailedResponses (const NodeHandle &node)
 returns the number of failed responses to a specific broose handle
virtual void increaseFailedResponses (const NodeHandle &node)
 increase the number of failed responses to a specific broose handle
virtual void resetFailedResponses (const NodeHandle &node)
 resets the counter of failed responses to a specific broose handle
virtual void setRTT (const NodeHandle &node, simtime_t rpcRTT)
 sets the round trip time to a specific broose handle
virtual simtime_t getRTT (const NodeHandle &node)
 returns the round trip time to a specific broose handle
virtual void setLastSeen (const NodeHandle &node, simtime_t lastSeen)
 updates the timestamp of a specific node
virtual simtime_t getLastSeen (const NodeHandle &node)
 returns the timestamp of a specific node
void output (int maxEntries=0)
 displays the content of the bucket on standard out

Protected Attributes

std::map< OverlayKey,
BrooseHandle
bucket
 data structure representing the bucket
std::map< OverlayKey,
BrooseHandle >::iterator 
bucketIter
 iterator to navigate through the bucket
unsigned int maxSize
 maximal size of the bucket
OverlayKey key
 the node's key shifted to fit the bucket and used to measure distance to other keys
Brooseoverlay
 pointer to the main Broose module
bool isBBucket
 true, if this bucket is the node's BBucket

Detailed Description

Broose bucket module.

This modul contains the bucket of the Broose implementation.

Author:
Jochen Schenk
See also:
Broose

Definition at line 43 of file BrooseBucket.h.


Member Function Documentation

bool BrooseBucket::add ( const NodeHandle node,
bool  isAlive = false,
simtime_t  rtt = MAXTIME 
) [virtual]

adds a broose node handle to the bucket

Parameters:
node the NodeHandle to add
isAlive true, if it is known that the node is alive
rtt measured round-trip-time to node
Returns:
true, if the node was known or has been added

Definition at line 70 of file BrooseBucket.cc.

Referenced by Broose::changeState(), and Broose::handleBucketTimerExpired().

00071 {
00072     OverlayKey tmp = key ^ node.getKey();
00073 
00074     bucketIter = bucket.find(tmp);
00075 
00076     if (bucketIter == bucket.end()) {
00077         // new node
00078         if (bucket.size() < maxSize) {
00079              bucketIter = bucket.insert(make_pair(tmp,node)).first;
00080         } else {
00081             std::map<OverlayKey, BrooseHandle>::iterator back = --bucket.end();
00082 
00083             // is the new node closer than the one farthest away,
00084             // remove the one and add the other
00085             if (back->first > tmp) {
00086                 if (isBBucket) {
00087                     // call update() for removed sibling
00088                     overlay->callUpdate(back->second, false);
00089                 }
00090 
00091                 bucket.erase(back);
00092                 bucketIter = bucket.insert(make_pair(tmp,node)).first;
00093             } else {
00094                 // doesn't fit into bucket
00095                 return false;
00096             }
00097         }
00098 
00099         if (isBBucket) {
00100             // call update() for new sibling
00101             overlay->callUpdate(node, true);
00102         }
00103     }
00104 
00105     if (isAlive) {
00106         bucketIter->second.failedResponses = 0;
00107         bucketIter->second.lastSeen = simTime();
00108     }
00109 
00110     if (rtt != MAXTIME) {
00111         bucketIter->second.rtt = rtt;
00112     }
00113 
00114     return true;
00115 }

void BrooseBucket::clear (  )  [virtual]

removes all entries from the bucket

Definition at line 189 of file BrooseBucket.cc.

00190 {
00191     bucket.clear();
00192 }

void BrooseBucket::fillVector ( NodeVector result  )  [virtual]

Fills a NodeVector with all bucket entries.

Parameters:
result a pointer to an existing NodeVector, which gets filled with all bucket entries

Definition at line 194 of file BrooseBucket.cc.

Referenced by Broose::findNode().

00195 {
00196     for (bucketIter = bucket.begin(); bucketIter!=bucket.end(); bucketIter++) {
00197         result->add(bucketIter->second);
00198     }
00199 }

const BrooseHandle & BrooseBucket::get ( uint32_t  pos = 0  )  [virtual]

returns a specific broose handle

Parameters:
pos position of the broose handle in the bucket

Definition at line 137 of file BrooseBucket.cc.

Referenced by Broose::changeState(), Broose::handleBucketRequestRpc(), and Broose::handleBucketTimerExpired().

00138 {
00139     if (pos > bucket.size()) {
00140         error("Index out of bounds(BrooseBucket).");
00141     }
00142 
00143     uint32_t i = 0;
00144     std::map<OverlayKey, BrooseHandle>::iterator it;
00145 
00146     for (it = bucket.begin(); it != bucket.end(); it++, i++) {
00147         if (pos == i) {
00148             return it->second;
00149         }
00150     }
00151 
00152     return BrooseHandle::unspecifiedNode();
00153 }

const OverlayKey & BrooseBucket::getDist ( uint32_t  pos = 0  )  [virtual]

returns distance of a specific broose handle

Parameters:
pos position of the broose handle in the bucket

Definition at line 155 of file BrooseBucket.cc.

Referenced by keyInRange().

00156 {
00157     if (pos > bucket.size()) {
00158         error("Index out of bounds(BrooseBucket).");
00159     }
00160 
00161     uint32_t i = 0;
00162     std::map<OverlayKey, BrooseHandle>::iterator it;
00163 
00164     for (it = bucket.begin(); it != bucket.end(); it++, i++) {
00165         if (pos == i) {
00166             return it->first;
00167         }
00168     }
00169 
00170     return OverlayKey::UNSPECIFIED_KEY;
00171 }

int BrooseBucket::getFailedResponses ( const NodeHandle node  )  [virtual]

returns the number of failed responses to a specific broose handle

Parameters:
node broose handle to check
Returns:
number of failed responses

Definition at line 273 of file BrooseBucket.cc.

00274 {
00275     for (bucketIter = bucket.begin(); bucketIter!=bucket.end(); bucketIter++) {
00276         if (node.getAddress() == bucketIter->second.getAddress())
00277             return bucketIter->second.failedResponses;
00278     }
00279     return -1;
00280 }

simtime_t BrooseBucket::getLastSeen ( const NodeHandle node  )  [virtual]

returns the timestamp of a specific node

Parameters:
node broose handle to which the timestamp will be retrieved
Returns:
the retrieved timestamp

Definition at line 325 of file BrooseBucket.cc.

00326 {
00327     for (bucketIter = bucket.begin(); bucketIter!=bucket.end(); bucketIter++) {
00328         if (node.getAddress() == bucketIter->second.getAddress())
00329             return bucketIter->second.lastSeen;
00330     }
00331     return -2;
00332 }

uint32_t BrooseBucket::getMaxSize (  )  [virtual]

returns number of maximal entries

Returns:
number of maximal entries

Definition at line 179 of file BrooseBucket.cc.

00180 {
00181     return maxSize;
00182 }

int BrooseBucket::getPos ( const NodeHandle node  )  [virtual]

returns the position of a node in this bucket

Parameters:
node broose handle to check
Returns:
the position of the node (0 = first node, -1 = node not in bucket)

Definition at line 262 of file BrooseBucket.cc.

00263 {
00264     int i = -1;
00265     std::map<OverlayKey, BrooseHandle>::iterator it;
00266     for (it = bucket.begin(); it != bucket.end(); it++, i++) {
00267         if (node.getAddress() == it->second.getAddress())
00268             return i;
00269     }
00270     return i;
00271 }

simtime_t BrooseBucket::getRTT ( const NodeHandle node  )  [virtual]

returns the round trip time to a specific broose handle

Parameters:
node broose handle to which the rtt will be retrieved
Returns:
rtt to the specific node

Definition at line 308 of file BrooseBucket.cc.

00309 {
00310     for (bucketIter = bucket.begin(); bucketIter!=bucket.end(); bucketIter++) {
00311         if (node.getAddress() == bucketIter->second.getAddress())
00312             return bucketIter->second.rtt;
00313     }
00314     return -2;
00315 }

uint32_t BrooseBucket::getSize (  )  [virtual]

returns number of current entries

Returns:
number of current entries

Definition at line 174 of file BrooseBucket.cc.

Referenced by Broose::changeState(), Broose::handleBucketRequestRpc(), and Broose::handleBucketTimerExpired().

00175 {
00176     return bucket.size();
00177 }

void BrooseBucket::handleMessage ( cMessage *  msg  )  [virtual]

Definition at line 44 of file BrooseBucket.cc.

00045 {
00046     error("BrooseBucket::handleMessage() shouldn't be called!");
00047 }

void BrooseBucket::increaseFailedResponses ( const NodeHandle node  )  [virtual]

increase the number of failed responses to a specific broose handle

Parameters:
node broose handle which counter will be increased

Definition at line 282 of file BrooseBucket.cc.

00283 {
00284     for (bucketIter = bucket.begin(); bucketIter!=bucket.end(); bucketIter++) {
00285         if (node.getAddress() == bucketIter->second.getAddress())
00286             bucketIter->second.failedResponses++;
00287     }
00288 }

void BrooseBucket::initialize ( int  stage  )  [virtual]

Definition at line 36 of file BrooseBucket.cc.

00037 {
00038     if(stage != MIN_STAGE_OVERLAY)
00039         return;
00040 
00041     WATCH_MAP(bucket);
00042 }

void BrooseBucket::initializeBucket ( int  shiftingBits,
uint32_t  prefix,
int  size,
Broose overlay,
bool  isBBucket = false 
) [virtual]

initializes a bucket

Parameters:
shiftingBits specifies the kind of the bucket
prefix in case of a R bucket specifies the prefix
size maximal size of the bucket
overlay pointer to the main Broose module
isBBucket true, is this bucket is the node's BBucket

Definition at line 49 of file BrooseBucket.cc.

Referenced by Broose::changeState(), and Broose::handleBucketTimerExpired().

00051 {
00052     maxSize = size;
00053     this->overlay = overlay;
00054     this->isBBucket = isBBucket;
00055 
00056     if (shiftingBits < 0) {
00057         key = overlay->getThisNode().getKey() << -shiftingBits;
00058     } else {
00059         key = overlay->getThisNode().getKey() >> shiftingBits;
00060     }
00061 
00062     if (prefix != 0) {
00063         OverlayKey tmp(prefix); // constraint
00064         tmp = tmp << (overlay->getThisNode().getKey().getLength() - shiftingBits);
00065         key = key + tmp;
00066     }
00067     bucket.clear();
00068 }

bool BrooseBucket::isEmpty (  )  [virtual]

checks if the bucket is empty

Returns:
true if the bucket is empty

Definition at line 184 of file BrooseBucket.cc.

00185 {
00186     return bucket.empty();
00187 }

bool BrooseBucket::keyInRange ( const OverlayKey key  )  [virtual]

checks if the key close to the owner's id

Parameters:
key key to check
Returns:
true if node is close

Definition at line 239 of file BrooseBucket.cc.

Referenced by Broose::isSiblingFor().

00240 {
00241     OverlayKey dist;
00242 
00243     if (bucket.size() == 0)
00244         return false;
00245 
00246     // check if the function was called to perform on a B bucket
00247     if (isBBucket) {
00248         if (bucket.size() <=  (maxSize / 7))
00249             return true;
00250         else
00251             dist = getDist((maxSize / 7) - 1);
00252     } else
00253         dist = getDist(bucket.size()-1);
00254 
00255     if ((key ^ overlay->getThisNode().getKey()) <= dist)
00256         return true;
00257     else
00258         return false;
00259 
00260 }

int BrooseBucket::longestPrefix ( void   )  [virtual]

return the longest prefix of all entries

Returns:
the longest prefix

Definition at line 202 of file BrooseBucket.cc.

00203 {
00204     if (bucket.size() < 2)
00205         return 0;
00206 
00207     return bucket.begin()->second.getKey().sharedPrefixLength(
00208                                              (--bucket.end())->second.getKey());
00209 }

virtual int BrooseBucket::numInitStages (  )  const [inline, virtual]

Definition at line 46 of file BrooseBucket.h.

00047     {
00048         return MAX_STAGE_OVERLAY + 1;
00049     }

void BrooseBucket::output ( int  maxEntries = 0  ) 

displays the content of the bucket on standard out

Parameters:
maxEntries the maximal number of entries which will be printed

Definition at line 211 of file BrooseBucket.cc.

Referenced by Broose::displayBucketState().

00212 {
00213     BrooseHandle node;
00214     OverlayKey dist;
00215 
00216     EV << "[BrooseBucket::output() @ " << overlay->getThisNode().getAddress()
00217        << " (" << overlay->getThisNode().getKey().toString(16) << ")]\n"
00218        << "    BucketSize/MaxSize: " << bucket.size() << "/" << maxSize
00219        << endl;
00220 
00221     int max;
00222     max = bucket.size();
00223 
00224     if (maxEntries != 0 && maxEntries < max) {
00225         max = maxEntries;
00226     }
00227 
00228     int i;
00229 
00230     for (bucketIter = bucket.begin(), i = 0; i < max; bucketIter++, i++) {
00231         dist = bucketIter->first;
00232         node = bucketIter->second;
00233         EV << "    " << dist << " " << node.getKey() << " " << node.getAddress() << " RTT: "
00234            << node.rtt << " LS: " << node.lastSeen
00235            << endl;
00236     }
00237 }

void BrooseBucket::remove ( const NodeHandle node  )  [virtual]

removes a broose node handle from the bucket

Parameters:
node broose handle which will be removed

Definition at line 117 of file BrooseBucket.cc.

00118 {
00119     unsigned int i = 0;
00120     for (bucketIter = bucket.begin(); bucketIter != bucket.end(); i++) {
00121         if (bucketIter->second.getAddress() == node.getAddress()) {
00122             if (isBBucket && (i < (maxSize/7))) {
00123                 // call update() for removed sibling
00124                 overlay->callUpdate(node, false);
00125                 if (bucket.size() > (maxSize/7)) {
00126                     // new replacement sibling
00127                     overlay->callUpdate(get(maxSize/7), true);
00128                 }
00129             }
00130             bucket.erase(bucketIter++);
00131         } else {
00132             ++bucketIter;
00133         }
00134     }
00135 }

void BrooseBucket::resetFailedResponses ( const NodeHandle node  )  [virtual]

resets the counter of failed responses to a specific broose handle

Parameters:
node broose handle which counter will be reset

Definition at line 290 of file BrooseBucket.cc.

00291 {
00292     for (bucketIter = bucket.begin(); bucketIter!=bucket.end(); bucketIter++) {
00293         if (node.getAddress() == bucketIter->second.getAddress())
00294             bucketIter->second.failedResponses = 0;
00295     }
00296 }

void BrooseBucket::setLastSeen ( const NodeHandle node,
simtime_t  lastSeen 
) [virtual]

updates the timestamp of a specific node

Parameters:
node broose handle to which the timestamp will be updated
lastSeen timestamp of the last message

Definition at line 317 of file BrooseBucket.cc.

00318 {
00319     for (bucketIter = bucket.begin(); bucketIter!=bucket.end(); bucketIter++) {
00320         if (node.getAddress() == bucketIter->second.getAddress())
00321             bucketIter->second.lastSeen = time;
00322     }
00323 }

void BrooseBucket::setRTT ( const NodeHandle node,
simtime_t  rpcRTT 
) [virtual]

sets the round trip time to a specific broose handle

Parameters:
node broose handle to which the rtt will be stored
rpcRTT rtt to the specific node

Definition at line 299 of file BrooseBucket.cc.

00300 {
00301     for (bucketIter = bucket.begin(); bucketIter!=bucket.end(); bucketIter++) {
00302         if (node.getAddress() == bucketIter->second.getAddress()) {
00303             bucketIter->second.rtt = rpcRTT;
00304         }
00305     }
00306 }


Member Data Documentation

std::map<OverlayKey, BrooseHandle>::iterator BrooseBucket::bucketIter [protected]

iterator to navigate through the bucket

Definition at line 222 of file BrooseBucket.h.

Referenced by add(), fillVector(), getFailedResponses(), getLastSeen(), getRTT(), increaseFailedResponses(), output(), remove(), resetFailedResponses(), setLastSeen(), and setRTT().

bool BrooseBucket::isBBucket [protected]

true, if this bucket is the node's BBucket

Definition at line 227 of file BrooseBucket.h.

Referenced by add(), keyInRange(), and remove().

the node's key shifted to fit the bucket and used to measure distance to other keys

Definition at line 225 of file BrooseBucket.h.

Referenced by add(), and initializeBucket().

unsigned int BrooseBucket::maxSize [protected]

maximal size of the bucket

Definition at line 224 of file BrooseBucket.h.

Referenced by add(), getMaxSize(), initializeBucket(), keyInRange(), output(), and remove().

pointer to the main Broose module

Definition at line 226 of file BrooseBucket.h.

Referenced by add(), keyInRange(), output(), and remove().


The documentation for this class was generated from the following files:
Generated on Wed May 26 16:21:16 2010 for OverSim by  doxygen 1.6.3