From 18b18359c591b9efc90724995e20b9119785c46b Mon Sep 17 00:00:00 2001 From: JoelKatz Date: Sat, 8 Sep 2012 04:14:06 -0700 Subject: [PATCH] Be smarter about tracking which peers have which ledgers. --- src/Peer.cpp | 20 +++++++++++++++++++- src/Peer.h | 5 ++++- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/Peer.cpp b/src/Peer.cpp index 27db8ff017..aec3ce31e2 100644 --- a/src/Peer.cpp +++ b/src/Peer.cpp @@ -649,7 +649,10 @@ void Peer::recvHello(newcoin::TMHello& packet) { memcpy(mClosedLedgerHash.begin(), packet.ledgerclosed().data(), 256 / 8); if ((packet.has_ledgerprevious()) && (packet.ledgerprevious().size() == (256 / 8))) + { memcpy(mPreviousLedgerHash.begin(), packet.ledgerprevious().data(), 256 / 8); + addLedger(mPreviousLedgerHash); + } else mPreviousLedgerHash.zero(); } @@ -915,6 +918,7 @@ void Peer::recvStatus(newcoin::TMStatusChange& packet) if (packet.has_ledgerhash() && (packet.ledgerhash().size() == (256 / 8))) { // a peer has changed ledgers memcpy(mClosedLedgerHash.begin(), packet.ledgerhash().data(), 256 / 8); + addLedger(mClosedLedgerHash); Log(lsTRACE) << "peer LCL is " << mClosedLedgerHash << " " << getIP(); } else @@ -926,6 +930,7 @@ void Peer::recvStatus(newcoin::TMStatusChange& packet) if (packet.has_ledgerhashprevious() && packet.ledgerhashprevious().size() == (256 / 8)) { memcpy(mPreviousLedgerHash.begin(), packet.ledgerhashprevious().data(), 256 / 8); + addLedger(mPreviousLedgerHash); } else mPreviousLedgerHash.zero(); } @@ -1134,7 +1139,20 @@ void Peer::recvLedger(newcoin::TMLedgerData& packet) bool Peer::hasLedger(const uint256& hash) const { - return (hash == mClosedLedgerHash) || (hash == mPreviousLedgerHash); + BOOST_FOREACH(const uint256& ledger, mRecentLedgers) + if (ledger == hash) + return true; + return false; +} + +void Peer::addLedger(const uint256& hash) +{ + BOOST_FOREACH(const uint256& ledger, mRecentLedgers) + if (ledger == hash) + return; + if (mRecentLedgers.size() == 16) + mRecentLedgers.pop_front(); + mRecentLedgers.push_back(hash); } // Get session information we can sign to prevent man in the middle attack. diff --git a/src/Peer.h b/src/Peer.h index 13c5fdb2de..ae4abf7307 100644 --- a/src/Peer.h +++ b/src/Peer.h @@ -44,7 +44,8 @@ private: ipPort mIpPortConnect; uint256 mCookieHash; - uint256 mClosedLedgerHash, mPreviousLedgerHash; + uint256 mClosedLedgerHash, mPreviousLedgerHash; + std::list mRecentLedgers; boost::asio::ssl::stream mSocketSsl; @@ -116,6 +117,8 @@ protected: void getSessionCookie(std::string& strDst); + void addLedger(const uint256& ledger); + public: //bool operator == (const Peer& other);