Skip to content
This repository has been archived by the owner on Aug 2, 2022. It is now read-only.

Commit

Permalink
Merge pull request #10679 from EOSIO/unapplied_transactions_return_fa…
Browse files Browse the repository at this point in the history
…ilure_trace_develop_EPE-1130

Track and use return_failure_trace in unapplied transaction queue.
  • Loading branch information
jgiszczak authored Sep 1, 2021
2 parents 0874551 + 44ee406 commit ce50319
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 33 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ struct unapplied_transaction {
const transaction_metadata_ptr trx_meta;
const fc::time_point expiry;
trx_enum_type trx_type = trx_enum_type::unknown;
bool return_failure_trace = false;
next_func_t next;

const transaction_id_type& id()const { return trx_meta->id(); }
Expand Down Expand Up @@ -182,19 +183,20 @@ class unapplied_transaction_queue {
}
}

void add_incoming( const transaction_metadata_ptr& trx, bool persist_until_expired, next_func_t next ) {
void add_incoming( const transaction_metadata_ptr& trx, bool persist_until_expired, bool return_failure_trace, next_func_t next ) {
auto itr = queue.get<by_trx_id>().find( trx->id() );
if( itr == queue.get<by_trx_id>().end() ) {
fc::time_point expiry = trx->packed_trx()->expiration();
auto insert_itr = queue.insert(
{ trx, expiry, persist_until_expired ? trx_enum_type::incoming_persisted : trx_enum_type::incoming, std::move( next ) } );
{ trx, expiry, persist_until_expired ? trx_enum_type::incoming_persisted : trx_enum_type::incoming, return_failure_trace, std::move( next ) } );
if( insert_itr.second ) added( insert_itr.first );
} else {
if (itr->trx_type != trx_enum_type::incoming && itr->trx_type != trx_enum_type::incoming_persisted)
++incoming_count;

queue.get<by_trx_id>().modify( itr, [persist_until_expired, next{std::move(next)}](auto& un) mutable {
queue.get<by_trx_id>().modify( itr, [persist_until_expired, return_failure_trace, next{std::move(next)}](auto& un) mutable {
un.trx_type = persist_until_expired ? trx_enum_type::incoming_persisted : trx_enum_type::incoming;
un.return_failure_trace = return_failure_trace;
un.next = std::move( next );
} );
}
Expand Down
18 changes: 10 additions & 8 deletions plugins/producer_plugin/producer_plugin.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -478,7 +478,7 @@ class producer_plugin_impl : public std::enable_shared_from_this<producer_plugin
};
try {
auto result = future.get();
if( !self->process_incoming_transaction_async( result, persist_until_expired, next, return_failure_trace ) ) {
if( !self->process_incoming_transaction_async( result, persist_until_expired, return_failure_trace, next) ) {
if( self->_pending_block_mode == pending_block_mode::producing ) {
self->schedule_maybe_produce_block( true );
} else {
Expand All @@ -493,8 +493,8 @@ class producer_plugin_impl : public std::enable_shared_from_this<producer_plugin

bool process_incoming_transaction_async(const transaction_metadata_ptr& trx,
bool persist_until_expired,
next_function<transaction_trace_ptr> next,
const bool return_failure_trace = false) {
const bool return_failure_trace,
next_function<transaction_trace_ptr> next) {
bool exhausted = false;
chain::controller& chain = chain_plug->chain();
bool is_resource_payer_pf_activated = chain.is_builtin_activated(builtin_protocol_feature_t::resource_payer);
Expand Down Expand Up @@ -588,7 +588,7 @@ class producer_plugin_impl : public std::enable_shared_from_this<producer_plugin
}

if( !chain.is_building_block()) {
_unapplied_transactions.add_incoming( trx, persist_until_expired, next );
_unapplied_transactions.add_incoming( trx, persist_until_expired, return_failure_trace, next );
return true;
}

Expand All @@ -614,7 +614,7 @@ class producer_plugin_impl : public std::enable_shared_from_this<producer_plugin
fc_dlog( _trx_failed_trace_log, "Subjective bill for ${a}: ${b} elapsed ${t}us", ("a",resource_payer)("b",sub_bill)("t",trace->elapsed));
if( trace->except ) {
if( exception_is_exhausted( *trace->except, deadline_is_subjective )) {
_unapplied_transactions.add_incoming( trx, persist_until_expired, next );
_unapplied_transactions.add_incoming( trx, persist_until_expired, return_failure_trace, next );
if( _pending_block_mode == pending_block_mode::producing ) {
fc_dlog(_trx_failed_trace_log, "[TRX_TRACE] Block ${block_num} for producer ${prod} COULD NOT FIT, tx: ${txid} RETRYING, ec: ${c} ",
("block_num", chain.head_block_num() + 1)
Expand Down Expand Up @@ -2083,8 +2083,9 @@ void producer_plugin_impl::process_scheduled_and_incoming_trxs( const fc::time_p
auto trx_meta = itr->trx_meta;
auto next = itr->next;
bool persist_until_expired = itr->trx_type == trx_enum_type::incoming_persisted;
bool return_failure_trace = itr->return_failure_trace;
itr = _unapplied_transactions.erase( itr );
if( !process_incoming_transaction_async( trx_meta, persist_until_expired, next ) ) {
if( !process_incoming_transaction_async( trx_meta, persist_until_expired, return_failure_trace, next ) ) {
exhausted = true;
break;
}
Expand Down Expand Up @@ -2152,9 +2153,10 @@ bool producer_plugin_impl::process_incoming_trxs( const fc::time_point& deadline
auto trx_meta = itr->trx_meta;
auto next = itr->next;
bool persist_until_expired = itr->trx_type == trx_enum_type::incoming_persisted;
bool return_failure_trace = itr->return_failure_trace;
itr = _unapplied_transactions.erase( itr );
++processed;
if( !process_incoming_transaction_async( trx_meta, persist_until_expired, next ) ) {
if( !process_incoming_transaction_async( trx_meta, persist_until_expired, return_failure_trace, next ) ) {
exhausted = true;
break;
}
Expand Down Expand Up @@ -2457,7 +2459,7 @@ bool producer_plugin::execute_incoming_transaction(const chain::transaction_meta
{
const bool persist_until_expired = false;
const bool return_failure_trace = true;
bool exhausted = !my->process_incoming_transaction_async( trx, persist_until_expired, std::move(next), return_failure_trace );
bool exhausted = !my->process_incoming_transaction_async( trx, persist_until_expired, return_failure_trace, std::move(next));
if( exhausted ) {
if( my->_pending_block_mode == pending_block_mode::producing ) {
my->schedule_maybe_produce_block( true );
Expand Down
44 changes: 22 additions & 22 deletions unittests/unapplied_transaction_queue_tests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -338,12 +338,12 @@ BOOST_AUTO_TEST_CASE( unapplied_transaction_queue_erase_add ) try {
auto trx8 = unique_trx_meta_data();
auto trx9 = unique_trx_meta_data();

q.add_incoming( trx1, false, [](auto){} );
q.add_incoming( trx2, false, [](auto){} );
q.add_incoming( trx3, false, [](auto){} );
q.add_incoming( trx4, false, [](auto){} );
q.add_incoming( trx5, false, [](auto){} );
q.add_incoming( trx6, false, [](auto){} );
q.add_incoming( trx1, false, false, [](auto){} );
q.add_incoming( trx2, false, false, [](auto){} );
q.add_incoming( trx3, false, false, [](auto){} );
q.add_incoming( trx4, false, false, [](auto){} );
q.add_incoming( trx5, false, false, [](auto){} );
q.add_incoming( trx6, false, false, [](auto){} );

auto itr = q.incoming_begin();
auto end = q.incoming_end();
Expand All @@ -360,7 +360,7 @@ BOOST_AUTO_TEST_CASE( unapplied_transaction_queue_erase_add ) try {
if( count == 2 ) BOOST_CHECK( trx_meta == trx5 );
if( count == 1 ) BOOST_CHECK( trx_meta == trx6 );
itr = q.erase( itr );
q.add_incoming( trx_meta, false, [](auto){} );
q.add_incoming( trx_meta, false, false, [](auto){} );
--count;
}

Expand All @@ -374,12 +374,12 @@ BOOST_AUTO_TEST_CASE( unapplied_transaction_queue_erase_add ) try {
BOOST_CHECK( q.empty() );

// incoming ++itr w/ erase
q.add_incoming( trx1, false, [](auto){} );
q.add_incoming( trx2, false, [](auto){} );
q.add_incoming( trx3, false, [](auto){} );
q.add_incoming( trx4, false, [](auto){} );
q.add_incoming( trx5, false, [](auto){} );
q.add_incoming( trx6, false, [](auto){} );
q.add_incoming( trx1, false, false, [](auto){} );
q.add_incoming( trx2, false, false, [](auto){} );
q.add_incoming( trx3, false, false, [](auto){} );
q.add_incoming( trx4, false, false, [](auto){} );
q.add_incoming( trx5, false, false, [](auto){} );
q.add_incoming( trx6, false, false, [](auto){} );

itr = q.incoming_begin();
end = q.incoming_end();
Expand All @@ -403,7 +403,7 @@ BOOST_AUTO_TEST_CASE( unapplied_transaction_queue_erase_add ) try {
q.add_persisted( trx4 );
q.add_persisted( trx5 );
q.add_persisted( trx6 );
q.add_incoming( trx7, false, [](auto){} );
q.add_incoming( trx7, false, false, [](auto){} );

itr = q.persisted_begin();
end = q.persisted_end();
Expand All @@ -429,7 +429,7 @@ BOOST_AUTO_TEST_CASE( unapplied_transaction_queue_erase_add ) try {
q.add_persisted( trx4 );
q.add_persisted( trx5 );
q.add_persisted( trx6 );
q.add_incoming( trx7, false, [](auto){} );
q.add_incoming( trx7, false, false, [](auto){} );

itr = q.unapplied_begin();
end = q.unapplied_end();
Expand Down Expand Up @@ -461,12 +461,12 @@ BOOST_AUTO_TEST_CASE( unapplied_transaction_queue_incoming_count ) try {
auto trx5 = unique_trx_meta_data();
auto trx6 = unique_trx_meta_data();

q.add_incoming( trx1, false, [](auto){} );
q.add_incoming( trx2, false, [](auto){} );
q.add_incoming( trx3, false, [](auto){} );
q.add_incoming( trx4, false, [](auto){} );
q.add_incoming( trx5, false, [](auto){} );
q.add_incoming( trx6, false, [](auto){} );
q.add_incoming( trx1, false, false, [](auto){} );
q.add_incoming( trx2, false, false, [](auto){} );
q.add_incoming( trx3, false, false, [](auto){} );
q.add_incoming( trx4, false, false, [](auto){} );
q.add_incoming( trx5, false, false, [](auto){} );
q.add_incoming( trx6, false, false, [](auto){} );

auto expected = q.size();

Expand All @@ -488,7 +488,7 @@ BOOST_AUTO_TEST_CASE( unapplied_transaction_queue_incoming_count ) try {
end = q.end();

while( itr != end ) {
q.add_incoming( itr->trx_meta, false, [](auto){} );
q.add_incoming( itr->trx_meta, false, false, [](auto){} );
++expected;
BOOST_CHECK( q.incoming_size() == expected );
++itr;
Expand Down

0 comments on commit ce50319

Please sign in to comment.