Ignore:
Timestamp:
Jun 18, 2012, 1:40:59 PM (13 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
File:
1 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
Note: See TracChangeset for help on using the changeset viewer.