Add GenesisBlock::OperatingMode to control how cluster features are activated (#6430)

This commit is contained in:
Michael Vines
2019-10-23 11:50:10 -07:00
committed by GitHub
parent 35d6196384
commit 35cc74ef25
13 changed files with 256 additions and 46 deletions

View File

@ -13,11 +13,13 @@ log = "0.4.8"
rand = "0.6.5"
solana-bench-exchange = { path = "../bench-exchange", version = "0.20.0" }
solana-bench-tps = { path = "../bench-tps", version = "0.20.0" }
solana-config-api = { path = "../programs/config_api", version = "0.20.0" }
solana-core = { path = "../core", version = "0.20.0" }
solana-client = { path = "../client", version = "0.20.0" }
solana-drone = { path = "../drone", version = "0.20.0" }
solana-exchange-api = { path = "../programs/exchange_api", version = "0.20.0" }
solana-exchange-program = { path = "../programs/exchange_program", version = "0.20.0" }
solana-genesis-programs = { path = "../genesis_programs", version = "0.20.0" }
solana-ledger = { path = "../ledger", version = "0.20.0" }
solana-logger = { path = "../logger", version = "0.20.0" }
solana-move-loader-api = { path = "../programs/move_loader_api", version = "0.20.0", optional = true }
@ -27,6 +29,7 @@ solana-sdk = { path = "../sdk", version = "0.20.0" }
solana-stake-api = { path = "../programs/stake_api", version = "0.20.0" }
solana-storage-api = { path = "../programs/storage_api", version = "0.20.0" }
solana-storage-program = { path = "../programs/storage_program", version = "0.20.0" }
solana-vest-api = { path = "../programs/vest_api", version = "0.20.0" }
solana-vote-api = { path = "../programs/vote_api", version = "0.20.0" }
symlink = "0.1.0"
tempfile = "3.1.0"

View File

@ -14,7 +14,7 @@ use solana_sdk::{
client::SyncClient,
clock::{DEFAULT_SLOTS_PER_EPOCH, DEFAULT_SLOTS_PER_SEGMENT, DEFAULT_TICKS_PER_SLOT},
epoch_schedule::EpochSchedule,
genesis_block::GenesisBlock,
genesis_block::{GenesisBlock, OperatingMode},
message::Message,
poh_config::PohConfig,
pubkey::Pubkey,
@ -74,6 +74,7 @@ pub struct ClusterConfig {
pub slots_per_segment: u64,
pub stakers_slot_offset: u64,
pub native_instruction_processors: Vec<(String, Pubkey)>,
pub operating_mode: OperatingMode,
pub poh_config: PohConfig,
}
@ -90,6 +91,7 @@ impl Default for ClusterConfig {
slots_per_segment: DEFAULT_SLOTS_PER_SEGMENT,
stakers_slot_offset: DEFAULT_SLOTS_PER_EPOCH,
native_instruction_processors: vec![],
operating_mode: OperatingMode::Development,
poh_config: PohConfig::default(),
}
}
@ -142,7 +144,19 @@ impl LocalCluster {
genesis_block.slots_per_segment = config.slots_per_segment;
genesis_block.epoch_schedule =
EpochSchedule::custom(config.slots_per_epoch, config.stakers_slot_offset, true);
genesis_block.operating_mode = config.operating_mode;
genesis_block.poh_config = config.poh_config.clone();
match genesis_block.operating_mode {
OperatingMode::SoftLaunch => {
genesis_block.native_instruction_processors =
solana_genesis_programs::get(genesis_block.operating_mode, 0).unwrap()
}
// create_genesis_block_with_leader() assumes OperatingMode::Development so do
// nothing...
OperatingMode::Development => (),
}
genesis_block
.native_instruction_processors
.extend_from_slice(&config.native_instruction_processors);

View File

@ -5,6 +5,7 @@ use crate::{
};
use log::*;
use serial_test_derive::serial;
use solana_client::thin_client::create_client;
use solana_core::{
broadcast_stage::BroadcastStageType, gossip_service::discover_cluster,
validator::ValidatorConfig,
@ -15,6 +16,7 @@ use solana_sdk::{
client::SyncClient,
clock,
epoch_schedule::{EpochSchedule, MINIMUM_SLOTS_PER_EPOCH},
genesis_block::OperatingMode,
poh_config::PohConfig,
};
use std::path::{Path, PathBuf};
@ -296,6 +298,43 @@ fn test_listener_startup() {
assert_eq!(cluster_nodes.len(), 4);
}
#[test]
#[serial]
fn test_softlaunch_operating_mode() {
solana_logger::setup();
let config = ClusterConfig {
operating_mode: OperatingMode::SoftLaunch,
node_stakes: vec![100; 1],
cluster_lamports: 1_000,
validator_configs: vec![ValidatorConfig::default(); 1],
..ClusterConfig::default()
};
let cluster = LocalCluster::new(&config);
let (cluster_nodes, _) = discover_cluster(&cluster.entry_point_info.gossip, 1).unwrap();
assert_eq!(cluster_nodes.len(), 1);
let client = create_client(
cluster.entry_point_info.client_facing_addr(),
solana_core::cluster_info::VALIDATOR_PORT_RANGE,
);
// Programs that are not available at soft launch
for program_id in [
&solana_config_api::id(),
&solana_sdk::bpf_loader::id(),
&solana_sdk::system_program::id(),
&solana_vest_api::id(),
]
.iter()
{
assert_eq!(
(program_id, client.get_account(program_id).unwrap()),
(program_id, None)
);
}
}
#[allow(unused_attributes)]
#[test]
#[serial]