From 2897bd00c2d801c3326f6fedcef3492db75ae5a3 Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Mon, 24 Dec 2012 19:08:57 -0800 Subject: [PATCH] Make 'getNodeFat' throw an exception if a node that's not in the map is requested. Log the context when this exception is thrown. --- src/cpp/ripple/Peer.cpp | 48 +++++++++++++++++++++++++---------- src/cpp/ripple/SHAMapSync.cpp | 4 +-- 2 files changed, 36 insertions(+), 16 deletions(-) diff --git a/src/cpp/ripple/Peer.cpp b/src/cpp/ripple/Peer.cpp index 571246206..534007543 100644 --- a/src/cpp/ripple/Peer.cpp +++ b/src/cpp/ripple/Peer.cpp @@ -1428,24 +1428,44 @@ void Peer::recvGetLedger(ripple::TMGetLedger& packet) } std::vector nodeIDs; std::list< std::vector > rawNodes; - if(map->getNodeFat(mn, nodeIDs, rawNodes, fatRoot, fatLeaves)) + try { - assert(nodeIDs.size() == rawNodes.size()); - cLog(lsDEBUG) << "getNodeFat got " << rawNodes.size() << " nodes"; - std::vector::iterator nodeIDIterator; - std::list< std::vector >::iterator rawNodeIterator; - for(nodeIDIterator = nodeIDs.begin(), rawNodeIterator = rawNodes.begin(); - nodeIDIterator != nodeIDs.end(); ++nodeIDIterator, ++rawNodeIterator) + if(map->getNodeFat(mn, nodeIDs, rawNodes, fatRoot, fatLeaves)) { - Serializer nID(33); - nodeIDIterator->addIDRaw(nID); - ripple::TMLedgerNode* node = reply.add_nodes(); - node->set_nodeid(nID.getDataPtr(), nID.getLength()); - node->set_nodedata(&rawNodeIterator->front(), rawNodeIterator->size()); + assert(nodeIDs.size() == rawNodes.size()); + cLog(lsDEBUG) << "getNodeFat got " << rawNodes.size() << " nodes"; + std::vector::iterator nodeIDIterator; + std::list< std::vector >::iterator rawNodeIterator; + for(nodeIDIterator = nodeIDs.begin(), rawNodeIterator = rawNodes.begin(); + nodeIDIterator != nodeIDs.end(); ++nodeIDIterator, ++rawNodeIterator) + { + Serializer nID(33); + nodeIDIterator->addIDRaw(nID); + ripple::TMLedgerNode* node = reply.add_nodes(); + node->set_nodeid(nID.getDataPtr(), nID.getLength()); + node->set_nodedata(&rawNodeIterator->front(), rawNodeIterator->size()); + } } + else + cLog(lsWARNING) << "getNodeFat returns false"; + } + catch (std::exception& e) + { + std::string info; + if (packet.itype() == ripple::liTS_CANDIDATE) + info = "TS candidate"; + else if (packet.itype() == ripple::liBASE) + info = "Ledger base"; + else if (packet.itype() == ripple::liTX_NODE) + info = "TX node"; + else if (packet.itype() == ripple::liAS_NODE) + info = "AS node"; + + if (!packet.has_ledgerhash()) + info += ", no hash specified"; + + cLog(lsWARNING) << "getNodeFat( " << mn <<") throws exception: " << info; } - else - cLog(lsWARNING) << "getNodeFat returns false"; } PackedMessage::pointer oPacket = boost::make_shared(reply, ripple::mtLEDGER_DATA); sendPacket(oPacket); diff --git a/src/cpp/ripple/SHAMapSync.cpp b/src/cpp/ripple/SHAMapSync.cpp index 0fd66761b..344e2bdc1 100644 --- a/src/cpp/ripple/SHAMapSync.cpp +++ b/src/cpp/ripple/SHAMapSync.cpp @@ -99,8 +99,8 @@ bool SHAMap::getNodeFat(const SHAMapNode& wanted, std::vector& nodeI SHAMapTreeNode::pointer node = getNode(wanted); if (!node) { - cLog(lsWARNING) << "peer requested node we don't have: " << wanted; - return false; + cLog(lsWARNING) << "peer requested node that not in the map: " << wanted; + throw std::runtime_error("Peer requested node not in map"); } nodeIDs.push_back(*node);