From 83830ef9c0bf03c6dd0e590fd80097619dd3c5df Mon Sep 17 00:00:00 2001 From: Howard Hinnant Date: Wed, 26 Aug 2015 17:18:31 -0400 Subject: [PATCH] Install upper_bound in ReadView: * And use it in doLedgerData. --- src/ripple/app/ledger/Ledger.cpp | 9 ++++++ src/ripple/app/ledger/Ledger.h | 3 ++ src/ripple/ledger/CachedView.h | 6 ++++ src/ripple/ledger/OpenView.h | 3 ++ src/ripple/ledger/ReadView.h | 6 ++++ src/ripple/ledger/detail/ApplyViewBase.h | 3 ++ src/ripple/ledger/detail/RawStateTable.h | 3 ++ src/ripple/ledger/impl/ApplyViewBase.cpp | 7 +++++ src/ripple/ledger/impl/OpenView.cpp | 7 +++++ src/ripple/ledger/impl/RawStateTable.cpp | 12 ++++++-- src/ripple/ledger/impl/ReadView.cpp | 7 +++++ src/ripple/ledger/tests/View_test.cpp | 39 ++++++++++++++++++++++++ src/ripple/rpc/handlers/LedgerData.cpp | 5 +-- 13 files changed, 106 insertions(+), 4 deletions(-) diff --git a/src/ripple/app/ledger/Ledger.cpp b/src/ripple/app/ledger/Ledger.cpp index 853e49d68..93b65b3d9 100644 --- a/src/ripple/app/ledger/Ledger.cpp +++ b/src/ripple/app/ledger/Ledger.cpp @@ -549,6 +549,15 @@ Ledger::slesEnd() const -> stateMap_->end(), *this); } +auto +Ledger::slesUpperBound(uint256 const& key) const -> + std::unique_ptr +{ + return std::make_unique< + sles_iter_impl>( + stateMap_->upper_bound(key), *this); +} + auto Ledger::txsBegin() const -> std::unique_ptr diff --git a/src/ripple/app/ledger/Ledger.h b/src/ripple/app/ledger/Ledger.h index e1576e2ac..d35fed7e6 100644 --- a/src/ripple/app/ledger/Ledger.h +++ b/src/ripple/app/ledger/Ledger.h @@ -170,6 +170,9 @@ public: std::unique_ptr slesEnd() const override; + std::unique_ptr + slesUpperBound(uint256 const& key) const override; + std::unique_ptr txsBegin() const override; diff --git a/src/ripple/ledger/CachedView.h b/src/ripple/ledger/CachedView.h index a5baad3dd..d2790a812 100644 --- a/src/ripple/ledger/CachedView.h +++ b/src/ripple/ledger/CachedView.h @@ -102,6 +102,12 @@ public: return base_.slesEnd(); } + std::unique_ptr + slesUpperBound(uint256 const& key) const override + { + return base_.slesUpperBound(key); + } + std::unique_ptr txsBegin() const override { diff --git a/src/ripple/ledger/OpenView.h b/src/ripple/ledger/OpenView.h index 7caee53a8..f5eeeafb3 100644 --- a/src/ripple/ledger/OpenView.h +++ b/src/ripple/ledger/OpenView.h @@ -182,6 +182,9 @@ public: std::unique_ptr slesEnd() const override; + std::unique_ptr + slesUpperBound(uint256 const& key) const override; + std::unique_ptr txsBegin() const override; diff --git a/src/ripple/ledger/ReadView.h b/src/ripple/ledger/ReadView.h index d40d681cd..781a562f0 100644 --- a/src/ripple/ledger/ReadView.h +++ b/src/ripple/ledger/ReadView.h @@ -191,6 +191,7 @@ public: explicit sles_type (ReadView const& view); iterator begin() const; iterator const& end() const; + iterator upper_bound(key_type const& key) const; }; struct txs_type @@ -332,6 +333,11 @@ public: std::unique_ptr slesEnd() const = 0; + // used by the implementation + virtual + std::unique_ptr + slesUpperBound(key_type const& key) const = 0; + // used by the implementation virtual std::unique_ptr diff --git a/src/ripple/ledger/detail/ApplyViewBase.h b/src/ripple/ledger/detail/ApplyViewBase.h index 51aa9a813..139e707cd 100644 --- a/src/ripple/ledger/detail/ApplyViewBase.h +++ b/src/ripple/ledger/detail/ApplyViewBase.h @@ -83,6 +83,9 @@ public: std::unique_ptr slesEnd() const override; + std::unique_ptr + slesUpperBound(uint256 const& key) const override; + std::unique_ptr txsBegin() const override; diff --git a/src/ripple/ledger/detail/RawStateTable.h b/src/ripple/ledger/detail/RawStateTable.h index f71470741..7ba75b66c 100644 --- a/src/ripple/ledger/detail/RawStateTable.h +++ b/src/ripple/ledger/detail/RawStateTable.h @@ -83,6 +83,9 @@ public: std::unique_ptr slesEnd (ReadView const& base) const; + std::unique_ptr + slesUpperBound (ReadView const& base, uint256 const& key) const; + private: enum class Action { diff --git a/src/ripple/ledger/impl/ApplyViewBase.cpp b/src/ripple/ledger/impl/ApplyViewBase.cpp index ee529451b..1b6f4a763 100644 --- a/src/ripple/ledger/impl/ApplyViewBase.cpp +++ b/src/ripple/ledger/impl/ApplyViewBase.cpp @@ -85,6 +85,13 @@ ApplyViewBase::slesEnd() const -> return base_->slesEnd(); } +auto +ApplyViewBase::slesUpperBound(uint256 const& key) const -> + std::unique_ptr +{ + return base_->slesUpperBound(key); +} + auto ApplyViewBase::txsBegin() const -> std::unique_ptr diff --git a/src/ripple/ledger/impl/OpenView.cpp b/src/ripple/ledger/impl/OpenView.cpp index d2380e5f9..a82a4d117 100644 --- a/src/ripple/ledger/impl/OpenView.cpp +++ b/src/ripple/ledger/impl/OpenView.cpp @@ -178,6 +178,13 @@ OpenView::slesEnd() const -> return items_.slesEnd(*base_); } +auto +OpenView::slesUpperBound(uint256 const& key) const -> + std::unique_ptr +{ + return items_.slesUpperBound(*base_, key); +} + auto OpenView::txsBegin() const -> std::unique_ptr diff --git a/src/ripple/ledger/impl/RawStateTable.cpp b/src/ripple/ledger/impl/RawStateTable.cpp index 2e5353565..18f0e717b 100644 --- a/src/ripple/ledger/impl/RawStateTable.cpp +++ b/src/ripple/ledger/impl/RawStateTable.cpp @@ -41,9 +41,9 @@ public: sles_iter_impl (items_t::const_iterator iter1, items_t::const_iterator end1, ReadView::sles_type::iterator iter0, - ReadView::sles_type::iterator base0) + ReadView::sles_type::iterator end0) : iter0_ (iter0) - , end0_ (base0) + , end0_ (end0) , iter1_ (iter1) , end1_ (end1) { @@ -354,5 +354,13 @@ RawStateTable::slesEnd (ReadView const& base) const base.sles.end(), base.sles.end()); } +std::unique_ptr +RawStateTable::slesUpperBound (ReadView const& base, uint256 const& key) const +{ + return std::make_unique( + items_.upper_bound(key), items_.end(), + base.sles.upper_bound(key), base.sles.end()); +} + } // detail } // ripple diff --git a/src/ripple/ledger/impl/ReadView.cpp b/src/ripple/ledger/impl/ReadView.cpp index 380e9738a..97489ad37 100644 --- a/src/ripple/ledger/impl/ReadView.cpp +++ b/src/ripple/ledger/impl/ReadView.cpp @@ -144,6 +144,13 @@ ReadView::sles_type::end() const -> return *end_; } +auto +ReadView::sles_type::upper_bound(key_type const& key) const -> + iterator +{ + return iterator(view_, view_->slesUpperBound(key)); +} + ReadView::txs_type::txs_type( ReadView const& view) : ReadViewFwdRange(view) diff --git a/src/ripple/ledger/tests/View_test.cpp b/src/ripple/ledger/tests/View_test.cpp index 9d7616b34..cb268c32c 100644 --- a/src/ripple/ledger/tests/View_test.cpp +++ b/src/ripple/ledger/tests/View_test.cpp @@ -435,6 +435,12 @@ class View_test view.rawInsert (sle (4)); view.rawInsert (sle (5)); expect (sles (view) == list (2, 3, 4, 5)); + auto b = view.sles.begin(); + expect (view.sles.upper_bound(uint256(1)) == b); ++b; + expect (view.sles.upper_bound(uint256(2)) == b); ++b; + expect (view.sles.upper_bound(uint256(3)) == b); ++b; + expect (view.sles.upper_bound(uint256(4)) == b); ++b; + expect (view.sles.upper_bound(uint256(5)) == b); } { setup123 (); @@ -444,6 +450,12 @@ class View_test view.rawInsert (sle (4)); view.rawInsert (sle (5)); expect (sles (view) == list (3, 4, 5)); + auto b = view.sles.begin(); + expect (view.sles.upper_bound(uint256(1)) == b); + expect (view.sles.upper_bound(uint256(2)) == b); ++b; + expect (view.sles.upper_bound(uint256(3)) == b); ++b; + expect (view.sles.upper_bound(uint256(4)) == b); ++b; + expect (view.sles.upper_bound(uint256(5)) == b); } { setup123 (); @@ -454,6 +466,12 @@ class View_test view.rawInsert (sle (4)); view.rawInsert (sle (5)); expect (sles (view) == list (4, 5)); + auto b = view.sles.begin(); + expect (view.sles.upper_bound(uint256(1)) == b); + expect (view.sles.upper_bound(uint256(2)) == b); + expect (view.sles.upper_bound(uint256(3)) == b); ++b; + expect (view.sles.upper_bound(uint256(4)) == b); ++b; + expect (view.sles.upper_bound(uint256(5)) == b); } { setup123 (); @@ -462,6 +480,13 @@ class View_test view.rawInsert (sle (4)); view.rawInsert (sle (5)); expect (sles (view) == list (1, 2, 4, 5)); + auto b = view.sles.begin(); + ++b; + expect (view.sles.upper_bound(uint256(1)) == b); ++b; + expect (view.sles.upper_bound(uint256(2)) == b); + expect (view.sles.upper_bound(uint256(3)) == b); ++b; + expect (view.sles.upper_bound(uint256(4)) == b); ++b; + expect (view.sles.upper_bound(uint256(5)) == b); } { setup123 (); @@ -475,11 +500,25 @@ class View_test view.rawErase (sle (3)); expect (sles (view) == list (1, 2)); + auto b = view.sles.begin(); + ++b; + expect (view.sles.upper_bound(uint256(1)) == b); ++b; + expect (view.sles.upper_bound(uint256(2)) == b); + expect (view.sles.upper_bound(uint256(3)) == b); + expect (view.sles.upper_bound(uint256(4)) == b); + expect (view.sles.upper_bound(uint256(5)) == b); view.rawInsert (sle (5)); view.rawInsert (sle (4)); view.rawInsert (sle (3)); expect (sles (view) == list (1, 2, 3, 4, 5)); + b = view.sles.begin(); + ++b; + expect (view.sles.upper_bound(uint256(1)) == b); ++b; + expect (view.sles.upper_bound(uint256(2)) == b); ++b; + expect (view.sles.upper_bound(uint256(3)) == b); ++b; + expect (view.sles.upper_bound(uint256(4)) == b); ++b; + expect (view.sles.upper_bound(uint256(5)) == b); } } diff --git a/src/ripple/rpc/handlers/LedgerData.cpp b/src/ripple/rpc/handlers/LedgerData.cpp index 6963a5178..1206ab0e7 100644 --- a/src/ripple/rpc/handlers/LedgerData.cpp +++ b/src/ripple/rpc/handlers/LedgerData.cpp @@ -77,9 +77,10 @@ Json::Value doLedgerData (RPC::Context& context) Json::Value& nodes = jvResult[jss::state]; - while ((key = lpLedger->succ(*key))) + auto e = lpLedger->sles.end(); + for (auto i = lpLedger->sles.upper_bound(*key); i != e; ++i) { - auto sle = lpLedger->read(keylet::unchecked(*key)); + auto sle = lpLedger->read(keylet::unchecked((*i)->key())); if (limit-- <= 0) { // Stop processing before the current key.