Allow Poll Lifetime to be configured via CLI (#8885)

... rather than it being a hard-coded constant. fixes #5484 .
This commit is contained in:
Benjamin Kampmann 2018-06-18 13:42:54 +02:00 committed by Marek Kotewicz
parent 4ef71f8a82
commit 609d83f92c
9 changed files with 36 additions and 15 deletions

View File

@ -732,6 +732,10 @@ usage! {
"--gas-price-percentile=[PCT]", "--gas-price-percentile=[PCT]",
"Set PCT percentile gas price value from last 100 blocks as default gas price when sending transactions.", "Set PCT percentile gas price value from last 100 blocks as default gas price when sending transactions.",
ARG arg_poll_lifetime: (u32) = 60u32, or |c: &Config| c.mining.as_ref()?.poll_lifetime.clone(),
"--poll-lifetime=[S]",
"Set the lifetime of the internal index filter to S seconds.",
ARG arg_author: (Option<String>) = None, or |c: &Config| c.mining.as_ref()?.author.clone(), ARG arg_author: (Option<String>) = None, or |c: &Config| c.mining.as_ref()?.author.clone(),
"--author=[ADDRESS]", "--author=[ADDRESS]",
"Specify the block author (aka \"coinbase\") address for sending block rewards from sealed blocks. NOTE: MINING WILL NOT WORK WITHOUT THIS OPTION.", // Sealing/Mining Option "Specify the block author (aka \"coinbase\") address for sending block rewards from sealed blocks. NOTE: MINING WILL NOT WORK WITHOUT THIS OPTION.", // Sealing/Mining Option
@ -1241,6 +1245,7 @@ struct Mining {
relay_set: Option<String>, relay_set: Option<String>,
min_gas_price: Option<u64>, min_gas_price: Option<u64>,
gas_price_percentile: Option<usize>, gas_price_percentile: Option<usize>,
poll_lifetime: Option<u32>,
usd_per_tx: Option<String>, usd_per_tx: Option<String>,
usd_per_eth: Option<String>, usd_per_eth: Option<String>,
price_update_period: Option<String>, price_update_period: Option<String>,
@ -1664,6 +1669,7 @@ mod tests {
arg_min_gas_price: Some(0u64), arg_min_gas_price: Some(0u64),
arg_usd_per_tx: "0.0001".into(), arg_usd_per_tx: "0.0001".into(),
arg_gas_price_percentile: 50usize, arg_gas_price_percentile: 50usize,
arg_poll_lifetime: 60u32,
arg_usd_per_eth: "auto".into(), arg_usd_per_eth: "auto".into(),
arg_price_update_period: "hourly".into(), arg_price_update_period: "hourly".into(),
arg_gas_floor_target: "4700000".into(), arg_gas_floor_target: "4700000".into(),
@ -1924,6 +1930,7 @@ mod tests {
relay_set: None, relay_set: None,
min_gas_price: None, min_gas_price: None,
gas_price_percentile: None, gas_price_percentile: None,
poll_lifetime: None,
usd_per_tx: None, usd_per_tx: None,
usd_per_eth: None, usd_per_eth: None,
price_update_period: Some("hourly".into()), price_update_period: Some("hourly".into()),

View File

@ -356,6 +356,7 @@ impl Configuration {
logger_config: logger_config.clone(), logger_config: logger_config.clone(),
miner_options: self.miner_options()?, miner_options: self.miner_options()?,
gas_price_percentile: self.args.arg_gas_price_percentile, gas_price_percentile: self.args.arg_gas_price_percentile,
poll_lifetime: self.args.arg_poll_lifetime,
ntp_servers: self.ntp_servers(), ntp_servers: self.ntp_servers(),
ws_conf: ws_conf, ws_conf: ws_conf,
http_conf: http_conf, http_conf: http_conf,
@ -1398,6 +1399,7 @@ mod tests {
logger_config: Default::default(), logger_config: Default::default(),
miner_options: Default::default(), miner_options: Default::default(),
gas_price_percentile: 50, gas_price_percentile: 50,
poll_lifetime: 60,
ntp_servers: vec![ ntp_servers: vec![
"0.parity.pool.ntp.org:123".into(), "0.parity.pool.ntp.org:123".into(),
"1.parity.pool.ntp.org:123".into(), "1.parity.pool.ntp.org:123".into(),

View File

@ -235,6 +235,7 @@ pub struct FullDependencies {
pub remote: parity_reactor::Remote, pub remote: parity_reactor::Remote,
pub whisper_rpc: Option<::whisper::RpcFactory>, pub whisper_rpc: Option<::whisper::RpcFactory>,
pub gas_price_percentile: usize, pub gas_price_percentile: usize,
pub poll_lifetime: u32,
} }
impl FullDependencies { impl FullDependencies {
@ -288,12 +289,13 @@ impl FullDependencies {
allow_pending_receipt_query: !self.geth_compatibility, allow_pending_receipt_query: !self.geth_compatibility,
send_block_number_in_get_work: !self.geth_compatibility, send_block_number_in_get_work: !self.geth_compatibility,
gas_price_percentile: self.gas_price_percentile, gas_price_percentile: self.gas_price_percentile,
poll_lifetime: self.poll_lifetime
} }
); );
handler.extend_with(client.to_delegate()); handler.extend_with(client.to_delegate());
if !for_generic_pubsub { if !for_generic_pubsub {
let filter_client = EthFilterClient::new(self.client.clone(), self.miner.clone()); let filter_client = EthFilterClient::new(self.client.clone(), self.miner.clone(), self.poll_lifetime);
handler.extend_with(filter_client.to_delegate()); handler.extend_with(filter_client.to_delegate());
add_signing_methods!(EthSigning, handler, self, nonces.clone()); add_signing_methods!(EthSigning, handler, self, nonces.clone());
@ -447,6 +449,7 @@ pub struct LightDependencies<T> {
pub whisper_rpc: Option<::whisper::RpcFactory>, pub whisper_rpc: Option<::whisper::RpcFactory>,
pub private_tx_service: Option<Arc<PrivateTransactionManager>>, pub private_tx_service: Option<Arc<PrivateTransactionManager>>,
pub gas_price_percentile: usize, pub gas_price_percentile: usize,
pub poll_lifetime: u32,
} }
impl<C: LightChainClient + 'static> LightDependencies<C> { impl<C: LightChainClient + 'static> LightDependencies<C> {
@ -504,6 +507,7 @@ impl<C: LightChainClient + 'static> LightDependencies<C> {
self.secret_store.clone(), self.secret_store.clone(),
self.cache.clone(), self.cache.clone(),
self.gas_price_percentile, self.gas_price_percentile,
self.poll_lifetime,
); );
handler.extend_with(Eth::to_delegate(client.clone())); handler.extend_with(Eth::to_delegate(client.clone()));

View File

@ -90,6 +90,7 @@ pub struct RunCmd {
pub logger_config: LogConfig, pub logger_config: LogConfig,
pub miner_options: MinerOptions, pub miner_options: MinerOptions,
pub gas_price_percentile: usize, pub gas_price_percentile: usize,
pub poll_lifetime: u32,
pub ntp_servers: Vec<String>, pub ntp_servers: Vec<String>,
pub ws_conf: rpc::WsConfiguration, pub ws_conf: rpc::WsConfiguration,
pub http_conf: rpc::HttpConfiguration, pub http_conf: rpc::HttpConfiguration,
@ -350,6 +351,7 @@ fn execute_light_impl(cmd: RunCmd, logger: Arc<RotatingLogger>) -> Result<Runnin
whisper_rpc: whisper_factory, whisper_rpc: whisper_factory,
private_tx_service: None, //TODO: add this to client. private_tx_service: None, //TODO: add this to client.
gas_price_percentile: cmd.gas_price_percentile, gas_price_percentile: cmd.gas_price_percentile,
poll_lifetime: cmd.poll_lifetime
}); });
let dependencies = rpc::Dependencies { let dependencies = rpc::Dependencies {
@ -779,6 +781,7 @@ fn execute_impl<Cr, Rr>(cmd: RunCmd, logger: Arc<RotatingLogger>, on_client_rq:
whisper_rpc: whisper_factory, whisper_rpc: whisper_factory,
private_tx_service: Some(private_tx_service.clone()), private_tx_service: Some(private_tx_service.clone()),
gas_price_percentile: cmd.gas_price_percentile, gas_price_percentile: cmd.gas_price_percentile,
poll_lifetime: cmd.poll_lifetime,
}); });
let dependencies = rpc::Dependencies { let dependencies = rpc::Dependencies {

View File

@ -18,9 +18,6 @@
use transient_hashmap::{TransientHashMap, Timer, StandardTimer}; use transient_hashmap::{TransientHashMap, Timer, StandardTimer};
/// Lifetime of poll (in seconds).
const POLL_LIFETIME: u32 = 60;
pub type PollId = usize; pub type PollId = usize;
/// Indexes all poll requests. /// Indexes all poll requests.
@ -32,17 +29,17 @@ pub struct PollManager<F, T = StandardTimer> where T: Timer {
} }
impl<F> PollManager<F, StandardTimer> { impl<F> PollManager<F, StandardTimer> {
/// Creates new instance of indexer. /// Creates new instance of indexer
pub fn new() -> Self { pub fn new(lifetime: u32) -> Self {
PollManager::new_with_timer(Default::default()) PollManager::new_with_timer(Default::default(), lifetime)
} }
} }
impl<F, T> PollManager<F, T> where T: Timer { impl<F, T> PollManager<F, T> where T: Timer {
pub fn new_with_timer(timer: T) -> Self { pub fn new_with_timer(timer: T, lifetime: u32) -> Self {
PollManager { PollManager {
polls: TransientHashMap::new_with_timer(POLL_LIFETIME, timer), polls: TransientHashMap::new_with_timer(lifetime, timer),
next_available_id: 0, next_available_id: 0,
} }
} }
@ -102,7 +99,7 @@ mod tests {
time: &time, time: &time,
}; };
let mut indexer = PollManager::new_with_timer(timer); let mut indexer = PollManager::new_with_timer(timer,60);
assert_eq!(indexer.create_poll(20), 0); assert_eq!(indexer.create_poll(20), 0);
assert_eq!(indexer.create_poll(20), 1); assert_eq!(indexer.create_poll(20), 1);

View File

@ -65,6 +65,8 @@ pub struct EthClientOptions {
pub send_block_number_in_get_work: bool, pub send_block_number_in_get_work: bool,
/// Gas Price Percentile used as default gas price. /// Gas Price Percentile used as default gas price.
pub gas_price_percentile: usize, pub gas_price_percentile: usize,
/// Set the timeout for the internal poll manager
pub poll_lifetime: u32
} }
impl EthClientOptions { impl EthClientOptions {
@ -83,6 +85,7 @@ impl Default for EthClientOptions {
pending_nonce_from_queue: false, pending_nonce_from_queue: false,
allow_pending_receipt_query: true, allow_pending_receipt_query: true,
send_block_number_in_get_work: true, send_block_number_in_get_work: true,
poll_lifetime: 60u32,
gas_price_percentile: 50, gas_price_percentile: 50,
} }
} }

View File

@ -66,11 +66,11 @@ pub struct EthFilterClient<C, M> {
impl<C, M> EthFilterClient<C, M> { impl<C, M> EthFilterClient<C, M> {
/// Creates new Eth filter client. /// Creates new Eth filter client.
pub fn new(client: Arc<C>, miner: Arc<M>) -> Self { pub fn new(client: Arc<C>, miner: Arc<M>, poll_lifetime: u32) -> Self {
EthFilterClient { EthFilterClient {
client: client, client: client,
miner: miner, miner: miner,
polls: Mutex::new(PollManager::new()), polls: Mutex::new(PollManager::new(poll_lifetime)),
} }
} }
} }

View File

@ -62,6 +62,7 @@ pub struct EthClient<T> {
accounts: Arc<AccountProvider>, accounts: Arc<AccountProvider>,
cache: Arc<Mutex<LightDataCache>>, cache: Arc<Mutex<LightDataCache>>,
polls: Mutex<PollManager<PollFilter>>, polls: Mutex<PollManager<PollFilter>>,
poll_lifetime: u32,
gas_price_percentile: usize, gas_price_percentile: usize,
} }
@ -92,7 +93,8 @@ impl<T> Clone for EthClient<T> {
transaction_queue: self.transaction_queue.clone(), transaction_queue: self.transaction_queue.clone(),
accounts: self.accounts.clone(), accounts: self.accounts.clone(),
cache: self.cache.clone(), cache: self.cache.clone(),
polls: Mutex::new(PollManager::new()), polls: Mutex::new(PollManager::new(self.poll_lifetime)),
poll_lifetime: self.poll_lifetime,
gas_price_percentile: self.gas_price_percentile, gas_price_percentile: self.gas_price_percentile,
} }
} }
@ -109,6 +111,7 @@ impl<T: LightChainClient + 'static> EthClient<T> {
accounts: Arc<AccountProvider>, accounts: Arc<AccountProvider>,
cache: Arc<Mutex<LightDataCache>>, cache: Arc<Mutex<LightDataCache>>,
gas_price_percentile: usize, gas_price_percentile: usize,
poll_lifetime: u32
) -> Self { ) -> Self {
EthClient { EthClient {
sync, sync,
@ -117,7 +120,8 @@ impl<T: LightChainClient + 'static> EthClient<T> {
transaction_queue, transaction_queue,
accounts, accounts,
cache, cache,
polls: Mutex::new(PollManager::new()), polls: Mutex::new(PollManager::new(poll_lifetime)),
poll_lifetime,
gas_price_percentile, gas_price_percentile,
} }
} }

