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

Fix RC Start Hang #3598

Open
wants to merge 5 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 2 commits
Commits
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 libraries/plugins/apis/rc_api/rc_api.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@ DEFINE_API_IMPL( rc_api_impl, find_rc_accounts )
api_rc_account.rc_manabar = rc_account->rc_manabar;
api_rc_account.max_rc_creation_adjustment = rc_account->max_rc_creation_adjustment;
api_rc_account.max_rc = get_maximum_rc( account, *rc_account );
api_rc_account.rc_manabar.current_mana = std::min( api_rc_account.rc_manabar.current_mana, api_rc_account.max_rc );

result.rc_accounts.emplace_back( api_rc_account );
}
Expand Down
110 changes: 92 additions & 18 deletions libraries/plugins/rc/rc_plugin.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ class rc_plugin_impl

bool before_first_block()
{
return (_db.count< rc_account_object >() == 0);
return (_db.count< rc_resource_param_object >() == 0);
}

database& _db;
Expand Down Expand Up @@ -155,7 +155,11 @@ void create_rc_account( database& db, uint32_t now, const account_object& accoun
rca.rc_manabar.last_update_time = now;
rca.max_rc_creation_adjustment = max_rc_creation_adjustment;
int64_t max_rc = get_maximum_rc( account, rca );
rca.rc_manabar.current_mana = max_rc;

// The first time the rc account's mana is regenerated, it will be
// capped to the actual max value. This allows creating account's
// in the past and not begin tracking RCs until later (Issue #3589)
rca.rc_manabar.current_mana = std::numeric_limits< int64_t >::max();
rca.last_max_rc = max_rc;

rca.indel_slots[ STEEM_RC_CREATOR_SLOT_NUM ] = creator;
Expand Down Expand Up @@ -611,7 +615,6 @@ void rc_plugin_impl::on_first_block()
fc::variant resource_params_var = fc::json::from_string( resource_params_json, fc::json::strict_parser );
std::vector< std::pair< fc::variant, std::pair< fc::variant_object, fc::variant_object > > > resource_params_pairs;
fc::from_variant( resource_params_var, resource_params_pairs );
fc::time_point_sec now = _db.get_dynamic_global_properties().time;

_db.create< rc_resource_param_object >(
[&]( rc_resource_param_object& params_obj )
Expand Down Expand Up @@ -641,12 +644,6 @@ void rc_plugin_impl::on_first_block()
ilog( "Genesis pool_obj is ${o}", ("o", pool_obj) );
} );

const auto& idx = _db.get_index< account_index >().indices().get< by_id >();
for( auto it=idx.begin(); it!=idx.end(); ++it )
{
create_rc_account( _db, now.sec_since_epoch(), *it, asset( STEEM_HISTORICAL_ACCOUNT_CREATION_ADJUSTMENT, VESTS_SYMBOL ), it->name );
}

return;
}

Expand Down Expand Up @@ -709,7 +706,8 @@ struct pre_apply_operation_visitor

