Skip to content

Commit

Permalink
GH-6 Simplify by doing diff during assemble_block
Browse files Browse the repository at this point in the history
  • Loading branch information
heifner committed May 2, 2024
1 parent af51f07 commit ce2cb2e
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 36 deletions.
53 changes: 18 additions & 35 deletions libraries/chain/controller.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -493,27 +493,24 @@ struct building_block {

// returns the next proposer schedule version and true if producers should be proposed in block
// if producers is not different then returns the current schedule version (or next schedule version)
std::tuple<uint32_t, bool> get_next_proposer_schedule_version(const vector<producer_authority>& producers) const {
std::tuple<uint32_t, bool> get_next_proposer_schedule_version(const shared_vector<shared_producer_authority>& producers) const {
assert(active_proposer_policy);

auto get_next_sched = [&]() -> const producer_authority_schedule& {
// if there are any policies already proposed but not active yet then they are what needs to be compared
if (!parent.proposer_policies.empty()) {
if (!parent.proposer_policies.empty()) { // proposed in-flight
// return the last proposed policy to use for comparison
return (--parent.proposer_policies.end())->second->proposer_schedule;
}
// none currently in-flight, use active
return active_proposer_policy->proposer_schedule;
};

const producer_authority_schedule& lhs = get_next_sched();

auto v = lhs.version;

if (!std::ranges::equal(lhs.producers, producers)) {
if (!std::equal(lhs.producers.begin(), lhs.producers.end(), producers.begin(), producers.end())) {
++v;
return {v, true};
}

return {v, false};
}

Expand Down Expand Up @@ -605,7 +602,7 @@ struct building_block {
v);
}

std::tuple<uint32_t, bool> get_next_proposer_schedule_version(const vector<producer_authority>& producers) const {
std::tuple<uint32_t, bool> get_next_proposer_schedule_version(const shared_vector<shared_producer_authority>& producers) const {
return std::visit(
overloaded{[](const building_block_legacy&) -> std::tuple<uint32_t, bool> { return {-1, false}; },
[&](const building_block_if& bb) -> std::tuple<uint32_t, bool> {
Expand Down Expand Up @@ -903,7 +900,7 @@ struct pending_state {
_block_stage);
}

std::tuple<uint32_t, bool> get_next_proposer_schedule_version(const vector<producer_authority>& producers) const {
std::tuple<uint32_t, bool> get_next_proposer_schedule_version(const shared_vector<shared_producer_authority>& producers) const {
return std::visit(overloaded{
[&](const building_block& stage) -> std::tuple<uint32_t, bool> {
return stage.get_next_proposer_schedule_version(producers);
Expand Down Expand Up @@ -3138,10 +3135,16 @@ struct controller_impl {
auto process_new_proposer_policy = [&](auto&) -> void {
const auto& gpo = db.get<global_property_object>();
if (gpo.proposed_schedule_block_num) {
new_proposer_policy = std::make_unique<proposer_policy>();
new_proposer_policy->active_time = detail::get_next_next_round_block_time(bb.timestamp());
new_proposer_policy->proposer_schedule = producer_authority_schedule::from_shared(gpo.proposed_schedule);
ilog("Scheduling proposer schedule change at ${t}: ${s}", ("t", new_proposer_policy->active_time)("s", new_proposer_policy->proposer_schedule));

auto [version, should_propose] = pending->get_next_proposer_schedule_version(gpo.proposed_schedule.producers);
if (should_propose) {
new_proposer_policy = std::make_unique<proposer_policy>();
new_proposer_policy->active_time = detail::get_next_next_round_block_time(bb.timestamp());
new_proposer_policy->proposer_schedule = producer_authority_schedule::from_shared(gpo.proposed_schedule);
new_proposer_policy->proposer_schedule.version = version;
ilog("Scheduling proposer schedule change at ${t}: ${s}",
("t", new_proposer_policy->active_time)("s", new_proposer_policy->proposer_schedule));
}

db.modify( gpo, [&]( auto& gp ) {
gp.proposed_schedule_block_num = std::optional<block_num_type>();
Expand Down Expand Up @@ -5224,33 +5227,13 @@ int64_t controller_impl::set_proposed_producers( vector<producer_authority> prod

assert(pending);

// see if one already proposed in this block
auto& gpo = db.get<global_property_object>();
if (gpo.proposed_schedule_block_num) {
if (std::equal(producers.begin(), producers.end(),
gpo.proposed_schedule.producers.begin(), gpo.proposed_schedule.producers.end())) {
return std::numeric_limits<uint32_t>::max(); // the proposed producer schedule does not change
}
// clear gpo proposed_schedule as we may determine no diff between proposed producers and next proposer schedule
db.modify( gpo, [&]( auto& gp ) {
gp.proposed_schedule_block_num.reset();
gp.proposed_schedule.version = 0;
gp.proposed_schedule.producers.clear();
});
}

auto [version, should_propose] = pending->get_next_proposer_schedule_version(producers);
if (!should_propose)
return std::numeric_limits<uint32_t>::max();

producer_authority_schedule sch;
sch.version = version;
// sch.version is set in assemble_block
sch.producers = std::move(producers);

ilog( "proposed producer schedule with version ${v}", ("v", sch.version) );

// store schedule in gpo so it will be rolledback if transaction fails
auto cur_block_num = chain_head.block_num() + 1;
auto& gpo = db.get<global_property_object>();
db.modify( gpo, [&]( auto& gp ) {
gp.proposed_schedule_block_num = cur_block_num;
gp.proposed_schedule = sch;
Expand Down
2 changes: 1 addition & 1 deletion libraries/chain/include/eosio/chain/block_header_state.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ struct block_header_state {
proposer_policy_ptr active_proposer_policy; // producer authority schedule, supports `digest()`

// block time when proposer_policy will become active
// current algorithm only two entries possible, for for the next,next round and one for block round after that
// current algorithm only two entries possible, for the next,next round and one for block round after that
// The active time is the next,next producer round. For example,
// round A [1,2,..12], next_round B [1,2,..12], next_next_round C [1,2,..12], D [1,2,..12]
// If proposed in A1, A2, .. A12 becomes active in C1
Expand Down

0 comments on commit ce2cb2e

Please sign in to comment.