diff options
author | Riccardo Spagni <ric@spagni.net> | 2018-12-12 11:59:04 +0200 |
---|---|---|
committer | Riccardo Spagni <ric@spagni.net> | 2018-12-12 11:59:04 +0200 |
commit | 4556f0e2b8789798f5a1c12a0c712d9379a9e34a (patch) | |
tree | 903a889808261394e96c134bc4b6d6b4795f8f3e | |
parent | Merge pull request #4903 (diff) | |
parent | rpc: speed up the common get_output_distribution case while syncing (diff) | |
download | monero-4556f0e2b8789798f5a1c12a0c712d9379a9e34a.tar.xz |
Merge pull request #4908
5ca4994c rpc: speed up the common get_output_distribution case while syncing (moneromooo-monero)
-rw-r--r-- | src/rpc/rpc_handler.cpp | 21 |
1 files changed, 19 insertions, 2 deletions
diff --git a/src/rpc/rpc_handler.cpp b/src/rpc/rpc_handler.cpp index 63664bf8b..e0a81c70f 100644 --- a/src/rpc/rpc_handler.cpp +++ b/src/rpc/rpc_handler.cpp @@ -43,8 +43,25 @@ namespace rpc std::vector<std::uint64_t> distribution; std::uint64_t start_height, base; - if (!f(amount, from_height, to_height, start_height, distribution, base)) - return boost::none; + + // see if we can extend the cache - a common case + if (d.cached && amount == 0 && d.cached_from == from_height && to_height > d.cached_to) + { + std::vector<std::uint64_t> new_distribution; + if (!f(amount, d.cached_to + 1, to_height, start_height, new_distribution, base)) + return boost::none; + distribution = d.cached_distribution; + distribution.reserve(distribution.size() + new_distribution.size()); + for (const auto &e: new_distribution) + distribution.push_back(e); + start_height = d.cached_start_height; + base = d.cached_base; + } + else + { + if (!f(amount, from_height, to_height, start_height, distribution, base)) + return boost::none; + } if (to_height > 0 && to_height >= from_height) { |