try {

if( mbparams.max_mana != rc_account.last_max_rc )
// current_mana == numeric_limits< int64_t >::max() is a unique case for an newly created account
if( mbparams.max_mana != rc_account.last_max_rc && rc_account.rc_manabar.current_mana != std::numeric_limits< int64_t >::max() )
{
if( !_skip.skip_reject_unknown_delta_vests )
{
Expand Down Expand Up @@ -913,14 +911,16 @@ struct post_apply_operation_visitor
uint32_t _current_time = 0;
uint32_t _current_block_number = 0;
account_name_type _current_witness;
bool _before_first_block = false;

post_apply_operation_visitor(
vector< account_regen_info >& ma,
database& db,
uint32_t t,
uint32_t b,
account_name_type w
) : _mod_accounts(ma), _db(db), _current_time(t), _current_block_number(b), _current_witness(w)
account_name_type w,
bool bfb = false
) : _mod_accounts(ma), _db(db), _current_time(t), _current_block_number(b), _current_witness(w), _before_first_block(bfb)
{}

void update_outdel_overflow( const account_name_type& account, const asset& amount ) const
Expand Down Expand Up @@ -1021,6 +1021,10 @@ struct post_apply_operation_visitor
{
// ilog( "handling post-apply pow_operation" );
create_rc_account< true >( _db, _current_time, op.worker_account, asset( 0, STEEM_SYMBOL ), op.worker_account );

if( _before_first_block )
return;

_mod_accounts.emplace_back( op.worker_account );
_mod_accounts.emplace_back( _current_witness );
}
Expand All @@ -1029,25 +1033,37 @@ struct post_apply_operation_visitor
{
auto worker_name = get_worker_name( op.work );
create_rc_account< true >( _db, _current_time, worker_name, asset( 0, STEEM_SYMBOL ), worker_name );

if( _before_first_block )
return;

_mod_accounts.emplace_back( worker_name );
_mod_accounts.emplace_back( _current_witness );
}

void operator()( const transfer_to_vesting_operation& op )
{
if( _before_first_block )
return;
account_name_type target = op.to.size() ? op.to : op.from;
_mod_accounts.emplace_back( target );
}

void operator()( const withdraw_vesting_operation& op )const
{
if( _before_first_block )
return;

_mod_accounts.emplace_back( op.account, false );

update_outdel_overflow( op.account, op.vesting_shares );
}

void operator()( const delegate_vesting_shares_operation& op )const
{
if( _before_first_block )
return;

_mod_accounts.emplace_back( op.delegator );
_mod_accounts.emplace_back( op.delegatee );

Expand All @@ -1057,22 +1073,34 @@ struct post_apply_operation_visitor

void operator()( const author_reward_operation& op )const
{
if( _before_first_block )
return;

_mod_accounts.emplace_back( op.author );
}

void operator()( const curation_reward_operation& op )const
{
if( _before_first_block )
return;

_mod_accounts.emplace_back( op.curator );
}

// Is this one actually necessary?
void operator()( const comment_reward_operation& op )const
{
if( _before_first_block )
return;

_mod_accounts.emplace_back( op.author );
}

void operator()( const fill_vesting_withdraw_operation& op )const
{
if( _before_first_block )
return;

_mod_accounts.emplace_back( op.from_account );
_mod_accounts.emplace_back( op.to_account );

Expand All @@ -1081,27 +1109,42 @@ struct post_apply_operation_visitor

void operator()( const claim_reward_balance_operation& op )const
{
if( _before_first_block )
return;

_mod_accounts.emplace_back( op.account );
}

void operator()( const claim_reward_balance2_operation& op )const
{
if( _before_first_block )
return;

_mod_accounts.emplace_back( op.account );
}

void operator()( const smt_contributor_payout_action& op )const
{
if( _before_first_block )
return;

_mod_accounts.emplace_back( op.contributor );
}

void operator()( const smt_founder_payout_action& op )const
{
if( _before_first_block )
return;

for ( auto& e : op.account_payouts )
_mod_accounts.emplace_back( e.first );
}

void operator()( const hardfork_operation& op )const
{
if( _before_first_block )
return;

if( op.hardfork_id == STEEM_HARDFORK_0_1 )
{
const auto& idx = _db.get_index< account_index >().indices().get< by_id >();
Expand Down Expand Up @@ -1129,42 +1172,66 @@ struct post_apply_operation_visitor

void operator()( const return_vesting_delegation_operation& op )const
{
if( _before_first_block )
return;

_mod_accounts.emplace_back( op.account );
}

void operator()( const comment_benefactor_reward_operation& op )const
{
if( _before_first_block )
return;

_mod_accounts.emplace_back( op.benefactor );
}

void operator()( const producer_reward_operation& op )const
{
if( _before_first_block )
return;

_mod_accounts.emplace_back( op.producer );
}

void operator()( const clear_null_account_balance_operation& op )const
{
if( _before_first_block )
return;

_mod_accounts.emplace_back( STEEM_NULL_ACCOUNT );
}

void operator()( const create_proposal_operation& op )const
{
if( _before_first_block )
return;

_mod_accounts.emplace_back( op.creator );
_mod_accounts.emplace_back( op.receiver );
}

void operator()( const update_proposal_votes_operation& op )const
{
if( _before_first_block )
return;

_mod_accounts.emplace_back( op.voter );
}

void operator()( const remove_proposal_operation& op )const
{
if( _before_first_block )
return;

_mod_accounts.emplace_back( op.proposal_owner );
}

void operator()( const delegate_to_pool_operation& op )const
{
if( _before_first_block )
return;

_mod_accounts.emplace_back( op.from_account );
}

Expand All @@ -1180,7 +1247,11 @@ struct post_apply_operation_visitor
rca.rc_manabar.last_update_time = now;
rca.max_rc_creation_adjustment = asset( 0, STEEM_SYMBOL );
int64_t max_rc = 0;
rca.rc_manabar.current_mana = max_rc;

// The first time the rc account's mana is regenerated, it will be
// capped to the actual max value. This allows creating account's
// in the past and not begin tracking RCs until later (Issue #3589)
rca.rc_manabar.current_mana = std::numeric_limits< int64_t >::max();
rca.last_max_rc = max_rc;

rca.indel_slots[ STEEM_RC_CREATOR_SLOT_NUM ] = nai;
Expand Down Expand Up @@ -1303,24 +1374,27 @@ void rc_plugin_impl::on_post_apply_required_action( const required_action_notifi

void rc_plugin_impl::on_post_apply_operation( const operation_notification& note )
{ try {
if( before_first_block() )
return;

const dynamic_global_property_object& gpo = _db.get_dynamic_global_properties();
const uint32_t now = gpo.time.sec_since_epoch();

vector< account_regen_info > modified_accounts;

// ilog( "Calling post-vtor on ${op}", ("op", note.op) );
post_apply_operation_visitor vtor( modified_accounts, _db, now, gpo.head_block_number, gpo.current_witness );
post_apply_operation_visitor vtor( modified_accounts, _db, now, gpo.head_block_number, gpo.current_witness, before_first_block() );
note.op.visit( vtor );

if( before_first_block() )
return;

update_modified_accounts( _db, modified_accounts );
} FC_CAPTURE_AND_RETHROW( (note.op) ) }

template< typename OpType >
void rc_plugin_impl::post_apply_custom_op_type( const custom_operation_notification& note )
{
if( before_first_block() )
return;

const OpType* op = note.maybe_get_op< OpType >();
if( !op )
return;
Expand All @@ -1331,7 +1405,7 @@ void rc_plugin_impl::post_apply_custom_op_type( const custom_operation_notificat
vector< account_regen_info > modified_accounts;

// ilog( "Calling post-vtor on ${op}", ("op", note.op) );
post_apply_operation_visitor vtor( modified_accounts, _db, now, gpo.head_block_number, gpo.current_witness );
post_apply_operation_visitor vtor( modified_accounts, _db, now, gpo.head_block_number, gpo.current_witness, false );
op->visit( vtor );

update_modified_accounts( _db, modified_accounts );
Expand Down