aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRiccardo Spagni <ric@spagni.net>2018-12-12 11:59:04 +0200
committerRiccardo Spagni <ric@spagni.net>2018-12-12 11:59:04 +0200
commit4556f0e2b8789798f5a1c12a0c712d9379a9e34a (patch)
tree903a889808261394e96c134bc4b6d6b4795f8f3e
parentMerge pull request #4903 (diff)
parentrpc: speed up the common get_output_distribution case while syncing (diff)
downloadmonero-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.cpp21
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)
{