mirror of
https://codeberg.org/wownero/wownero-lws
synced 2026-01-09 23:25:16 -08:00
Fix LMDB double-reader bug with subaddresses+mempool (#140)
This commit is contained in:
committed by
Lee *!* Clagett
parent
48e9a52ed9
commit
62d3425277
@@ -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},
|
||||||
|
|||||||
Reference in New Issue
Block a user