Skip to content

Commit

Permalink
Merge branch 'main' into http_max_inflight_reqs
Browse files Browse the repository at this point in the history
  • Loading branch information
linh2931 authored Jun 30, 2022
2 parents c0d4b9e + 2d10053 commit b826fc2
Show file tree
Hide file tree
Showing 23 changed files with 611 additions and 295 deletions.
2 changes: 1 addition & 1 deletion libraries/appbase
Submodule appbase updated 1 files
+2 −2 version.cmake.in
84 changes: 43 additions & 41 deletions libraries/chain/apply_context.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -72,51 +72,53 @@ void apply_context::exec_one()
try {
action_return_value.clear();
receiver_account = &db.get<account_metadata_object,by_name>( receiver );
privileged = receiver_account->is_privileged();
auto native = control.find_apply_handler( receiver, act->account, act->name );
if( native ) {
if( trx_context.enforce_whiteblacklist && control.is_producing_block() ) {
control.check_contract_list( receiver );
control.check_action_list( act->account, act->name );
if( !(context_free && control.skip_trx_checks()) ) {
privileged = receiver_account->is_privileged();
auto native = control.find_apply_handler( receiver, act->account, act->name );
if( native ) {
if( trx_context.enforce_whiteblacklist && control.is_producing_block() ) {
control.check_contract_list( receiver );
control.check_action_list( act->account, act->name );
}
(*native)( *this );
}
(*native)( *this );
}

if( ( receiver_account->code_hash != digest_type() ) &&
( !( act->account == config::system_account_name
&& act->name == "setcode"_n
&& receiver == config::system_account_name )
|| control.is_builtin_activated( builtin_protocol_feature_t::forward_setcode )
)
) {
if( trx_context.enforce_whiteblacklist && control.is_producing_block() ) {
control.check_contract_list( receiver );
control.check_action_list( act->account, act->name );
if( ( receiver_account->code_hash != digest_type() ) &&
( !( act->account == config::system_account_name
&& act->name == "setcode"_n
&& receiver == config::system_account_name )
|| control.is_builtin_activated( builtin_protocol_feature_t::forward_setcode )
)
) {
if( trx_context.enforce_whiteblacklist && control.is_producing_block() ) {
control.check_contract_list( receiver );
control.check_action_list( act->account, act->name );
}
try {
control.get_wasm_interface().apply( receiver_account->code_hash, receiver_account->vm_type, receiver_account->vm_version, *this );
} catch( const wasm_exit& ) {}
}
try {
control.get_wasm_interface().apply( receiver_account->code_hash, receiver_account->vm_type, receiver_account->vm_version, *this );
} catch( const wasm_exit& ) {}
}

if( !privileged && control.is_builtin_activated( builtin_protocol_feature_t::ram_restrictions ) ) {
const size_t checktime_interval = 10;
size_t counter = 0;
bool not_in_notify_context = (receiver == act->account);
const auto end = _account_ram_deltas.end();
for( auto itr = _account_ram_deltas.begin(); itr != end; ++itr, ++counter ) {
if( counter == checktime_interval ) {
trx_context.checktime();
counter = 0;
}
if( itr->delta > 0 && itr->account != receiver ) {
EOS_ASSERT( not_in_notify_context, unauthorized_ram_usage_increase,
"unprivileged contract cannot increase RAM usage of another account within a notify context: ${account}",
("account", itr->account)
);
EOS_ASSERT( has_authorization( itr->account ), unauthorized_ram_usage_increase,
"unprivileged contract cannot increase RAM usage of another account that has not authorized the action: ${account}",
("account", itr->account)
);
if( !privileged && control.is_builtin_activated( builtin_protocol_feature_t::ram_restrictions ) ) {
const size_t checktime_interval = 10;
size_t counter = 0;
bool not_in_notify_context = (receiver == act->account);
const auto end = _account_ram_deltas.end();
for( auto itr = _account_ram_deltas.begin(); itr != end; ++itr, ++counter ) {
if( counter == checktime_interval ) {
trx_context.checktime();
counter = 0;
}
if( itr->delta > 0 && itr->account != receiver ) {
EOS_ASSERT( not_in_notify_context, unauthorized_ram_usage_increase,
"unprivileged contract cannot increase RAM usage of another account within a notify context: ${account}",
("account", itr->account)
);
EOS_ASSERT( has_authorization( itr->account ), unauthorized_ram_usage_increase,
"unprivileged contract cannot increase RAM usage of another account that has not authorized the action: ${account}",
("account", itr->account)
);
}
}
}
}
Expand Down
44 changes: 30 additions & 14 deletions libraries/chain/controller.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -408,7 +408,8 @@ struct controller_impl {

for( auto bitr = branch.rbegin(); bitr != branch.rend(); ++bitr ) {
if( read_mode == db_read_mode::IRREVERSIBLE ) {
apply_block( *bitr, controller::block_status::complete, trx_meta_cache_lookup{} );
controller::block_report br;
apply_block( br, *bitr, controller::block_status::complete, trx_meta_cache_lookup{} );
head = (*bitr);
fork_db.mark_valid( head );
}
Expand Down Expand Up @@ -709,7 +710,8 @@ struct controller_impl {
pending_head = fork_db.pending_head()
) {
wlog( "applying branch from fork database ending with block: ${id}", ("id", pending_head->id) );
maybe_switch_forks( pending_head, controller::block_status::complete, forked_branch_callback{}, trx_meta_cache_lookup{} );
controller::block_report br;
maybe_switch_forks( br, pending_head, controller::block_status::complete, forked_branch_callback{}, trx_meta_cache_lookup{} );
}
}
}
Expand Down Expand Up @@ -1937,9 +1939,11 @@ struct controller_impl {
}


void apply_block( const block_state_ptr& bsp, controller::block_status s, const trx_meta_cache_lookup& trx_lookup )
void apply_block( controller::block_report& br, const block_state_ptr& bsp, controller::block_status s,
const trx_meta_cache_lookup& trx_lookup )
{ try {
try {
auto start = fc::time_point::now();
const signed_block_ptr& b = bsp->block;
const auto& new_protocol_feature_activations = bsp->get_new_protocol_feature_activations();

Expand Down Expand Up @@ -2015,6 +2019,12 @@ struct controller_impl {
EOS_ASSERT( r == static_cast<const transaction_receipt_header&>(receipt),
block_validate_exception, "receipt does not match, ${lhs} != ${rhs}",
("lhs", r)("rhs", static_cast<const transaction_receipt_header&>(receipt)) );

if( trace ) {
br.total_net_usage += trace->net_usage;
if( trace->receipt ) br.total_cpu_usage_us += trace->receipt->cpu_usage_us;
br.total_elapsed_time += trace->elapsed;
}
}

// validated in create_block_state_future()
Expand All @@ -2039,6 +2049,7 @@ struct controller_impl {
pending->_block_stage = completed_block{ bsp };

commit_block(false);
br.total_time = fc::time_point::now() - start;
return;
} catch ( const std::bad_alloc& ) {
throw;
Expand Down Expand Up @@ -2090,7 +2101,8 @@ struct controller_impl {
} );
}

void push_block( std::future<block_state_ptr>& block_state_future,
void push_block( controller::block_report& br,
std::future<block_state_ptr>& block_state_future,
const forked_branch_callback& forked_branch_cb, const trx_meta_cache_lookup& trx_lookup )
{
controller::block_status s = controller::block_status::complete;
Expand Down Expand Up @@ -2120,7 +2132,7 @@ struct controller_impl {
emit( self.accepted_block_header, bsp );

if( read_mode != db_read_mode::IRREVERSIBLE ) {
maybe_switch_forks( fork_db.pending_head(), s, forked_branch_cb, trx_lookup );
maybe_switch_forks( br, fork_db.pending_head(), s, forked_branch_cb, trx_lookup );
} else {
log_irreversible();
}
Expand Down Expand Up @@ -2164,8 +2176,9 @@ struct controller_impl {

emit( self.accepted_block_header, bsp );

controller::block_report br;
if( s == controller::block_status::irreversible ) {
apply_block( bsp, s, trx_meta_cache_lookup{} );
apply_block( br, bsp, s, trx_meta_cache_lookup{} );
head = bsp;

// On replay, log_irreversible is not called and so no irreversible_block signal is emitted.
Expand All @@ -2179,19 +2192,19 @@ struct controller_impl {
} else {
EOS_ASSERT( read_mode != db_read_mode::IRREVERSIBLE, block_validate_exception,
"invariant failure: cannot replay reversible blocks while in irreversible mode" );
maybe_switch_forks( bsp, s, forked_branch_callback{}, trx_meta_cache_lookup{} );
maybe_switch_forks( br, bsp, s, forked_branch_callback{}, trx_meta_cache_lookup{} );
}

} FC_LOG_AND_RETHROW( )
}

void maybe_switch_forks( const block_state_ptr& new_head, controller::block_status s,
void maybe_switch_forks( controller::block_report& br, const block_state_ptr& new_head, controller::block_status s,
const forked_branch_callback& forked_branch_cb, const trx_meta_cache_lookup& trx_lookup )
{
bool head_changed = true;
if( new_head->header.previous == head->id ) {
try {
apply_block( new_head, s, trx_lookup );
apply_block( br, new_head, s, trx_lookup );
fork_db.mark_valid( new_head );
head = new_head;
} catch ( const std::exception& e ) {
Expand Down Expand Up @@ -2222,8 +2235,9 @@ struct controller_impl {
for( auto ritr = branches.first.rbegin(); ritr != branches.first.rend(); ++ritr ) {
auto except = std::exception_ptr{};
try {
apply_block( *ritr, (*ritr)->is_valid() ? controller::block_status::validated
: controller::block_status::complete, trx_lookup );
br = controller::block_report{};
apply_block( br, *ritr, (*ritr)->is_valid() ? controller::block_status::validated
: controller::block_status::complete, trx_lookup );
fork_db.mark_valid( *ritr );
head = *ritr;
} catch ( const std::bad_alloc& ) {
Expand Down Expand Up @@ -2254,7 +2268,8 @@ struct controller_impl {

// re-apply good blocks
for( auto ritr = branches.second.rbegin(); ritr != branches.second.rend(); ++ritr ) {
apply_block( *ritr, controller::block_status::validated /* we previously validated these blocks*/, trx_lookup );
br = controller::block_report{};
apply_block( br, *ritr, controller::block_status::validated /* we previously validated these blocks*/, trx_lookup );
head = *ritr;
}
std::rethrow_exception(except);
Expand Down Expand Up @@ -2813,11 +2828,12 @@ std::future<block_state_ptr> controller::create_block_state_future( const block_
return my->create_block_state_future( id, b );
}

void controller::push_block( std::future<block_state_ptr>& block_state_future,
void controller::push_block( controller::block_report& br,
std::future<block_state_ptr>& block_state_future,
const forked_branch_callback& forked_branch_cb, const trx_meta_cache_lookup& trx_lookup )
{
validate_db_available_size();
my->push_block( block_state_future, forked_branch_cb, trx_lookup );
my->push_block( br, block_state_future, forked_branch_cb, trx_lookup );
}

transaction_trace_ptr controller::push_transaction( const transaction_metadata_ptr& trx,
Expand Down
10 changes: 9 additions & 1 deletion libraries/chain/include/eosio/chain/controller.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -170,12 +170,20 @@ namespace eosio { namespace chain {

std::future<block_state_ptr> create_block_state_future( const block_id_type& id, const signed_block_ptr& b );

struct block_report {
size_t total_net_usage = 0;
size_t total_cpu_usage_us = 0;
fc::microseconds total_elapsed_time{};
fc::microseconds total_time{};
};
/**
* @param br returns statistics for block
* @param block_state_future provide from call to create_block_state_future
* @param cb calls cb with forked applied transactions for each forked block
* @param trx_lookup user provided lookup function for externally cached transaction_metadata
*/
void push_block( std::future<block_state_ptr>& block_state_future,
void push_block( block_report& br,
std::future<block_state_ptr>& block_state_future,
const forked_branch_callback& cb,
const trx_meta_cache_lookup& trx_lookup );

Expand Down
14 changes: 8 additions & 6 deletions libraries/chain/transaction_context.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -723,12 +723,14 @@ namespace eosio { namespace chain {
const auto& db = control.db();
const auto& auth_manager = control.get_authorization_manager();

for( const auto& a : trx.context_free_actions ) {
auto* code = db.find<account_object, by_name>(a.account);
EOS_ASSERT( code != nullptr, transaction_exception,
"action's code account '${account}' does not exist", ("account", a.account) );
EOS_ASSERT( a.authorization.size() == 0, transaction_exception,
"context-free actions cannot have authorizations" );
if( !trx.context_free_actions.empty() && !control.skip_trx_checks() ) {
for( const auto& a : trx.context_free_actions ) {
auto* code = db.find<account_object, by_name>( a.account );
EOS_ASSERT( code != nullptr, transaction_exception,
"action's code account '${account}' does not exist", ("account", a.account) );
EOS_ASSERT( a.authorization.size() == 0, transaction_exception,
"context-free actions cannot have authorizations" );
}
}

flat_set<account_name> actors;
Expand Down
9 changes: 6 additions & 3 deletions libraries/testing/include/eosio/testing/tester.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -597,7 +597,8 @@ namespace eosio { namespace testing {
signed_block_ptr produce_block( fc::microseconds skip_time = fc::milliseconds(config::block_interval_ms) )override {
auto sb = _produce_block(skip_time, false);
auto bsf = validating_node->create_block_state_future( sb->calculate_id(), sb );
validating_node->push_block( bsf, forked_branch_callback{}, trx_meta_cache_lookup{} );
controller::block_report br;
validating_node->push_block( br, bsf, forked_branch_callback{}, trx_meta_cache_lookup{} );

return sb;
}
Expand All @@ -608,14 +609,16 @@ namespace eosio { namespace testing {

void validate_push_block(const signed_block_ptr& sb) {
auto bs = validating_node->create_block_state_future( sb->calculate_id(), sb );
validating_node->push_block( bs, forked_branch_callback{}, trx_meta_cache_lookup{} );
controller::block_report br;
validating_node->push_block( br, bs, forked_branch_callback{}, trx_meta_cache_lookup{} );
}

signed_block_ptr produce_empty_block( fc::microseconds skip_time = fc::milliseconds(config::block_interval_ms) )override {
unapplied_transactions.add_aborted( control->abort_block() );
auto sb = _produce_block(skip_time, true);
auto bsf = validating_node->create_block_state_future( sb->calculate_id(), sb );
validating_node->push_block( bsf, forked_branch_callback{}, trx_meta_cache_lookup{} );
controller::block_report br;
validating_node->push_block( br, bsf, forked_branch_callback{}, trx_meta_cache_lookup{} );

return sb;
}
Expand Down
6 changes: 4 additions & 2 deletions libraries/testing/tester.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -322,7 +322,8 @@ namespace eosio { namespace testing {
void base_tester::push_block(signed_block_ptr b) {
auto bsf = control->create_block_state_future(b->calculate_id(), b);
unapplied_transactions.add_aborted( control->abort_block() );
control->push_block( bsf, [this]( const branch_type& forked_branch ) {
controller::block_report br;
control->push_block( br, bsf, [this]( const branch_type& forked_branch ) {
unapplied_transactions.add_forked( forked_branch );
}, [this]( const transaction_id_type& id ) {
return unapplied_transactions.get_trx( id );
Expand Down Expand Up @@ -1050,7 +1051,8 @@ namespace eosio { namespace testing {
if( block ) { //&& !b.control->is_known_block(block->id()) ) {
auto bsf = b.control->create_block_state_future( block->calculate_id(), block );
b.control->abort_block();
b.control->push_block(bsf, forked_branch_callback{}, trx_meta_cache_lookup{}); //, eosio::chain::validation_steps::created_block);
controller::block_report br;
b.control->push_block(br, bsf, forked_branch_callback{}, trx_meta_cache_lookup{}); //, eosio::chain::validation_steps::created_block);
}
}
};
Expand Down
Loading

0 comments on commit b826fc2

Please sign in to comment.