blockchain_db: add a txpool tx getter which returns existence

Avoids exception spam for the "nope, not found" case
This commit is contained in:
moneromooo-monero 2017-06-11 15:10:18 +01:00
parent e3da0ca828
commit 235df7f484
No known key found for this signature in database
GPG key ID: 686F07454D6CEFC3
7 changed files with 31 additions and 5 deletions

View file

@ -1313,6 +1313,16 @@ public:
*/ */
virtual txpool_tx_meta_t get_txpool_tx_meta(const crypto::hash& txid) const = 0; virtual txpool_tx_meta_t get_txpool_tx_meta(const crypto::hash& txid) const = 0;
/**
* @brief get a txpool transaction's blob
*
* @param txid the transaction id of the transation to lookup
* @param bd the blob to return
*
* @return true if the txid was in the txpool, false otherwise
*/
virtual bool get_txpool_tx_blob(const crypto::hash& txid, cryptonote::blobdata &bd) const = 0;
/** /**
* @brief get a txpool transaction's blob * @brief get a txpool transaction's blob
* *

View file

@ -1576,7 +1576,7 @@ txpool_tx_meta_t BlockchainLMDB::get_txpool_tx_meta(const crypto::hash& txid) co
return meta; return meta;
} }
cryptonote::blobdata BlockchainLMDB::get_txpool_tx_blob(const crypto::hash& txid) const bool BlockchainLMDB::get_txpool_tx_blob(const crypto::hash& txid, cryptonote::blobdata &bd) const
{ {
LOG_PRINT_L3("BlockchainLMDB::" << __func__); LOG_PRINT_L3("BlockchainLMDB::" << __func__);
check_open(); check_open();
@ -1587,12 +1587,21 @@ cryptonote::blobdata BlockchainLMDB::get_txpool_tx_blob(const crypto::hash& txid
MDB_val k = {sizeof(txid), (void *)&txid}; MDB_val k = {sizeof(txid), (void *)&txid};
MDB_val v; MDB_val v;
auto result = mdb_cursor_get(m_cur_txpool_blob, &k, &v, MDB_SET); auto result = mdb_cursor_get(m_cur_txpool_blob, &k, &v, MDB_SET);
if (result == MDB_NOTFOUND)
return false;
if (result != 0) if (result != 0)
throw1(DB_ERROR(lmdb_error("Error finding txpool tx meta: ", result).c_str())); throw1(DB_ERROR(lmdb_error("Error finding txpool tx blob: ", result).c_str()));
blobdata bd;
bd.assign(reinterpret_cast<const char*>(v.mv_data), v.mv_size); bd.assign(reinterpret_cast<const char*>(v.mv_data), v.mv_size);
TXN_POSTFIX_RDONLY(); TXN_POSTFIX_RDONLY();
return true;
}
cryptonote::blobdata BlockchainLMDB::get_txpool_tx_blob(const crypto::hash& txid) const
{
cryptonote::blobdata bd;
if (!get_txpool_tx_blob(txid, bd))
throw1(DB_ERROR("Tx not found in txpool: "));
return bd; return bd;
} }

View file

@ -245,6 +245,7 @@ public:
virtual bool txpool_has_tx(const crypto::hash &txid) const; virtual bool txpool_has_tx(const crypto::hash &txid) const;
virtual void remove_txpool_tx(const crypto::hash& txid); virtual void remove_txpool_tx(const crypto::hash& txid);
virtual txpool_tx_meta_t get_txpool_tx_meta(const crypto::hash& txid) const; virtual txpool_tx_meta_t get_txpool_tx_meta(const crypto::hash& txid) const;
virtual bool get_txpool_tx_blob(const crypto::hash& txid, cryptonote::blobdata &bd) const;
virtual cryptonote::blobdata get_txpool_tx_blob(const crypto::hash& txid) const; virtual cryptonote::blobdata get_txpool_tx_blob(const crypto::hash& txid) const;
virtual bool for_all_txpool_txes(std::function<bool(const crypto::hash&, const txpool_tx_meta_t&, const cryptonote::blobdata*)> f, bool include_blob = false) const; virtual bool for_all_txpool_txes(std::function<bool(const crypto::hash&, const txpool_tx_meta_t&, const cryptonote::blobdata*)> f, bool include_blob = false) const;

View file

@ -4005,6 +4005,11 @@ txpool_tx_meta_t Blockchain::get_txpool_tx_meta(const crypto::hash& txid) const
return m_db->get_txpool_tx_meta(txid); return m_db->get_txpool_tx_meta(txid);
} }
bool Blockchain::get_txpool_tx_blob(const crypto::hash& txid, cryptonote::blobdata &bd) const
{
return m_db->get_txpool_tx_blob(txid, bd);
}
cryptonote::blobdata Blockchain::get_txpool_tx_blob(const crypto::hash& txid) const cryptonote::blobdata Blockchain::get_txpool_tx_blob(const crypto::hash& txid) const
{ {
return m_db->get_txpool_tx_blob(txid); return m_db->get_txpool_tx_blob(txid);

View file

@ -862,6 +862,7 @@ namespace cryptonote
void remove_txpool_tx(const crypto::hash &txid); void remove_txpool_tx(const crypto::hash &txid);
uint64_t get_txpool_tx_count() const; uint64_t get_txpool_tx_count() const;
txpool_tx_meta_t get_txpool_tx_meta(const crypto::hash& txid) const; txpool_tx_meta_t get_txpool_tx_meta(const crypto::hash& txid) const;
bool get_txpool_tx_blob(const crypto::hash& txid, cryptonote::blobdata &bd) const;
cryptonote::blobdata get_txpool_tx_blob(const crypto::hash& txid) const; cryptonote::blobdata get_txpool_tx_blob(const crypto::hash& txid) const;
bool for_all_txpool_txes(std::function<bool(const crypto::hash&, const txpool_tx_meta_t&, const cryptonote::blobdata*)>, bool include_blob = false) const; bool for_all_txpool_txes(std::function<bool(const crypto::hash&, const txpool_tx_meta_t&, const cryptonote::blobdata*)>, bool include_blob = false) const;

View file

@ -627,8 +627,7 @@ namespace cryptonote
CRITICAL_REGION_LOCAL1(m_blockchain); CRITICAL_REGION_LOCAL1(m_blockchain);
try try
{ {
txblob = m_blockchain.get_txpool_tx_blob(id); return m_blockchain.get_txpool_tx_blob(id, txblob);
return true;
} }
catch (const std::exception &e) catch (const std::exception &e)
{ {

View file

@ -118,6 +118,7 @@ public:
virtual bool txpool_has_tx(const crypto::hash &txid) const { return false; } virtual bool txpool_has_tx(const crypto::hash &txid) const { return false; }
virtual void remove_txpool_tx(const crypto::hash& txid) {} virtual void remove_txpool_tx(const crypto::hash& txid) {}
virtual txpool_tx_meta_t get_txpool_tx_meta(const crypto::hash& txid) const { return txpool_tx_meta_t(); } virtual txpool_tx_meta_t get_txpool_tx_meta(const crypto::hash& txid) const { return txpool_tx_meta_t(); }
virtual bool get_txpool_tx_blob(const crypto::hash& txid, cryptonote::blobdata &bd) const { return false; }
virtual cryptonote::blobdata get_txpool_tx_blob(const crypto::hash& txid) const { return ""; } virtual cryptonote::blobdata get_txpool_tx_blob(const crypto::hash& txid) const { return ""; }
virtual bool for_all_txpool_txes(std::function<bool(const crypto::hash&, const txpool_tx_meta_t&, const cryptonote::blobdata*)>, bool include_blob = false) const { return false; } virtual bool for_all_txpool_txes(std::function<bool(const crypto::hash&, const txpool_tx_meta_t&, const cryptonote::blobdata*)>, bool include_blob = false) const { return false; }