diff --git a/src/ripple/app/ledger/LedgerMaster.cpp b/src/ripple/app/ledger/LedgerMaster.cpp index 04824d7fdb..2ef2a5c191 100644 --- a/src/ripple/app/ledger/LedgerMaster.cpp +++ b/src/ripple/app/ledger/LedgerMaster.cpp @@ -20,6 +20,7 @@ #include #include #include +#include #include #include // @@ -772,15 +773,25 @@ public: getApp().getOrderBookDB().setup(ledger); } - std::uint64_t fee, fee2, ref; - ref = getApp().getFeeTrack().getLoadBase(); - int count = getApp().getValidations().getFeeAverage(ledger->getHash(), ref, fee); - int count2 = getApp().getValidations().getFeeAverage(ledger->getParentHash(), ref, fee2); - - if ((count + count2) == 0) - getApp().getFeeTrack().setRemoteFee(ref); + std::uint64_t const base = getApp().getFeeTrack().getLoadBase(); + auto fees = getApp().getValidations().fees (ledger->getHash(), base); + { + auto fees2 = getApp().getValidations().fees (ledger->getParentHash(), base); + fees.reserve (fees.size() + fees2.size()); + std::copy (fees2.begin(), fees2.end(), std::back_inserter(fees)); + } + std::uint64_t fee; + if (! fees.empty()) + { + std::sort (fees.begin(), fees.end()); + fee = fees[fees.size() / 2]; // median + } else - getApp().getFeeTrack().setRemoteFee(((fee * count) + (fee2 * count2)) / (count + count2)); + { + fee = base; + } + + getApp().getFeeTrack().setRemoteFee(fee); tryAdvance (); } diff --git a/src/ripple/app/misc/Validations.cpp b/src/ripple/app/misc/Validations.cpp index 03b2796857..5acbe6f221 100644 --- a/src/ripple/app/misc/Validations.cpp +++ b/src/ripple/app/misc/Validations.cpp @@ -19,6 +19,7 @@ #include #include // +#include #include namespace ripple { @@ -26,10 +27,10 @@ namespace ripple { class ValidationsImp : public Validations { private: - typedef RippleMutex LockType; + using LockType = std::mutex; typedef std::lock_guard ScopedLockType; typedef beast::GenericScopedUnlock ScopedUnlockType; - LockType mLock; + std::mutex mutable mLock; TaggedCache mValidations; ValidationSet mCurrentValidations; @@ -233,34 +234,27 @@ private: return trusted; } - int getFeeAverage (uint256 const& ledger, std::uint64_t ref, std::uint64_t& fee) + std::vector + fees (uint256 const& ledger, std::uint64_t base) override { - int trusted = 0; - fee = 0; - - ScopedLockType sl (mLock); - auto set = findSet (ledger); - + std::vector result; + std::lock_guard lock (mLock); + auto const set = findSet (ledger); if (set) { - for (auto& it: *set) + for (auto const& v : *set) { - if (it.second->isTrusted ()) + if (v.second->isTrusted()) { - ++trusted; - if (it.second->isFieldPresent(sfLoadFee)) - fee += it.second->getFieldU32(sfLoadFee); + if (v.second->isFieldPresent(sfLoadFee)) + result.push_back(v.second->getFieldU32(sfLoadFee)); else - fee += ref; - } + result.push_back(base); + } } } - if (trusted == 0) - fee = ref; - else - fee /= trusted; - return trusted; + return result; } int getNodesAfter (uint256 const& ledger) diff --git a/src/ripple/app/misc/Validations.h b/src/ripple/app/misc/Validations.h index ae8064130e..2eff884760 100644 --- a/src/ripple/app/misc/Validations.h +++ b/src/ripple/app/misc/Validations.h @@ -51,8 +51,10 @@ public: virtual int getTrustedValidationCount (uint256 const& ledger) = 0; - virtual int getFeeAverage( - uint256 const& ledger, std::uint64_t ref, std::uint64_t& fee) = 0; + /** Returns fees reported by trusted validators in the given ledger. */ + virtual + std::vector + fees (uint256 const& ledger, std::uint64_t base) = 0; virtual int getNodesAfter (uint256 const& ledger) = 0; virtual int getLoadRatio (bool overLoaded) = 0; diff --git a/src/ripple/http/impl/Door.cpp b/src/ripple/http/impl/Door.cpp index f93b63d623..72ccab1ddd 100644 --- a/src/ripple/http/impl/Door.cpp +++ b/src/ripple/http/impl/Door.cpp @@ -19,6 +19,7 @@ #include #include +#include #include #include #include @@ -53,7 +54,7 @@ detect_ssl (Socket& socket, StreamBuf& buf, Yield yield) for(;;) { std::size_t const max = 4; // the most bytes we could need - std::array data; + unsigned char data[max]; auto const bytes = boost::asio::buffer_copy ( boost::asio::buffer(data), buf.data());