From 52dda97a96b8b5391fef86600014f269720e0ba7 Mon Sep 17 00:00:00 2001 From: Kevin Heifner Date: Wed, 21 Oct 2020 15:59:00 -0500 Subject: [PATCH 1/4] Keep unapplied trx around for faster apply block --- .../chain/include/eosio/chain/unapplied_transaction_queue.hpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/libraries/chain/include/eosio/chain/unapplied_transaction_queue.hpp b/libraries/chain/include/eosio/chain/unapplied_transaction_queue.hpp index 15367b750c7..b6f7d0a5a05 100644 --- a/libraries/chain/include/eosio/chain/unapplied_transaction_queue.hpp +++ b/libraries/chain/include/eosio/chain/unapplied_transaction_queue.hpp @@ -162,7 +162,6 @@ class unapplied_transaction_queue { } void add_forked( const branch_type& forked_branch ) { - if( mode == process_mode::non_speculative || mode == process_mode::speculative_non_producer ) return; // forked_branch is in reverse order for( auto ritr = forked_branch.rbegin(), rend = forked_branch.rend(); ritr != rend; ++ritr ) { const block_state_ptr& bsptr = *ritr; @@ -176,7 +175,6 @@ class unapplied_transaction_queue { } void add_aborted( deque aborted_trxs ) { - if( mode == process_mode::non_speculative || mode == process_mode::speculative_non_producer ) return; for( auto& trx : aborted_trxs ) { fc::time_point expiry = trx->packed_trx()->expiration(); auto insert_itr = queue.insert( { std::move( trx ), expiry, trx_enum_type::aborted } ); From 9b3467f81ab028f85e1c919a6f256a5bdbf19040 Mon Sep 17 00:00:00 2001 From: Kevin Heifner Date: Thu, 22 Oct 2020 08:59:32 -0500 Subject: [PATCH 2/4] When speculatively executing last block doesn't apply --- plugins/producer_plugin/producer_plugin.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/plugins/producer_plugin/producer_plugin.cpp b/plugins/producer_plugin/producer_plugin.cpp index 676a616674d..e270530be4c 100644 --- a/plugins/producer_plugin/producer_plugin.cpp +++ b/plugins/producer_plugin/producer_plugin.cpp @@ -1356,8 +1356,12 @@ fc::time_point producer_plugin_impl::calculate_pending_block_time() const { } fc::time_point producer_plugin_impl::calculate_block_deadline( const fc::time_point& block_time ) const { - bool last_block = ((block_timestamp_type(block_time).slot % config::producer_repetitions) == config::producer_repetitions - 1); - return block_time + fc::microseconds(last_block ? _last_block_time_offset_us : _produce_time_offset_us); + if( _pending_block_mode == pending_block_mode::producing ) { + bool last_block = ((block_timestamp_type( block_time ).slot % config::producer_repetitions) == config::producer_repetitions - 1); + return block_time + fc::microseconds(last_block ? _last_block_time_offset_us : _produce_time_offset_us); + } else { + return block_time + fc::microseconds(_produce_time_offset_us); + } } producer_plugin_impl::start_block_result producer_plugin_impl::start_block() { From 94789757cd73d9971219b85e430e0255b62423b0 Mon Sep 17 00:00:00 2001 From: Kevin Heifner Date: Thu, 22 Oct 2020 11:13:34 -0500 Subject: [PATCH 3/4] During speculative execution, restart block if current block is exhausted --- plugins/producer_plugin/producer_plugin.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/plugins/producer_plugin/producer_plugin.cpp b/plugins/producer_plugin/producer_plugin.cpp index e270530be4c..90a3da21e2a 100644 --- a/plugins/producer_plugin/producer_plugin.cpp +++ b/plugins/producer_plugin/producer_plugin.cpp @@ -421,6 +421,14 @@ class producer_plugin_impl : public std::enable_shared_from_thischain(); + // abort the pending block + _unapplied_transactions.add_aborted( chain.abort_block() ); + + schedule_production_loop(); + } + void on_incoming_transaction_async(const packed_transaction_ptr& trx, bool persist_until_expired, next_function next) { chain::controller& chain = chain_plug->chain(); const auto max_trx_time_ms = _max_transaction_time_ms.load(); @@ -445,6 +453,8 @@ class producer_plugin_impl : public std::enable_shared_from_thisprocess_incoming_transaction_async( result, persist_until_expired, next ) ) { if( self->_pending_block_mode == pending_block_mode::producing ) { self->schedule_maybe_produce_block( true ); + } else { + self->restart_speculative_block(); } } } CATCH_AND_CALL(exception_handler); From 946dee8fcb082c7c721658b4aafeb1e3d3e0ce15 Mon Sep 17 00:00:00 2001 From: Kevin Heifner Date: Thu, 22 Oct 2020 15:11:53 -0500 Subject: [PATCH 4/4] Remove process_mode as it is not needed --- .../eosio/chain/unapplied_transaction_queue.hpp | 16 ---------------- plugins/producer_plugin/producer_plugin.cpp | 5 ----- 2 files changed, 21 deletions(-) diff --git a/libraries/chain/include/eosio/chain/unapplied_transaction_queue.hpp b/libraries/chain/include/eosio/chain/unapplied_transaction_queue.hpp index b6f7d0a5a05..ee7f0506f35 100644 --- a/libraries/chain/include/eosio/chain/unapplied_transaction_queue.hpp +++ b/libraries/chain/include/eosio/chain/unapplied_transaction_queue.hpp @@ -49,13 +49,6 @@ struct unapplied_transaction { * Persisted are first so that they can be applied in each block until expired. */ class unapplied_transaction_queue { -public: - enum class process_mode { - non_speculative, // HEAD, READ_ONLY, IRREVERSIBLE - speculative_non_producer, // will never produce - speculative_producer // can produce - }; - private: struct by_trx_id; struct by_type; @@ -72,7 +65,6 @@ class unapplied_transaction_queue { > unapplied_trx_queue_type; unapplied_trx_queue_type queue; - process_mode mode = process_mode::speculative_producer; uint64_t max_transaction_queue_size = 1024*1024*1024; // enforced for incoming uint64_t size_in_bytes = 0; size_t incoming_count = 0; @@ -81,13 +73,6 @@ class unapplied_transaction_queue { void set_max_transaction_queue_size( uint64_t v ) { max_transaction_queue_size = v; } - void set_mode( process_mode new_mode ) { - if( new_mode != mode ) { - FC_ASSERT( empty(), "set_mode, queue required to be empty" ); - } - mode = new_mode; - } - bool empty() const { return queue.empty(); } @@ -183,7 +168,6 @@ class unapplied_transaction_queue { } void add_persisted( const transaction_metadata_ptr& trx ) { - if( mode == process_mode::non_speculative ) return; auto itr = queue.get().find( trx->id() ); if( itr == queue.get().end() ) { fc::time_point expiry = trx->packed_trx()->expiration(); diff --git a/plugins/producer_plugin/producer_plugin.cpp b/plugins/producer_plugin/producer_plugin.cpp index 90a3da21e2a..501e146309c 100644 --- a/plugins/producer_plugin/producer_plugin.cpp +++ b/plugins/producer_plugin/producer_plugin.cpp @@ -733,11 +733,6 @@ void producer_plugin::plugin_initialize(const boost::program_options::variables_ LOAD_VALUE_SET(options, "producer-name", my->_producers) chain::controller& chain = my->chain_plug->chain(); - unapplied_transaction_queue::process_mode unapplied_mode = - (chain.get_read_mode() != chain::db_read_mode::SPECULATIVE) ? unapplied_transaction_queue::process_mode::non_speculative : - my->_producers.empty() ? unapplied_transaction_queue::process_mode::speculative_non_producer : - unapplied_transaction_queue::process_mode::speculative_producer; - my->_unapplied_transactions.set_mode( unapplied_mode ); if( options.count("private-key") ) {