scheduler: Refactor 26007bb655 to use witness_schedule_object
The functionality is equivalent, but it now uses a separate witness_schedule_object, and the code now lives in db_witness_schedule.cpp.
This commit is contained in:
parent
7237ef618f
commit
f7980f5252
8 changed files with 100 additions and 41 deletions
|
|
@ -292,6 +292,7 @@ namespace graphene { namespace app {
|
||||||
} case impl_block_summary_object_type:{
|
} case impl_block_summary_object_type:{
|
||||||
} case impl_account_transaction_history_object_type:{
|
} case impl_account_transaction_history_object_type:{
|
||||||
} case impl_chain_property_object_type: {
|
} case impl_chain_property_object_type: {
|
||||||
|
} case impl_witness_schedule_object_type: {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -485,7 +485,7 @@ void database::_apply_block( const signed_block& next_block )
|
||||||
// update_global_dynamic_data() as perhaps these methods only need
|
// update_global_dynamic_data() as perhaps these methods only need
|
||||||
// to be called for header validation?
|
// to be called for header validation?
|
||||||
update_maintenance_flag( maint_needed );
|
update_maintenance_flag( maint_needed );
|
||||||
shuffle_witnesses();
|
update_witness_schedule();
|
||||||
|
|
||||||
// notify observers that the block has been applied
|
// notify observers that the block has been applied
|
||||||
applied_block( next_block ); //emit
|
applied_block( next_block ); //emit
|
||||||
|
|
@ -494,37 +494,6 @@ void database::_apply_block( const signed_block& next_block )
|
||||||
notify_changed_objects();
|
notify_changed_objects();
|
||||||
} FC_CAPTURE_AND_RETHROW( (next_block.block_num()) ) }
|
} FC_CAPTURE_AND_RETHROW( (next_block.block_num()) ) }
|
||||||
|
|
||||||
void database::shuffle_witnesses() {
|
|
||||||
const auto& dgp = get_global_properties();
|
|
||||||
if( head_block_num() % dgp.active_witnesses.size() == 0 ) {
|
|
||||||
modify( dgp, [&]( global_property_object& props ) {
|
|
||||||
props.current_shuffled_witnesses.clear();
|
|
||||||
props.current_shuffled_witnesses.reserve( props.active_witnesses.size() );
|
|
||||||
|
|
||||||
for( auto w : props.active_witnesses )
|
|
||||||
props.current_shuffled_witnesses.push_back(w);
|
|
||||||
|
|
||||||
auto now_hi = uint64_t(head_block_time().sec_since_epoch()) << 32;
|
|
||||||
for( uint32_t i = 0; i < props.current_shuffled_witnesses.size(); ++i )
|
|
||||||
{
|
|
||||||
/// High performance random generator
|
|
||||||
/// http://xorshift.di.unimi.it/
|
|
||||||
uint64_t k = now_hi + uint64_t(i)*2685821657736338717ULL;
|
|
||||||
k ^= (k >> 12);
|
|
||||||
k ^= (k << 25);
|
|
||||||
k ^= (k >> 27);
|
|
||||||
k *= 2685821657736338717ULL;
|
|
||||||
|
|
||||||
uint32_t jmax = props.current_shuffled_witnesses.size() - i;
|
|
||||||
uint32_t j = i + k%jmax;
|
|
||||||
std::swap( props.current_shuffled_witnesses[i],
|
|
||||||
props.current_shuffled_witnesses[j] );
|
|
||||||
}
|
|
||||||
// edump( (props.current_shuffled_witnesses) );
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void database::notify_changed_objects()
|
void database::notify_changed_objects()
|
||||||
{ try {
|
{ try {
|
||||||
if( _undo_db.enabled() )
|
if( _undo_db.enabled() )
|
||||||
|
|
|
||||||
|
|
@ -30,6 +30,7 @@
|
||||||
#include <graphene/chain/vesting_balance_object.hpp>
|
#include <graphene/chain/vesting_balance_object.hpp>
|
||||||
#include <graphene/chain/withdraw_permission_object.hpp>
|
#include <graphene/chain/withdraw_permission_object.hpp>
|
||||||
#include <graphene/chain/witness_object.hpp>
|
#include <graphene/chain/witness_object.hpp>
|
||||||
|
#include <graphene/chain/witness_schedule_object.hpp>
|
||||||
|
|
||||||
#include <graphene/chain/account_evaluator.hpp>
|
#include <graphene/chain/account_evaluator.hpp>
|
||||||
#include <graphene/chain/asset_evaluator.hpp>
|
#include <graphene/chain/asset_evaluator.hpp>
|
||||||
|
|
@ -192,6 +193,7 @@ void database::initialize_indexes()
|
||||||
add_index< primary_index<simple_index<asset_dynamic_data_object >> >();
|
add_index< primary_index<simple_index<asset_dynamic_data_object >> >();
|
||||||
add_index< primary_index<flat_index< block_summary_object >> >();
|
add_index< primary_index<flat_index< block_summary_object >> >();
|
||||||
add_index< primary_index<simple_index<chain_property_object > > >();
|
add_index< primary_index<simple_index<chain_property_object > > >();
|
||||||
|
add_index< primary_index<simple_index<witness_schedule_object > > >();
|
||||||
}
|
}
|
||||||
|
|
||||||
void database::init_genesis(const genesis_state_type& genesis_state)
|
void database::init_genesis(const genesis_state_type& genesis_state)
|
||||||
|
|
@ -592,7 +594,6 @@ void database::init_genesis(const genesis_state_type& genesis_state)
|
||||||
{
|
{
|
||||||
p.active_witnesses.insert(i);
|
p.active_witnesses.insert(i);
|
||||||
p.witness_accounts.insert(get(witness_id_type(i)).witness_account);
|
p.witness_accounts.insert(get(witness_id_type(i)).witness_account);
|
||||||
p.current_shuffled_witnesses.push_back( witness_id_type(i) );
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
@ -601,6 +602,13 @@ void database::init_genesis(const genesis_state_type& genesis_state)
|
||||||
p.parameters.current_fees = genesis_state.initial_parameters.current_fees;
|
p.parameters.current_fees = genesis_state.initial_parameters.current_fees;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Create witness scheduler
|
||||||
|
create<witness_schedule_object>([&]( witness_schedule_object& wso )
|
||||||
|
{
|
||||||
|
for( const witness_id_type& wid : get_global_properties().active_witnesses )
|
||||||
|
wso.current_shuffled_witnesses.push_back( wid );
|
||||||
|
});
|
||||||
|
|
||||||
_undo_db.enable();
|
_undo_db.enable();
|
||||||
} FC_CAPTURE_AND_RETHROW() }
|
} FC_CAPTURE_AND_RETHROW() }
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,7 @@
|
||||||
#include <graphene/chain/database.hpp>
|
#include <graphene/chain/database.hpp>
|
||||||
#include <graphene/chain/global_property_object.hpp>
|
#include <graphene/chain/global_property_object.hpp>
|
||||||
#include <graphene/chain/witness_object.hpp>
|
#include <graphene/chain/witness_object.hpp>
|
||||||
|
#include <graphene/chain/witness_schedule_object.hpp>
|
||||||
|
|
||||||
namespace graphene { namespace chain {
|
namespace graphene { namespace chain {
|
||||||
|
|
||||||
|
|
@ -27,10 +28,10 @@ using boost::container::flat_set;
|
||||||
|
|
||||||
witness_id_type database::get_scheduled_witness( uint32_t slot_num )const
|
witness_id_type database::get_scheduled_witness( uint32_t slot_num )const
|
||||||
{
|
{
|
||||||
const auto& dgp = get_dynamic_global_properties();
|
const dynamic_global_property_object& dpo = get_dynamic_global_properties();
|
||||||
const auto& gp = get_global_properties();
|
const witness_schedule_object& wso = witness_schedule_id_type()(*this);
|
||||||
auto current_aslot = dgp.current_aslot + slot_num;
|
uint64_t current_aslot = dpo.current_aslot + slot_num;
|
||||||
return gp.current_shuffled_witnesses[current_aslot%gp.current_shuffled_witnesses.size()];
|
return wso.current_shuffled_witnesses[ current_aslot % wso.current_shuffled_witnesses.size() ];
|
||||||
}
|
}
|
||||||
|
|
||||||
fc::time_point_sec database::get_slot_time(uint32_t slot_num)const
|
fc::time_point_sec database::get_slot_time(uint32_t slot_num)const
|
||||||
|
|
@ -81,4 +82,39 @@ uint32_t database::witness_participation_rate()const
|
||||||
return uint64_t(GRAPHENE_100_PERCENT) * dpo.recent_slots_filled.popcount() / 128;
|
return uint64_t(GRAPHENE_100_PERCENT) * dpo.recent_slots_filled.popcount() / 128;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void database::update_witness_schedule()
|
||||||
|
{
|
||||||
|
const witness_schedule_object& wso = witness_schedule_id_type()(*this);
|
||||||
|
const global_property_object& gpo = get_global_properties();
|
||||||
|
|
||||||
|
if( head_block_num() % gpo.active_witnesses.size() == 0 )
|
||||||
|
{
|
||||||
|
modify( wso, [&]( witness_schedule_object& _wso )
|
||||||
|
{
|
||||||
|
_wso.current_shuffled_witnesses.clear();
|
||||||
|
_wso.current_shuffled_witnesses.reserve( gpo.active_witnesses.size() );
|
||||||
|
|
||||||
|
for( const witness_id_type& w : gpo.active_witnesses )
|
||||||
|
_wso.current_shuffled_witnesses.push_back( w );
|
||||||
|
|
||||||
|
auto now_hi = uint64_t(head_block_time().sec_since_epoch()) << 32;
|
||||||
|
for( uint32_t i = 0; i < _wso.current_shuffled_witnesses.size(); ++i )
|
||||||
|
{
|
||||||
|
/// High performance random generator
|
||||||
|
/// http://xorshift.di.unimi.it/
|
||||||
|
uint64_t k = now_hi + uint64_t(i)*2685821657736338717ULL;
|
||||||
|
k ^= (k >> 12);
|
||||||
|
k ^= (k << 25);
|
||||||
|
k ^= (k >> 27);
|
||||||
|
k *= 2685821657736338717ULL;
|
||||||
|
|
||||||
|
uint32_t jmax = _wso.current_shuffled_witnesses.size() - i;
|
||||||
|
uint32_t j = i + k%jmax;
|
||||||
|
std::swap( _wso.current_shuffled_witnesses[i],
|
||||||
|
_wso.current_shuffled_witnesses[j] );
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
} }
|
} }
|
||||||
|
|
|
||||||
|
|
@ -227,6 +227,8 @@ namespace graphene { namespace chain {
|
||||||
*/
|
*/
|
||||||
uint32_t get_slot_at_time(fc::time_point_sec when)const;
|
uint32_t get_slot_at_time(fc::time_point_sec when)const;
|
||||||
|
|
||||||
|
void update_witness_schedule();
|
||||||
|
|
||||||
//////////////////// db_getter.cpp ////////////////////
|
//////////////////// db_getter.cpp ////////////////////
|
||||||
|
|
||||||
const chain_id_type& get_chain_id()const;
|
const chain_id_type& get_chain_id()const;
|
||||||
|
|
@ -424,7 +426,6 @@ namespace graphene { namespace chain {
|
||||||
void update_expired_feeds();
|
void update_expired_feeds();
|
||||||
void update_maintenance_flag( bool new_maintenance_flag );
|
void update_maintenance_flag( bool new_maintenance_flag );
|
||||||
void update_withdraw_permissions();
|
void update_withdraw_permissions();
|
||||||
void shuffle_witnesses();
|
|
||||||
|
|
||||||
///Steps performed only at maintenance intervals
|
///Steps performed only at maintenance intervals
|
||||||
///@{
|
///@{
|
||||||
|
|
|
||||||
|
|
@ -47,7 +47,6 @@ namespace graphene { namespace chain {
|
||||||
flat_set<witness_id_type> active_witnesses; // updated once per maintenance interval
|
flat_set<witness_id_type> active_witnesses; // updated once per maintenance interval
|
||||||
// n.b. witness scheduling is done by witness_schedule object
|
// n.b. witness scheduling is done by witness_schedule object
|
||||||
flat_set<account_id_type> witness_accounts; // updated once per maintenance interval
|
flat_set<account_id_type> witness_accounts; // updated once per maintenance interval
|
||||||
vector<witness_id_type> current_shuffled_witnesses;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -138,5 +137,4 @@ FC_REFLECT_DERIVED( graphene::chain::global_property_object, (graphene::db::obje
|
||||||
(next_available_vote_id)
|
(next_available_vote_id)
|
||||||
(active_committee_members)
|
(active_committee_members)
|
||||||
(active_witnesses)
|
(active_witnesses)
|
||||||
(current_shuffled_witnesses)
|
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -141,7 +141,8 @@ namespace graphene { namespace chain {
|
||||||
impl_block_summary_object_type,
|
impl_block_summary_object_type,
|
||||||
impl_account_transaction_history_object_type,
|
impl_account_transaction_history_object_type,
|
||||||
impl_blinded_balance_object_type,
|
impl_blinded_balance_object_type,
|
||||||
impl_chain_property_object_type
|
impl_chain_property_object_type,
|
||||||
|
impl_witness_schedule_object_type
|
||||||
};
|
};
|
||||||
|
|
||||||
enum meta_info_object_type
|
enum meta_info_object_type
|
||||||
|
|
@ -194,6 +195,7 @@ namespace graphene { namespace chain {
|
||||||
class block_summary_object;
|
class block_summary_object;
|
||||||
class account_transaction_history_object;
|
class account_transaction_history_object;
|
||||||
class chain_property_object;
|
class chain_property_object;
|
||||||
|
class witness_schedule_object;
|
||||||
|
|
||||||
typedef object_id< implementation_ids, impl_global_property_object_type, global_property_object> global_property_id_type;
|
typedef object_id< implementation_ids, impl_global_property_object_type, global_property_object> global_property_id_type;
|
||||||
typedef object_id< implementation_ids, impl_dynamic_global_property_object_type, dynamic_global_property_object> dynamic_global_property_id_type;
|
typedef object_id< implementation_ids, impl_dynamic_global_property_object_type, dynamic_global_property_object> dynamic_global_property_id_type;
|
||||||
|
|
@ -208,6 +210,7 @@ namespace graphene { namespace chain {
|
||||||
impl_account_transaction_history_object_type,
|
impl_account_transaction_history_object_type,
|
||||||
account_transaction_history_object> account_transaction_history_id_type;
|
account_transaction_history_object> account_transaction_history_id_type;
|
||||||
typedef object_id< implementation_ids, impl_chain_property_object_type, chain_property_object> chain_property_id_type;
|
typedef object_id< implementation_ids, impl_chain_property_object_type, chain_property_object> chain_property_id_type;
|
||||||
|
typedef object_id< implementation_ids, impl_witness_schedule_object_type, witness_schedule_object> witness_schedule_id_type;
|
||||||
|
|
||||||
typedef fc::array<char, GRAPHENE_MAX_ASSET_SYMBOL_LENGTH> symbol_type;
|
typedef fc::array<char, GRAPHENE_MAX_ASSET_SYMBOL_LENGTH> symbol_type;
|
||||||
typedef fc::ripemd160 block_id_type;
|
typedef fc::ripemd160 block_id_type;
|
||||||
|
|
@ -284,6 +287,7 @@ FC_REFLECT_ENUM( graphene::chain::impl_object_type,
|
||||||
(impl_account_transaction_history_object_type)
|
(impl_account_transaction_history_object_type)
|
||||||
(impl_blinded_balance_object_type)
|
(impl_blinded_balance_object_type)
|
||||||
(impl_chain_property_object_type)
|
(impl_chain_property_object_type)
|
||||||
|
(impl_witness_schedule_object_type)
|
||||||
)
|
)
|
||||||
|
|
||||||
FC_REFLECT_ENUM( graphene::chain::meta_info_object_type, (meta_account_object_type)(meta_asset_object_type) )
|
FC_REFLECT_ENUM( graphene::chain::meta_info_object_type, (meta_account_object_type)(meta_asset_object_type) )
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,42 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2015, Cryptonomex, Inc.
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* This source code is provided for evaluation in private test networks only, until September 8, 2015. After this date, this license expires and
|
||||||
|
* the code may not be used, modified or distributed for any purpose. Redistribution and use in source and binary forms, with or without modification,
|
||||||
|
* are permitted until September 8, 2015, provided that the following conditions are met:
|
||||||
|
*
|
||||||
|
* 1. The code and/or derivative works are used only for private test networks consisting of no more than 10 P2P nodes.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
|
||||||
|
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||||
|
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||||
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||||
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
#pragma once
|
||||||
|
#include <graphene/chain/protocol/types.hpp>
|
||||||
|
#include <graphene/db/object.hpp>
|
||||||
|
#include <graphene/db/generic_index.hpp>
|
||||||
|
|
||||||
|
namespace graphene { namespace chain {
|
||||||
|
|
||||||
|
class witness_schedule_object;
|
||||||
|
|
||||||
|
class witness_schedule_object : public graphene::db::abstract_object<witness_schedule_object>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
static const uint8_t space_id = implementation_ids;
|
||||||
|
static const uint8_t type_id = impl_witness_schedule_object_type;
|
||||||
|
|
||||||
|
vector< witness_id_type > current_shuffled_witnesses;
|
||||||
|
};
|
||||||
|
|
||||||
|
} }
|
||||||
|
|
||||||
|
FC_REFLECT_DERIVED(
|
||||||
|
graphene::chain::witness_schedule_object,
|
||||||
|
(graphene::db::object),
|
||||||
|
(current_shuffled_witnesses)
|
||||||
|
)
|
||||||
Loading…
Reference in a new issue