PastryStateObject Module. More...
#include <PastryStateObject.h>
Public Member Functions | |
void | handleMessage (cMessage *msg) |
int | numInitStages (void) const |
void | initialize (int stage) |
virtual const NodeHandle & | getDestinationNode (const OverlayKey &destination) |
gets the final node according to the Pastry routing scheme. | |
virtual const NodeHandle & | findCloserNode (const OverlayKey &destination, bool optimize=false)=0 |
try to find a node numerically closer to a given key with the same shared prefix as the current node in the state table. | |
virtual void | findCloserNodes (const OverlayKey &destination, NodeVector *nodes)=0 |
virtual const TransportAddress & | failedNode (const TransportAddress &failed)=0 |
do something about a failed node | |
virtual const TransportAddress & | repair (const PastryStateMessage *msg, const PastryStateMsgProximity &prox) |
attempt to repair state using a received REPAIR message | |
virtual void | dumpToStateMessage (PastryStateMessage *msg) const =0 |
dump content of the set to a PastryStateMessage | |
bool | mergeState (const PastryStateMessage *msg, const PastryStateMsgProximity *prox) |
update own state based on a received PastryStateMessage | |
virtual void | dumpToVector (std::vector< TransportAddress > &affected) const =0 |
append all entries to a given vector of TransportAddresses, needed to find all Nodes to be notified after joining. | |
bool | isCloser (const NodeHandle &test, const OverlayKey &destination, const NodeHandle &reference=NodeHandle::UNSPECIFIED_NODE) const |
test a given NodeHandle if it is closer to a given destination | |
bool | specialCloserCondition (const NodeHandle &test, const OverlayKey &destination, const NodeHandle &reference=NodeHandle::UNSPECIFIED_NODE) const |
test a given NodeHandle if it is closer to a given destination, but only if the shared prefix length with the destination is at least equal to the shared prefix length with our own node | |
Static Protected Member Functions | |
static const PastryExtendedNode & | unspecNode () |
Protected Attributes | |
NodeHandle | owner |
stores the NodeHandle of the owner of this PastryStateObject. | |
uint32_t | bitsPerDigit |
Private Member Functions | |
virtual void | earlyInit (void)=0 |
initialize watches etc. | |
virtual bool | mergeNode (const NodeHandle &node, simtime_t prox)=0 |
try to merge a single node in the state table | |
const OverlayKey * | keyDist (const OverlayKey &a, const OverlayKey &b) const |
compute the distance of two keys on the ring | |
Static Private Attributes | |
static const PastryExtendedNode * | _unspecNode = NULL |
unspecified Node with proximity |
PastryStateObject Module.
This module class describes the common interface of all Pastry State Objects and implements what all have in common
Definition at line 47 of file PastryStateObject.h.
virtual void PastryStateObject::dumpToStateMessage | ( | PastryStateMessage * | msg | ) | const [pure virtual] |
dump content of the set to a PastryStateMessage
msg | the PastryStateMessage to be filled with entries |
Implemented in PastryLeafSet, PastryNeighborhoodSet, and PastryRoutingTable.
virtual void PastryStateObject::dumpToVector | ( | std::vector< TransportAddress > & | affected | ) | const [pure virtual] |
append all entries to a given vector of TransportAddresses, needed to find all Nodes to be notified after joining.
affected | the vector to fill with entries |
Implemented in PastryLeafSet, PastryNeighborhoodSet, and PastryRoutingTable.
virtual void PastryStateObject::earlyInit | ( | void | ) | [private, pure virtual] |
initialize watches etc.
Implemented in PastryLeafSet, PastryNeighborhoodSet, and PastryRoutingTable.
Referenced by initialize().
virtual const TransportAddress& PastryStateObject::failedNode | ( | const TransportAddress & | failed | ) | [pure virtual] |
do something about a failed node
failed | the failed node |
Implemented in PastryLeafSet, PastryNeighborhoodSet, and PastryRoutingTable.
virtual const NodeHandle& PastryStateObject::findCloserNode | ( | const OverlayKey & | destination, | |
bool | optimize = false | |||
) | [pure virtual] |
try to find a node numerically closer to a given key with the same shared prefix as the current node in the state table.
this method is to be called, when a regular next hop couldn't be found or wasn't reachable.
destination | the destination key | |
optimize | if set, check all nodes and return the best/closest one |
Implemented in PastryLeafSet, PastryNeighborhoodSet, and PastryRoutingTable.
virtual void PastryStateObject::findCloserNodes | ( | const OverlayKey & | destination, | |
NodeVector * | nodes | |||
) | [pure virtual] |
Implemented in PastryLeafSet, PastryNeighborhoodSet, and PastryRoutingTable.
const NodeHandle & PastryStateObject::getDestinationNode | ( | const OverlayKey & | destination | ) | [virtual] |
gets the final node according to the Pastry routing scheme.
destination | the destination key |
Reimplemented in PastryLeafSet.
Definition at line 48 of file PastryStateObject.cc.
{ return NodeHandle::UNSPECIFIED_NODE; }
void PastryStateObject::handleMessage | ( | cMessage * | msg | ) |
Definition at line 43 of file PastryStateObject.cc.
{ throw "a PastryStateObject should never receive a message."; }
void PastryStateObject::initialize | ( | int | stage | ) |
Definition at line 36 of file PastryStateObject.cc.
{ if (stage != MIN_STAGE_OVERLAY) return; earlyInit(); }
bool PastryStateObject::isCloser | ( | const NodeHandle & | test, | |
const OverlayKey & | destination, | |||
const NodeHandle & | reference = NodeHandle::UNSPECIFIED_NODE | |||
) | const |
test a given NodeHandle if it is closer to a given destination
test | the NodeHandle to test | |
destination | the destination Key | |
reference | NodeHandle to compare to, own node if unset |
Definition at line 134 of file PastryStateObject.cc.
Referenced by BasePastry::findNode(), PastryLeafSet::getDestinationNode(), PastryLeafSet::isClosestNode(), and specialCloserCondition().
{ // assert: (! test.isUnspecified()) && (! owner.isUnspecified()) const NodeHandle* ref = &reference; if (ref->isUnspecified()) ref = &owner; if ((ref->getKey() == destination) || (test == *ref)) { return false; } bool closer = false; const OverlayKey* refDist = keyDist(ref->getKey(), destination); const OverlayKey* testDist = keyDist(test.getKey(), destination); if (*testDist < *refDist) closer = true; delete refDist; delete testDist; return closer; }
const OverlayKey * PastryStateObject::keyDist | ( | const OverlayKey & | a, | |
const OverlayKey & | b | |||
) | const [private] |
compute the distance of two keys on the ring
a | one key | |
b | another key |
Definition at line 107 of file PastryStateObject.cc.
Referenced by isCloser().
{ const OverlayKey* smaller; const OverlayKey* bigger; if (a > b) { smaller = &b; bigger = &a; } else { smaller = &a; bigger = &b; } OverlayKey diff1(*bigger - *smaller); OverlayKey diff2(*smaller + (OverlayKey::getMax() - *bigger) + 1); const OverlayKey* dist; if (diff1 > diff2) { dist = new OverlayKey(diff2); } else { dist = new OverlayKey(diff1); } return dist; }
virtual bool PastryStateObject::mergeNode | ( | const NodeHandle & | node, | |
simtime_t | prox | |||
) | [private, pure virtual] |
try to merge a single node in the state table
node | handle of the node | |
prox | proximity value of the node |
Implemented in PastryLeafSet, PastryNeighborhoodSet, and PastryRoutingTable.
Referenced by mergeState().
bool PastryStateObject::mergeState | ( | const PastryStateMessage * | msg, | |
const PastryStateMsgProximity * | prox | |||
) |
update own state based on a received PastryStateMessage
msg | the PastryStateMessage to use as source for update | |
prox | record of proximity values matching the state message |
Definition at line 61 of file PastryStateObject.cc.
Referenced by Pastry::checkProxCache(), Bamboo::checkProxCache(), Pastry::handleStateMessage(), Bamboo::handleStateMessage(), PastryRoutingTable::initStateFromHandleVector(), Pastry::mergeState(), PastryRoutingTable::repair(), and PastryLeafSet::repair().
{ bool ret = false; int lsSize = msg->getLeafSetArraySize(); int rtSize = msg->getRoutingTableArraySize(); int nsSize = msg->getNeighborhoodSetArraySize(); const NodeHandle* node; simtime_t rtt; // walk through msg's LeafSet for (int i = 0; i < lsSize; i++) { node = &(msg->getLeafSet(i)); rtt = prox ? (*(prox->pr_ls.begin() + i)) : SimTime::getMaxTime(); // unspecified nodes, own node and dead nodes not considered if (!(rtt < 0 || node->isUnspecified() || *node == owner)) { if (mergeNode(*node, rtt)) ret = true; } } // walk through msg's IRoutingTable for (int i = 0; i < rtSize; i++) { node = &(msg->getRoutingTable(i)); rtt = prox ? (*(prox->pr_rt.begin() + i)) : SimTime::getMaxTime(); // unspecified nodes, own node and dead nodes not considered if (!(rtt < 0 || node->isUnspecified() || *node == owner)) { if (mergeNode(*node, rtt)) ret = true; } } // walk through msg's NeighborhoodSet for (int i = 0; i < nsSize; i++) { node = &(msg->getNeighborhoodSet(i)); rtt = prox ? (*(prox->pr_ns.begin() + i)) : SimTime::getMaxTime(); // unspecified nodes, own node and dead nodes not considered if (!(rtt < 0 || node->isUnspecified() || *node == owner)) { if (mergeNode(*node, rtt)) ret = true; } } return ret; }
int PastryStateObject::numInitStages | ( | void | ) | const |
Definition at line 31 of file PastryStateObject.cc.
{
return MAX_STAGE_OVERLAY;
}
const TransportAddress & PastryStateObject::repair | ( | const PastryStateMessage * | msg, | |
const PastryStateMsgProximity & | prox | |||
) | [virtual] |
attempt to repair state using a received REPAIR message
msg | the state message of type REPAIR | |
prox | record of proximity values matching the state message |
Definition at line 54 of file PastryStateObject.cc.
{ return TransportAddress::UNSPECIFIED_NODE; }
bool PastryStateObject::specialCloserCondition | ( | const NodeHandle & | test, | |
const OverlayKey & | destination, | |||
const NodeHandle & | reference = NodeHandle::UNSPECIFIED_NODE | |||
) | const |
test a given NodeHandle if it is closer to a given destination, but only if the shared prefix length with the destination is at least equal to the shared prefix length with our own node
This is needed for the "rare case" in the Pastry routing algorithm.
test | the NodeHandle to test | |
destination | the destination Key | |
reference | NodeHandle to compare to, own node if unset |
Definition at line 157 of file PastryStateObject.cc.
Referenced by PastryRoutingTable::findCloserNode(), PastryNeighborhoodSet::findCloserNode(), and PastryLeafSet::findCloserNode().
{ // std::cout << ((test.getKey().sharedPrefixLength(destination, bitsPerDigit) // < owner.getKey().sharedPrefixLength(destination, bitsPerDigit)) // != (test.getKey().sharedPrefixLength(destination) // < owner.getKey().sharedPrefixLength(destination)) ? "X\n" : ""); if (test.getKey().sharedPrefixLength(destination, bitsPerDigit) < owner.getKey().sharedPrefixLength(destination, bitsPerDigit)) { return false; } return isCloser(test, destination, reference); }
static const PastryExtendedNode& PastryStateObject::unspecNode | ( | ) | [inline, static, protected] |
Definition at line 174 of file PastryStateObject.h.
Referenced by PastryRoutingTable::addRow(), PastryNeighborhoodSet::failedNode(), PastryNeighborhoodSet::initializeSet(), and PastryRoutingTable::nodeAt().
{ if (_unspecNode == NULL) _unspecNode = new PastryExtendedNode(); return *_unspecNode; }
const PastryExtendedNode * PastryStateObject::_unspecNode = NULL [static, private] |
unspecified Node with proximity
Definition at line 171 of file PastryStateObject.h.
Referenced by unspecNode().
uint32_t PastryStateObject::bitsPerDigit [protected] |
Definition at line 165 of file PastryStateObject.h.
Referenced by PastryRoutingTable::digitAt(), PastryRoutingTable::findCloserNode(), PastryRoutingTable::lookupNextHop(), PastryRoutingTable::mergeNode(), and specialCloserCondition().
NodeHandle PastryStateObject::owner [protected] |
stores the NodeHandle of the owner of this PastryStateObject.
Derived classes have to initialize it.
Definition at line 163 of file PastryStateObject.h.
Referenced by PastryRoutingTable::addRow(), PastryLeafSet::createSiblingVector(), PastryRoutingTable::findCloserNode(), PastryRoutingTable::findNextNodeToAsk(), PastryLeafSet::getDestinationNode(), isCloser(), PastryLeafSet::isClosestNode(), PastryRoutingTable::lookupNextHop(), PastryRoutingTable::mergeNode(), PastryLeafSet::mergeNode(), mergeState(), and specialCloserCondition().