From c77a2f335a4dc521ebde77eb2a326c503fe13746 Mon Sep 17 00:00:00 2001 From: Vinnie Falco Date: Mon, 27 Apr 2015 12:41:09 -0700 Subject: [PATCH] Tidy up some business logic: * Add OverlayImpl::for_each to tidy up some call sites * Add comment about computing the unique ID for message routing * Remove unused code --- src/ripple/app/consensus/LedgerConsensus.cpp | 22 ----- src/ripple/app/ledger/LedgerProposal.cpp | 9 ++ src/ripple/overlay/impl/OverlayImpl.h | 21 +++++ src/ripple/overlay/impl/PeerImp.cpp | 92 ++++++++++---------- 4 files changed, 78 insertions(+), 66 deletions(-) diff --git a/src/ripple/app/consensus/LedgerConsensus.cpp b/src/ripple/app/consensus/LedgerConsensus.cpp index 3a0ab84672..57d26205ca 100644 --- a/src/ripple/app/consensus/LedgerConsensus.cpp +++ b/src/ripple/app/consensus/LedgerConsensus.cpp @@ -1619,28 +1619,6 @@ private: << "We should do delayed relay of this proposal," << " but we cannot"; } - - #if 0 - // FIXME: We can't do delayed relay because we don't have the signature - std::set peers - - if (relay && getApp().getHashRouter ().swapSet (proposal.getSuppress (), set, SF_RELAYED)) - { - WriteLog (lsDEBUG, LedgerConsensus) << "Stored proposal delayed relay"; - protocol::TMProposeSet set; - set.set_proposeseq - set.set_currenttxhash (, 256 / 8); - previousledger - closetime - nodepubkey - signature - getApp ().overlay ().foreach (send_if_not ( - std::make_shared ( - set, protocol::mtPROPOSE_LEDGER), - peer_in_set(peers))); - } - - #endif } } } diff --git a/src/ripple/app/ledger/LedgerProposal.cpp b/src/ripple/app/ledger/LedgerProposal.cpp index 7dbb7f9442..d238939a41 100644 --- a/src/ripple/app/ledger/LedgerProposal.cpp +++ b/src/ripple/app/ledger/LedgerProposal.cpp @@ -70,6 +70,15 @@ uint256 LedgerProposal::getSigningHash () const return s.getSHA512Half (); } +/* +The "id" is a unique value computed on all fields that contribute to +the signature, and including the signature. There is one caveat, the +"last closed ledger" field may be omitted. However, the signer still +computes the signature as if this field was present. Recipients of +the proposal need to inject the last closed ledger in order to +validate the signature. If the last closed ledger is left out, then +it is considered as all zeroes for the purposes of signing. +*/ // Compute a unique identifier for this signed proposal uint256 LedgerProposal::computeSuppressionID ( uint256 const& proposeHash, diff --git a/src/ripple/overlay/impl/OverlayImpl.h b/src/ripple/overlay/impl/OverlayImpl.h index 8b2aed1424..46dd0ad379 100644 --- a/src/ripple/overlay/impl/OverlayImpl.h +++ b/src/ripple/overlay/impl/OverlayImpl.h @@ -174,6 +174,11 @@ public: Peer::ptr findPeerByShortID (Peer::id_t const& id) override; + //-------------------------------------------------------------------------- + // + // OverlayImpl + // + void add_active (std::shared_ptr const& peer); @@ -192,6 +197,22 @@ public: void onPeerDeactivate (Peer::id_t id, RippleAddress const& publicKey); + // UnaryFunc will be called as + // void(std::shared_ptr&&) + // + template + void + for_each (UnaryFunc&& f) + { + std::lock_guard lock (mutex_); + for (auto const& e : m_publicKeyMap) + { + auto sp = e.second.lock(); + if (sp) + f(std::move(sp)); + } + } + static bool isPeerUpgrade (beast::http::message const& request); diff --git a/src/ripple/overlay/impl/PeerImp.cpp b/src/ripple/overlay/impl/PeerImp.cpp index 5e414c7fd3..49639186e1 100644 --- a/src/ripple/overlay/impl/PeerImp.cpp +++ b/src/ripple/overlay/impl/PeerImp.cpp @@ -1706,6 +1706,42 @@ PeerImp::checkValidation (Job&, STValidation::pointer val, } } +// Returns the set of peers that can help us get +// the TX tree with the specified root hash. +// +static +std::vector> +getPeersWithTree (OverlayImpl& ov, + uint256 const& rootHash, PeerImp const* skip) +{ + std::vector> v; + ov.for_each([&](std::shared_ptr const& p) + { + if (p->hasTxSet(rootHash) && p.get() != skip) + v.push_back(p); + }); + return v; +} + +// Returns the set of peers that claim +// to have the specified ledger. +// +static +std::vector> +getPeersWithLedger (OverlayImpl& ov, + uint256 const& ledgerHash, LedgerIndex ledger, + PeerImp const* skip) +{ + std::vector> v; + ov.for_each([&](std::shared_ptr const& p) + { + if (p->hasLedger(ledgerHash, ledger) && + p.get() != skip) + v.push_back(p); + }); + return v; +} + // VFALCO NOTE This function is way too big and cumbersome. void PeerImp::getLedger (std::shared_ptr const& m) @@ -1745,44 +1781,19 @@ PeerImp::getLedger (std::shared_ptr const& m) p_journal_.debug << "GetLedger: Routing Tx set request"; - struct get_usable_peers - { - typedef Overlay::PeerSequence return_type; - - Overlay::PeerSequence usablePeers; - uint256 const& txHash; - Peer const* skip; - - get_usable_peers(uint256 const& hash, Peer const* s) - : txHash(hash), skip(s) - { } - - void operator() (Peer::ptr const& peer) - { - if (peer->hasTxSet (txHash) && (peer.get () != skip)) - usablePeers.push_back (peer); - } - - return_type operator() () - { - return usablePeers; - } - }; - - Overlay::PeerSequence usablePeers (overlay_.foreach ( - get_usable_peers (txHash, this))); - - if (usablePeers.empty ()) + auto const v = getPeersWithTree( + overlay_, txHash, this); + if (v.empty()) { p_journal_.info << "GetLedger: Route TX set failed"; return; } - Peer::ptr const& selectedPeer = usablePeers [ - rand () % usablePeers.size ()]; + auto const& p = + v[rand () % v.size ()]; packet.set_requestcookie (id ()); - selectedPeer->send (std::make_shared ( + p->send (std::make_shared ( packet, protocol::mtGET_LEDGER)); return; } @@ -1842,26 +1853,19 @@ PeerImp::getLedger (std::shared_ptr const& m) if (packet.has_ledgerseq ()) seq = packet.ledgerseq (); - Overlay::PeerSequence peerList = overlay_.getActivePeers (); - Overlay::PeerSequence usablePeers; - for (auto const& peer : peerList) - { - if (peer->hasLedger (ledgerhash, seq) && (peer.get () != this)) - usablePeers.push_back (peer); - } - - if (usablePeers.empty ()) + auto const v = getPeersWithLedger( + overlay_, ledgerhash, seq, this); + if (v.empty ()) { p_journal_.trace << "GetLedger: Cannot route"; return; } - Peer::ptr const& selectedPeer = usablePeers [ - rand () % usablePeers.size ()]; + auto const& p = v[rand () % v.size ()]; packet.set_requestcookie (id ()); - selectedPeer->send ( - std::make_shared (packet, protocol::mtGET_LEDGER)); + p->send (std::make_shared( + packet, protocol::mtGET_LEDGER)); p_journal_.debug << "GetLedger: Request routed"; return;