mirror of
https://codeberg.org/anoncontributorxmr/monero.git
synced 2024-11-27 13:23:29 +01:00
Merge pull request #3672
875c1cab
wallet2: increase rpc timeout for get_output_distribution (moneromooo-monero)70f23217
add top height to get_output_distribution, and cache it for rct (moneromooo-monero)8c7363fb
rpc: add missing perf timer for get_output_distribution (moneromooo-monero)
This commit is contained in:
commit
03ff3be10e
@ -2082,10 +2082,27 @@ namespace cryptonote
|
|||||||
//------------------------------------------------------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------------------------------------------------------
|
||||||
bool core_rpc_server::on_get_output_distribution(const COMMAND_RPC_GET_OUTPUT_DISTRIBUTION::request& req, COMMAND_RPC_GET_OUTPUT_DISTRIBUTION::response& res, epee::json_rpc::error& error_resp)
|
bool core_rpc_server::on_get_output_distribution(const COMMAND_RPC_GET_OUTPUT_DISTRIBUTION::request& req, COMMAND_RPC_GET_OUTPUT_DISTRIBUTION::response& res, epee::json_rpc::error& error_resp)
|
||||||
{
|
{
|
||||||
|
PERF_TIMER(on_get_output_distribution);
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
for (uint64_t amount: req.amounts)
|
for (uint64_t amount: req.amounts)
|
||||||
{
|
{
|
||||||
|
static struct D
|
||||||
|
{
|
||||||
|
boost::mutex mutex;
|
||||||
|
std::vector<uint64_t> cached_distribution;
|
||||||
|
uint64_t cached_from, cached_to, cached_start_height, cached_base;
|
||||||
|
bool cached;
|
||||||
|
D(): cached_from(0), cached_to(0), cached_start_height(0), cached_base(0), cached(false) {}
|
||||||
|
} d;
|
||||||
|
boost::unique_lock<boost::mutex> lock(d.mutex);
|
||||||
|
|
||||||
|
if (d.cached && amount == 0 && d.cached_from == req.from_height && d.cached_to == req.to_height)
|
||||||
|
{
|
||||||
|
res.distributions.push_back({amount, d.cached_start_height, d.cached_distribution, d.cached_base});
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
std::vector<uint64_t> distribution;
|
std::vector<uint64_t> distribution;
|
||||||
uint64_t start_height, base;
|
uint64_t start_height, base;
|
||||||
if (!m_core.get_output_distribution(amount, req.from_height, start_height, distribution, base))
|
if (!m_core.get_output_distribution(amount, req.from_height, start_height, distribution, base))
|
||||||
@ -2094,12 +2111,29 @@ namespace cryptonote
|
|||||||
error_resp.message = "Failed to get rct distribution";
|
error_resp.message = "Failed to get rct distribution";
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
if (req.to_height > 0 && req.to_height >= req.from_height)
|
||||||
|
{
|
||||||
|
uint64_t offset = std::max(req.from_height, start_height);
|
||||||
|
if (offset <= req.to_height && req.to_height - offset + 1 < distribution.size())
|
||||||
|
distribution.resize(req.to_height - offset + 1);
|
||||||
|
}
|
||||||
if (req.cumulative)
|
if (req.cumulative)
|
||||||
{
|
{
|
||||||
distribution[0] += base;
|
distribution[0] += base;
|
||||||
for (size_t n = 1; n < distribution.size(); ++n)
|
for (size_t n = 1; n < distribution.size(); ++n)
|
||||||
distribution[n] += distribution[n-1];
|
distribution[n] += distribution[n-1];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (amount == 0)
|
||||||
|
{
|
||||||
|
d.cached_from = req.from_height;
|
||||||
|
d.cached_to = req.to_height;
|
||||||
|
d.cached_distribution = distribution;
|
||||||
|
d.cached_start_height = start_height;
|
||||||
|
d.cached_base = base;
|
||||||
|
d.cached = true;
|
||||||
|
}
|
||||||
|
|
||||||
res.distributions.push_back({amount, start_height, std::move(distribution), base});
|
res.distributions.push_back({amount, start_height, std::move(distribution), base});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2212,11 +2212,13 @@ namespace cryptonote
|
|||||||
{
|
{
|
||||||
std::vector<uint64_t> amounts;
|
std::vector<uint64_t> amounts;
|
||||||
uint64_t from_height;
|
uint64_t from_height;
|
||||||
|
uint64_t to_height;
|
||||||
bool cumulative;
|
bool cumulative;
|
||||||
|
|
||||||
BEGIN_KV_SERIALIZE_MAP()
|
BEGIN_KV_SERIALIZE_MAP()
|
||||||
KV_SERIALIZE(amounts)
|
KV_SERIALIZE(amounts)
|
||||||
KV_SERIALIZE_OPT(from_height, (uint64_t)0)
|
KV_SERIALIZE_OPT(from_height, (uint64_t)0)
|
||||||
|
KV_SERIALIZE_OPT(to_height, (uint64_t)0)
|
||||||
KV_SERIALIZE_OPT(cumulative, false)
|
KV_SERIALIZE_OPT(cumulative, false)
|
||||||
END_KV_SERIALIZE_MAP()
|
END_KV_SERIALIZE_MAP()
|
||||||
};
|
};
|
||||||
|
@ -5905,9 +5905,10 @@ void wallet2::get_outs(std::vector<std::vector<tools::wallet2::get_outs_entry>>
|
|||||||
auto end = std::unique(req_t.amounts.begin(), req_t.amounts.end());
|
auto end = std::unique(req_t.amounts.begin(), req_t.amounts.end());
|
||||||
req_t.amounts.resize(std::distance(req_t.amounts.begin(), end));
|
req_t.amounts.resize(std::distance(req_t.amounts.begin(), end));
|
||||||
req_t.from_height = std::max<uint64_t>(segregation_fork_height, RECENT_OUTPUT_BLOCKS) - RECENT_OUTPUT_BLOCKS;
|
req_t.from_height = std::max<uint64_t>(segregation_fork_height, RECENT_OUTPUT_BLOCKS) - RECENT_OUTPUT_BLOCKS;
|
||||||
|
req_t.to_height = segregation_fork_height + 1;
|
||||||
req_t.cumulative = true;
|
req_t.cumulative = true;
|
||||||
m_daemon_rpc_mutex.lock();
|
m_daemon_rpc_mutex.lock();
|
||||||
bool r = net_utils::invoke_http_json_rpc("/json_rpc", "get_output_distribution", req_t, resp_t, m_http_client, rpc_timeout);
|
bool r = net_utils::invoke_http_json_rpc("/json_rpc", "get_output_distribution", req_t, resp_t, m_http_client, rpc_timeout * 1000);
|
||||||
m_daemon_rpc_mutex.unlock();
|
m_daemon_rpc_mutex.unlock();
|
||||||
THROW_WALLET_EXCEPTION_IF(!r, error::no_connection_to_daemon, "transfer_selected");
|
THROW_WALLET_EXCEPTION_IF(!r, error::no_connection_to_daemon, "transfer_selected");
|
||||||
THROW_WALLET_EXCEPTION_IF(resp_t.status == CORE_RPC_STATUS_BUSY, error::daemon_busy, "get_output_distribution");
|
THROW_WALLET_EXCEPTION_IF(resp_t.status == CORE_RPC_STATUS_BUSY, error::daemon_busy, "get_output_distribution");
|
||||||
@ -5924,6 +5925,7 @@ void wallet2::get_outs(std::vector<std::vector<tools::wallet2::get_outs_entry>>
|
|||||||
{
|
{
|
||||||
THROW_WALLET_EXCEPTION_IF(d.start_height > segregation_fork_height, error::get_output_distribution, "Distribution start_height too high");
|
THROW_WALLET_EXCEPTION_IF(d.start_height > segregation_fork_height, error::get_output_distribution, "Distribution start_height too high");
|
||||||
THROW_WALLET_EXCEPTION_IF(segregation_fork_height - d.start_height >= d.distribution.size(), error::get_output_distribution, "Distribution size too small");
|
THROW_WALLET_EXCEPTION_IF(segregation_fork_height - d.start_height >= d.distribution.size(), error::get_output_distribution, "Distribution size too small");
|
||||||
|
THROW_WALLET_EXCEPTION_IF(segregation_fork_height - RECENT_OUTPUT_BLOCKS - d.start_height >= d.distribution.size(), error::get_output_distribution, "Distribution size too small");
|
||||||
THROW_WALLET_EXCEPTION_IF(segregation_fork_height <= RECENT_OUTPUT_BLOCKS, error::wallet_internal_error, "Fork height too low");
|
THROW_WALLET_EXCEPTION_IF(segregation_fork_height <= RECENT_OUTPUT_BLOCKS, error::wallet_internal_error, "Fork height too low");
|
||||||
THROW_WALLET_EXCEPTION_IF(segregation_fork_height - RECENT_OUTPUT_BLOCKS < d.start_height, error::get_output_distribution, "Bad start height");
|
THROW_WALLET_EXCEPTION_IF(segregation_fork_height - RECENT_OUTPUT_BLOCKS < d.start_height, error::get_output_distribution, "Bad start height");
|
||||||
uint64_t till_fork = d.distribution[segregation_fork_height - d.start_height];
|
uint64_t till_fork = d.distribution[segregation_fork_height - d.start_height];
|
||||||
|
Loading…
Reference in New Issue
Block a user