Changeset 10572 for source


Ignore:
Timestamp:
Jun 18, 2012, 1:40:59 PM (12 years ago)
Author:
Michael Tänzer
Message:

Fix DHT: messages got lost if not communicating over a direct link.

Also:

  • Fix mem leak
  • Code clean up
Location:
source/ariba/overlay
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • source/ariba/overlay/BaseOverlay.cpp

    r9971 r10572  
    18321832
    18331833        // handle dht messages (do not route)
    1834         if (overlayMsg->isDHTMessage())
    1835                 return handleDHTMessage(overlayMsg);
     1834        if (overlayMsg->isDHTMessage()) {
     1835                bool ret = handleDHTMessage(overlayMsg);
     1836                delete overlayMsg;
     1837                return ret;
     1838        }
    18361839
    18371840        // handle signaling messages (do not route!)
     
    21612164
    21622165        // route message to closest node
    2163         if (!overlayInterface->isClosestNodeTo(msg->getDestinationNode())) {
     2166        if (!overlayInterface->isClosestNodeTo(dhtMsg->getHashedKey())) {
    21642167                logging_debug("Routing DHT message to closest node "
    21652168                        << " from " << msg->getSourceNode()
    2166                         << " to " << msg->getDestinationNode()
     2169                        << " to " << dhtMsg->getHashedKey()
    21672170                );
    2168                 route( msg );
    2169                 delete msg;
     2171                dhtSend(msg, dhtMsg->getHashedKey());
     2172                delete dhtMsg;
    21702173                return true;
    21712174        }
     
    22192222                return false;
    22202223        }
    2221         delete msg;
     2224        delete dhtMsg;
    22222225        return true;
    22232226}
     
    22392242        }
    22402243
    2241         // calculate hash
    2242         NodeID dest = NodeID::sha1(key.getBuffer(), key.getLength() / 8);
    22432244        DHTMessage dhtmsg( key, value );
    22442245        dhtmsg.setReplace( replace );
     
    22472248        OverlayMsg msg( OverlayMsg::typeDHTPut );
    22482249        msg.encapsulate( &dhtmsg );
    2249         dhtSend(&msg, dest);
     2250        dhtSend(&msg, dhtmsg.getHashedKey());
    22502251}
    22512252
     
    22552256        localDHT->remove(key,value);
    22562257
    2257         // calculate hash
    2258         NodeID dest = NodeID::sha1(key.getBuffer(), key.getLength() / 8);
    22592258        DHTMessage dhtmsg(key,value);
    22602259
     
    22622261        OverlayMsg msg(OverlayMsg::typeDHTRemove);
    22632262        msg.encapsulate( &dhtmsg );
    2264         dhtSend(&msg, dest);
     2263        dhtSend(&msg, dhtmsg.getHashedKey());
    22652264}
    22662265
     
    22702269        logging_info("DHT-Remove: Removing key=" << key );
    22712270
    2272         // calculate hash
    2273         NodeID dest = NodeID::sha1(key.getBuffer(), key.getLength() / 8);
    22742271        DHTMessage dhtmsg(key);
    22752272
     
    22772274        OverlayMsg msg(OverlayMsg::typeDHTRemove);
    22782275        msg.encapsulate( &dhtmsg );
    2279         dhtSend(&msg, dest);
     2276        dhtSend(&msg, dhtmsg.getHashedKey());
    22802277}
    22812278
     
    22862283                        key << " for service=" << service.toString() );
    22872284
    2288         // calculate hash
    2289         NodeID dest = NodeID::sha1(key.getBuffer(), key.getLength() / 8);
    22902285        DHTMessage dhtmsg(key);
    22912286
     
    22942289        msg.setService(service);
    22952290        msg.encapsulate( &dhtmsg );
    2296         dhtSend(&msg, dest);
     2291        dhtSend(&msg, dhtmsg.getHashedKey());
    22972292}
    22982293
     
    23032298        /// set source and destination
    23042299        msg->setSourceNode(this->nodeId);
    2305         msg->setDestinationNode(dest);
    23062300
    23072301        // local storage? yes-> put into DHT directly
    2308         if (overlayInterface->isClosestNodeTo(msg->getDestinationNode())) {
     2302        if (overlayInterface->isClosestNodeTo(dest)) {
     2303                // be compatible with old code so set destination to hashed key
     2304                msg->setDestinationNode(dest);
     2305               
    23092306                Data d = data_serialize(msg);
    2310                 Message* m2 = new Message(d);
    2311                 OverlayMsg* m3 = m2->decapsulate<OverlayMsg>();
     2307                Message m2(d);
     2308                OverlayMsg* m3 = m2.decapsulate<OverlayMsg>();
     2309               
    23122310                handleDHTMessage(m3);
    2313                 delete m2;
     2311               
     2312                delete m3;
    23142313                return;
    2315         }
    2316 
    2317         // send message "normally"
    2318         send( msg, dest );
     2314        } else {
     2315                // need to route
     2316                NodeID next_hop = overlayInterface->getNextNodeId(dest);
     2317                msg->setDestinationNode(next_hop);
     2318               
     2319                send(msg, next_hop);
     2320               
     2321                return;
     2322        }
    23192323}
    23202324
  • source/ariba/overlay/messages/DHTMessage.cpp

    r6919 r10572  
    88vsznDefault(DHTMessage);
    99
    10 DHTMessage::DHTMessage() {
    11         this->key.setLength(0);
    12         this->ttl = 0;
    13         this->replace = false;
    14 }
     10DHTMessage::DHTMessage() :
     11        ttl( 0 ),
     12        replace( false )
     13{}
    1514
    16 DHTMessage::DHTMessage( const Data& key ) {
    17         // calculate hash of key
    18         this->hash = NodeID::sha1( key.getBuffer(), key.getLength() / 8 );
    19         this->key = key.clone();
    20         this->ttl = 0;
    21         this->replace = false;
    22 }
     15DHTMessage::DHTMessage( const Data& key ) :
     16        ttl( 0 ),
     17        replace( false ),
     18        key( key.clone() )
     19{}
    2320
    24 DHTMessage::DHTMessage( const Data& key, const Data& value ) {
    25         // calculate hash of key
    26         this->hash = NodeID::sha1( key.getBuffer(), key.getLength() / 8 );
    27         this->key = key.clone();
    28         this->values.push_back( value.clone() );
    29         this->ttl = 0;
    30         this->replace = false;
    31 }
     21DHTMessage::DHTMessage( const Data& key, const Data& value ) :
     22        ttl( 0 ),
     23        replace( false ),
     24        key( key.clone() ),
     25        values(1, value.clone())
     26{}
    3227
    33 DHTMessage::DHTMessage( const Data& key, const vector<Data>& values ) {
    34         this->hash = NodeID::sha1( key.getBuffer(), key.getLength() / 8 );
    35         this->key = key.clone();
     28DHTMessage::DHTMessage( const Data& key, const vector<Data>& values ) :
     29        ttl( 0 ),
     30        replace( false ),
     31        key( key.clone() )
     32{
     33        // preallocate enough room so we don't need to copy a lot
     34        this->values.reserve(values.size());
    3635        BOOST_FOREACH(const Data value, values )
    3736                this->values.push_back( value.clone() );
    38         this->ttl = 0;
    39         this->replace = false;
    4037}
    4138
  • source/ariba/overlay/messages/DHTMessage.h

    r6919 r10572  
    2020
    2121        const NodeID& getHashedKey() const {
    22                 return hash;
     22                return NodeID::sha1( key.getBuffer(), key.getLength() / 8 );
    2323        }
    2424
     
    5858
    5959private:
    60         NodeID hash;
    6160        uint16_t ttl;
    6261        bool replace;
  • source/ariba/overlay/modules/OverlayInterface.h

    r8606 r10572  
    145145         */
    146146        virtual const LinkID& getNextLinkId( const NodeID& id ) const = 0;
     147       
     148        /**
     149         * Returns the NodeID of the next hop a route message would take.
     150         *
     151         * @param id The destination node id
     152         * @return The node id of the next hop
     153         */
     154        virtual const NodeID& getNextNodeId( const NodeID& id ) const;
    147155
    148156        //--- functions from CommunicationListener that we _can_ use as overlay ---
  • source/ariba/overlay/modules/chord/Chord.cpp

    r7744 r10572  
    201201}
    202202
     203/// @see OverlayInterface.h
     204const NodeID& Chord::getNextNodeId( const NodeID& id ) const {
     205        // get next hop
     206        const route_item* item = table->get_next_hop(id);
     207       
     208        // return unspecified if no next hop could be found
     209        if (item == NULL) {
     210                return NodeID::UNSPECIFIED;
     211        }
     212       
     213        return item->id;
     214}
     215
    203216OverlayInterface::NodeList Chord::getKnownNodes(bool deep) const {
    204217        OverlayInterface::NodeList nodelist;
  • source/ariba/overlay/modules/chord/Chord.h

    r6854 r10572  
    104104        /// @see OverlayInterface.h
    105105        virtual const LinkID& getNextLinkId( const NodeID& id ) const;
     106       
     107        /// @see OverlayInterface.h
     108        virtual const NodeID& getNextNodeId( const NodeID& id ) const;
    106109
    107110        /// @see OverlayInterface.h
  • source/ariba/overlay/modules/onehop/OneHop.cpp

    r8620 r10572  
    122122}
    123123
     124/// @see OverlayInterface.h
     125const NodeID& OneHop::getNextNodeId( const NodeID& id ) const {
     126        OverlayNodeMapping::const_iterator i = overlayNodes.find( id );
     127       
     128        // FIXME: in case the NodeID is not known we should return the nearest node
     129        if (i == overlayNodes.end()) {
     130                return NodeID::UNSPECIFIED;
     131        }
     132       
     133        return i->first;
     134}
     135
    124136void OneHop::createOverlay() {
    125137        // don't need to bootstrap against ourselfs.
  • source/ariba/overlay/modules/onehop/OneHop.h

    r6266 r10572  
    8585        /// @see OverlayInterface.h
    8686        virtual const LinkID& getNextLinkId( const NodeID& id ) const;
     87       
     88        /// @see OverlayInterface.h
     89        virtual const NodeID& getNextNodeId( const NodeID& id ) const;
    8790
    8891        /// @see OverlayInterface.h
Note: See TracChangeset for help on using the changeset viewer.