View File

@ -92,8 +92,9 @@ impl EthTester {
let hashrates = Arc::new(Mutex::new(HashMap::new())); let hashrates = Arc::new(Mutex::new(HashMap::new()));
let external_miner = Arc::new(ExternalMiner::new(hashrates.clone())); let external_miner = Arc::new(ExternalMiner::new(hashrates.clone()));
let gas_price_percentile = options.gas_price_percentile; let gas_price_percentile = options.gas_price_percentile;
let poll_lifetime = options.poll_lifetime;
let eth = EthClient::new(&client, &snapshot, &sync, &opt_ap, &miner, &external_miner, options).to_delegate(); let eth = EthClient::new(&client, &snapshot, &sync, &opt_ap, &miner, &external_miner, options).to_delegate();
let filter = EthFilterClient::new(client.clone(), miner.clone()).to_delegate(); let filter = EthFilterClient::new(client.clone(), miner.clone(), poll_lifetime).to_delegate();
let reservations = Arc::new(Mutex::new(nonce::Reservations::new())); let reservations = Arc::new(Mutex::new(nonce::Reservations::new()));
let dispatcher = FullDispatcher::new(client.clone(), miner.clone(), reservations, gas_price_percentile); let dispatcher = FullDispatcher::new(client.clone(), miner.clone(), reservations, gas_price_percentile);