Fix LMDB double-reader bug with subaddresses+mempool (#140)

This commit is contained in:
Lee *!* Clagett
2024-10-15 21:45:52 -04:00
committed by Lee *!* Clagett
parent 48e9a52ed9
commit 62d3425277

View File

@@ -237,7 +237,7 @@ namespace lws
}; };
struct add_output struct add_output
{ {
bool operator()(lws::account& user, const db::output& out) const bool operator()(expect<db::storage_reader>&, lws::account& user, const db::output& out) const
{ return user.add_out(out); } { return user.add_out(out); }
}; };
@@ -253,7 +253,7 @@ namespace lws
net::ssl_verification_t verify_mode_; net::ssl_verification_t verify_mode_;
std::unordered_map<crypto::hash, crypto::hash> txpool_; std::unordered_map<crypto::hash, crypto::hash> txpool_;
bool operator()(lws::account& user, const db::output& out) bool operator()(expect<db::storage_reader>& reader, lws::account& user, const db::output& out)
{ {
/* Upstream monerod does not send all fields for a transaction, so /* Upstream monerod does not send all fields for a transaction, so
mempool notifications cannot compute tx_hash correctly (it is not mempool notifications cannot compute tx_hash correctly (it is not
@@ -262,14 +262,23 @@ namespace lws
then use corresponding tx_hash. */ then use corresponding tx_hash. */
const db::webhook_key key{user.id(), db::webhook_type::tx_confirmation}; const db::webhook_key key{user.id(), db::webhook_type::tx_confirmation};
std::vector<db::webhook_value> hooks{}; std::vector<db::webhook_value> hooks{};
{ {
auto reader = disk_.start_read(); db::storage_reader* active_reader = reader ?
if (!reader) std::addressof(*reader) : nullptr;
expect<db::storage_reader> temp_reader{common_error::kInvalidArgument};
if (!active_reader)
{ {
MERROR("Unable to lookup webhook on tx in pool: " << reader.error().message()); temp_reader = disk_.start_read();
return false; if (!temp_reader)
{
MERROR("Unable to lookup webhook on tx in pool: " << reader.error().message());
return false;
}
active_reader = std::addressof(*temp_reader);
} }
auto found = reader->find_webhook(key, out.payment_id.short_); auto found = active_reader->find_webhook(key, out.payment_id.short_);
if (!found) if (!found)
{ {
MERROR("Failed db lookup for webhooks: " << found.error().message()); MERROR("Failed db lookup for webhooks: " << found.error().message());
@@ -343,7 +352,7 @@ namespace lws
std::vector<std::uint64_t> const& out_ids, std::vector<std::uint64_t> const& out_ids,
subaddress_reader& reader, subaddress_reader& reader,
std::function<void(lws::account&, const db::spend&)> spend_action, std::function<void(lws::account&, const db::spend&)> spend_action,
std::function<bool(lws::account&, const db::output&)> output_action) std::function<bool(expect<db::storage_reader>&, lws::account&, const db::output&)> output_action)
{ {
if (2 < tx.version) if (2 < tx.version)
throw std::runtime_error{"Unsupported tx version"}; throw std::runtime_error{"Unsupported tx version"};
@@ -547,6 +556,7 @@ namespace lws
} }
} }
const bool added = output_action( const bool added = output_action(
reader.reader,
user, user,
db::output{ db::output{
db::transaction_link{height, tx_hash}, db::transaction_link{height, tx_hash},