Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Rework signal handling #189

Merged
merged 30 commits into from
May 12, 2022
Merged
Show file tree
Hide file tree
Changes from 19 commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
7f00cac
Added tests for finality status.
brianjohnson5972 Apr 27, 2022
55ce2d1
Cleanup prior to logic change.
brianjohnson5972 Apr 30, 2022
66a6a5b
Added ability to call applied trx immediately.
brianjohnson5972 Apr 30, 2022
12f45ad
Added in transaction-status and method to wait for a specific producer.
brianjohnson5972 Apr 30, 2022
2ae2ea0
Cleaned up and fixed test.
brianjohnson5972 Apr 30, 2022
fd62e9c
Test fixes after cleanup.
brianjohnson5972 Apr 30, 2022
f7c0154
Added finishing steps to test.
brianjohnson5972 May 1, 2022
a7b0799
Fixed handling for node that is producer.
brianjohnson5972 May 5, 2022
7fdc399
Fixed fork test.
brianjohnson5972 May 5, 2022
4559640
Remove test no longer meaningful.
oschwaldp-oci May 5, 2022
5c09353
Update signal handling path
oschwaldp-oci May 5, 2022
c606c28
Additional id and timestamp verification.
oschwaldp-oci May 5, 2022
7b1f694
Additional test case
oschwaldp-oci May 6, 2022
f23aaa6
Merge branch 'main' into enfs-78-pwo-rework-signal-handling
oschwaldp-oci May 6, 2022
b508216
Fix get_transaction_status error message
oschwaldp-oci May 6, 2022
0f4bc9e
Finish renaming effort from last_tracked_* to earliest_tracked_*
oschwaldp-oci May 6, 2022
5f4cc03
Also check for earliest_tracked_block_number
oschwaldp-oci May 6, 2022
3b7c2ec
Fix style issues.
oschwaldp-oci May 6, 2022
4399330
Fix comment
oschwaldp-oci May 6, 2022
9d87fcb
Remove signals_processor
oschwaldp-oci May 6, 2022
119ede4
Fixed merge conflict for Cluster.relaunch.
brianjohnson5972 May 9, 2022
bbb8297
Fixed logic error in Node.waitForProducer.
brianjohnson5972 May 10, 2022
6cd26bd
Fixes for PR comments.
brianjohnson5972 May 10, 2022
24f567b
Fixed code from copy and paste error.
brianjohnson5972 May 10, 2022
0e6a4cc
Fix undefined errorExit issue.
oschwaldp-oci May 10, 2022
5729394
Fixed test.
brianjohnson5972 May 11, 2022
97542b7
Merge branch 'main' into enfs-78-pwo-rework-signal-handling
brianjohnson5972 May 11, 2022
6f7052b
Import from subprocess
oschwaldp-oci May 11, 2022
db9a0a7
Fixes for PR comments.
brianjohnson5972 May 11, 2022
1d0353b
Fixed timeout calculation based on seconds rather than blocks.
brianjohnson5972 May 11, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions plugins/chain_api_plugin/chain_api_plugin.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ namespace {
try {
auto v = fc::json::from_string( body ).as<chain_apis::read_only::get_transaction_status_params>();
if( v.id == transaction_id_type() ) throw false;
return v;
} catch( ... ) {
EOS_THROW(chain::invalid_http_request, "Invalid transaction id");
}
Expand Down
44 changes: 19 additions & 25 deletions plugins/chain_interface/include/eosio/chain/signals_processor.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,66 +11,60 @@ namespace eosio::chain {
class signals_processor {
oschwaldp-oci marked this conversation as resolved.
Show resolved Hide resolved
public:
using trx_deque = eosio::chain::deque< std::tuple< chain::transaction_trace_ptr, packed_transaction_ptr > >;
using applied_transaction_func = std::function< void ( const trx_deque&, const chain::block_state_ptr& ) >;
using irreversible_block_func = std::function< void ( const chain::block_state_ptr& ) >;
using block_start_func = std::function< void ( uint32_t block_num ) >;
using irreversible_block_func = std::function< void ( const chain::block_state_ptr& ) >;
using block_start_func = std::function< void ( uint32_t block_num ) >;
using accepted_block_func = std::function< void ( const chain::block_state_ptr& ) >;
using applied_transaction_func = std::function< void ( const chain::transaction_trace_ptr&, const packed_transaction_ptr& ) >;

/**
* Class for tracking transactions and which block they belong to.
*/
signals_processor() {
}

void register_callbacks(applied_transaction_func at, irreversible_block_func ib, block_start_func bs) {
_callbacks.emplace_back(at, ib, bs);
void register_callbacks(irreversible_block_func ib, block_start_func bs, accepted_block_func ab, applied_transaction_func at) {
_callbacks.emplace_back(ib, bs, ab, at);
}

/// connect to chain controller applied_transaction signal
void signal_applied_transaction( const chain::transaction_trace_ptr& trace, const chain::packed_transaction_ptr& ptrx ) {
_trxs.emplace_back(trace, ptrx);
for(auto& callback : _callbacks) {
try {
std::get<applied_transaction_func>(callback)(trace, ptrx);
} FC_LOG_AND_DROP(("Failed to pass applied transaction to callback"));
}
}

/// connect to chain controller accepted_block signal
void signal_accepted_block( const chain::block_state_ptr& bsp ) {
push_transactions(bsp);
_block_started = false;
for(auto& callback : _callbacks) {
try {
std::get<2>(callback)(bsp);
} FC_LOG_AND_DROP(("Failed to pass accepted block to callback"));
}
}

/// connect to chain controller irreversible_block signal
void signal_irreversible_block( const chain::block_state_ptr& bsp ) {
for(auto& callback : _callbacks) {
try {
std::get<1>(callback)(bsp);
std::get<0>(callback)(bsp);
} FC_LOG_AND_DROP(("Failed to pass irreversible block to callback"));
}
}


/// connect to chain controller block_start signal
void signal_block_start( uint32_t block_num ) {
if (_block_started) {
push_transactions(chain::block_state_ptr{});
}
_block_started = true;
for(auto& callback : _callbacks) {
try {
std::get<2>(callback)(block_num);
std::get<block_start_func>(callback)(block_num);
} FC_LOG_AND_DROP(("Failed to pass block start to callback"));
}
}

private:
void push_transactions( const chain::block_state_ptr& bsp ) {
for(auto& callback : _callbacks) {
try {
std::get<0>(callback)(_trxs, bsp);
} FC_LOG_AND_DROP(("Failed to pass all transactions and block state to callback"));
}
_trxs.clear();
}
trx_deque _trxs;
eosio::chain::vector< std::tuple< applied_transaction_func, irreversible_block_func, block_start_func > > _callbacks;
bool _block_started = false;
eosio::chain::vector< std::tuple< irreversible_block_func, block_start_func, accepted_block_func, applied_transaction_func > > _callbacks;
};

} // eosio::chain
19 changes: 12 additions & 7 deletions plugins/chain_plugin/chain_plugin.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -791,14 +791,17 @@ void chain_plugin::plugin_initialize(const variables_map& options) {
my->_trx_signals_processor.emplace();
if (my->_trx_finality_status_processing) {
my->_trx_signals_processor->register_callbacks(
[this]( const chain::signals_processor::trx_deque& trxs, const chain::block_state_ptr& blk ) {
my->_trx_finality_status_processing->signal_applied_transactions(trxs, blk);
},
[this]( const chain::block_state_ptr& blk ) {
my->_trx_finality_status_processing->signal_irreversible_block(blk);
},
[this]( uint32_t block_num ) {
my->_trx_finality_status_processing->signal_block_start(block_num);
},
[this]( const chain::block_state_ptr& blk ) {
my->_trx_finality_status_processing->signal_accepted_block(blk);
},
[this]( const chain::transaction_trace_ptr& trace, const chain::packed_transaction_ptr& ptrx ) {
my->_trx_finality_status_processing->signal_applied_transaction(trace, ptrx);
}
);
}
Expand Down Expand Up @@ -1445,13 +1448,15 @@ read_only::get_transaction_status_results read_only::get_transaction_status(cons

trx_finality_status_processing::chain_state ch_state = trx_finality_status_proc->get_chain_state();

auto trx_st = trx_finality_status_proc->get_trx_state(param.id);
const auto trx_st = trx_finality_status_proc->get_trx_state(param.id);
// check if block_id is set to a valid value, since trx_finality_status_proc does not use optionals for the block data
const auto trx_block_valid = trx_st && trx_st->block_id != chain::block_id_type{};

return {
trx_st ? trx_st->status : "UNKNOWN",
trx_st ? std::optional<uint32_t>(chain::block_header::num_from_id(trx_st->block_id)) : std::optional<uint32_t>{},
trx_st ? std::optional<chain::block_id_type>(trx_st->block_id) : std::optional<chain::block_id_type>{},
trx_st ? std::optional<fc::time_point>(trx_st->block_timestamp) : std::optional<fc::time_point>{},
trx_block_valid ? std::optional<uint32_t>(chain::block_header::num_from_id(trx_st->block_id)) : std::optional<uint32_t>{},
trx_block_valid ? std::optional<chain::block_id_type>(trx_st->block_id) : std::optional<chain::block_id_type>{},
trx_block_valid ? std::optional<fc::time_point>(trx_st->block_timestamp) : std::optional<fc::time_point>{},
trx_st ? std::optional<fc::time_point_sec>(trx_st->expiration) : std::optional<fc::time_point_sec>{},
chain::block_header::num_from_id(ch_state.head_id),
ch_state.head_id,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,9 @@ namespace eosio::chain_apis {

~trx_finality_status_processing();

void signal_applied_transactions( const chain::signals_processor::trx_deque& trxs, const chain::block_state_ptr& bsp );
void signal_applied_transaction( const chain::transaction_trace_ptr& trace, const chain::packed_transaction_ptr& ptrx );

void signal_accepted_block( const chain::block_state_ptr& bsp );

void signal_irreversible_block( const chain::block_state_ptr& bsp );

Expand Down
6 changes: 0 additions & 6 deletions plugins/chain_plugin/test/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,6 @@ target_link_libraries( test_account_query_db chain_plugin eosio_testing)

add_test(NAME test_account_query_db COMMAND plugins/chain_plugin/test/test_account_query_db WORKING_DIRECTORY ${CMAKE_BINARY_DIR})

add_executable( test_signals_processor test_signals_processor.cpp )

target_link_libraries( test_signals_processor chain_plugin eosio_testing)

add_test(NAME test_signals_processor COMMAND plugins/chain_plugin/test/test_signals_processor WORKING_DIRECTORY ${CMAKE_BINARY_DIR})

add_executable( test_trx_retry_db test_trx_retry_db.cpp )

target_link_libraries( test_trx_retry_db chain_plugin eosio_testing)
Expand Down
Loading