Make address cache configurable (#5784)
* Make address cache configurable * TestFixture
This commit is contained in:
@@ -1275,7 +1275,7 @@ impl TestFixture {
|
||||
AppState {
|
||||
nyxd_client,
|
||||
chain_status_cache: ChainStatusCache::new(Duration::from_secs(42)),
|
||||
address_info_cache: AddressInfoCache::new(),
|
||||
address_info_cache: AddressInfoCache::new(Duration::from_secs(42), 1000),
|
||||
forced_refresh: ForcedRefresh::new(true),
|
||||
nym_contract_cache: NymContractCache::new(),
|
||||
node_status_cache: NodeStatusCache::new(),
|
||||
|
||||
@@ -102,6 +102,15 @@ pub(crate) struct Args {
|
||||
#[clap(long)]
|
||||
pub(crate) bind_address: Option<SocketAddr>,
|
||||
|
||||
/// account/address cache TTL: should be lower than epoch length (1 hour)
|
||||
/// because, at worst, data will be stale for <epoch_length> + <cache_ttl> seconds
|
||||
#[clap(long, env = "ADDRESS_CACHE_REFRESH_INTERVAL_S")]
|
||||
pub(crate) address_cache_ttl_seconds: Option<u64>,
|
||||
|
||||
/// number of addresses that are cached on account/address endpoint
|
||||
#[clap(long, env = "ADDRESS_CACHE_CAPACITY")]
|
||||
pub(crate) address_cache_capacity: Option<u64>,
|
||||
|
||||
#[clap(hide = true, long, default_value_t = false)]
|
||||
pub(crate) allow_illegal_ips: bool,
|
||||
}
|
||||
@@ -194,7 +203,10 @@ async fn start_nym_api_tasks_axum(config: &Config) -> anyhow::Result<ShutdownHan
|
||||
let router = router.with_state(AppState {
|
||||
nyxd_client: nyxd_client.clone(),
|
||||
chain_status_cache: ChainStatusCache::new(DEFAULT_CHAIN_STATUS_CACHE_TTL),
|
||||
address_info_cache: AddressInfoCache::new(),
|
||||
address_info_cache: AddressInfoCache::new(
|
||||
config.address_cache.time_to_live,
|
||||
config.address_cache.capacity,
|
||||
),
|
||||
forced_refresh: ForcedRefresh::new(
|
||||
config.topology_cacher.debug.node_describe_allow_illegal_ips,
|
||||
),
|
||||
|
||||
@@ -54,6 +54,9 @@ const DEFAULT_TOPOLOGY_CACHE_INTERVAL: Duration = Duration::from_secs(30);
|
||||
const DEFAULT_NODE_STATUS_CACHE_INTERVAL: Duration = Duration::from_secs(120);
|
||||
const DEFAULT_CIRCULATING_SUPPLY_CACHE_INTERVAL: Duration = Duration::from_secs(3600);
|
||||
|
||||
pub(crate) const DEFAULT_ADDRESS_CACHE_TTL: Duration = Duration::from_secs(60 * 15);
|
||||
pub(crate) const DEFAULT_ADDRESS_CACHE_CAPACITY: u64 = 1000;
|
||||
|
||||
pub(crate) const DEFAULT_NODE_DESCRIBE_CACHE_INTERVAL: Duration = Duration::from_secs(4500);
|
||||
pub(crate) const DEFAULT_NODE_DESCRIBE_BATCH_SIZE: usize = 50;
|
||||
|
||||
@@ -111,6 +114,9 @@ pub struct Config {
|
||||
|
||||
#[serde(alias = "coconut_signer")]
|
||||
pub ecash_signer: EcashSigner,
|
||||
|
||||
#[serde(skip)]
|
||||
pub address_cache: AddressCacheConfig,
|
||||
}
|
||||
|
||||
impl NymConfigTemplate for Config {
|
||||
@@ -130,6 +136,7 @@ impl Config {
|
||||
circulating_supply_cacher: Default::default(),
|
||||
rewarding: Default::default(),
|
||||
ecash_signer: EcashSigner::new_default(id.as_ref()),
|
||||
address_cache: Default::default(),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -179,6 +186,12 @@ impl Config {
|
||||
if args.allow_illegal_ips {
|
||||
self.topology_cacher.debug.node_describe_allow_illegal_ips = true
|
||||
}
|
||||
if let Some(address_cache_ttl) = args.address_cache_ttl {
|
||||
self.address_cache.time_to_live = address_cache_ttl;
|
||||
}
|
||||
if let Some(address_cache_capacity) = args.address_cache_capacity {
|
||||
self.address_cache.capacity = address_cache_capacity;
|
||||
}
|
||||
|
||||
self
|
||||
}
|
||||
@@ -292,6 +305,21 @@ impl Base {
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, PartialEq, Eq)]
|
||||
pub struct AddressCacheConfig {
|
||||
pub time_to_live: Duration,
|
||||
pub capacity: u64,
|
||||
}
|
||||
|
||||
impl Default for AddressCacheConfig {
|
||||
fn default() -> Self {
|
||||
Self {
|
||||
time_to_live: DEFAULT_ADDRESS_CACHE_TTL,
|
||||
capacity: DEFAULT_ADDRESS_CACHE_CAPACITY,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// this got separated into 2 structs so that we could have a sane `default` implementation for the latter
|
||||
#[derive(Debug, Deserialize, PartialEq, Eq, Serialize)]
|
||||
pub struct NetworkMonitor {
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
// SPDX-License-Identifier: GPL-3.0-only
|
||||
|
||||
use crate::support::cli::{init, run};
|
||||
use std::net::SocketAddr;
|
||||
use std::{net::SocketAddr, time::Duration};
|
||||
|
||||
// Configuration that can be overridden.
|
||||
pub(crate) struct OverrideConfig {
|
||||
@@ -32,6 +32,9 @@ pub(crate) struct OverrideConfig {
|
||||
/// default: `127.0.0.1:8080` in `debug` builds and `0.0.0.0:8080` in `release`
|
||||
pub(crate) bind_address: Option<SocketAddr>,
|
||||
|
||||
pub(crate) address_cache_ttl: Option<Duration>,
|
||||
pub(crate) address_cache_capacity: Option<u64>,
|
||||
|
||||
pub(crate) allow_illegal_ips: bool,
|
||||
}
|
||||
|
||||
@@ -46,6 +49,9 @@ impl From<init::Args> for OverrideConfig {
|
||||
announce_address: args.announce_address,
|
||||
monitor_credentials_mode: Some(args.monitor_credentials_mode),
|
||||
bind_address: args.bind_address,
|
||||
// irrelevant for --init command because we set the value in --run
|
||||
address_cache_ttl: None,
|
||||
address_cache_capacity: None,
|
||||
allow_illegal_ips: args.allow_illegal_ips,
|
||||
}
|
||||
}
|
||||
@@ -62,6 +68,8 @@ impl From<run::Args> for OverrideConfig {
|
||||
announce_address: args.announce_address,
|
||||
monitor_credentials_mode: args.monitor_credentials_mode,
|
||||
bind_address: args.bind_address,
|
||||
address_cache_ttl: args.address_cache_ttl_seconds.map(Duration::from_secs),
|
||||
address_cache_capacity: args.address_cache_capacity,
|
||||
allow_illegal_ips: args.allow_illegal_ips,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,17 +17,11 @@ pub(crate) struct AddressInfoCache {
|
||||
}
|
||||
|
||||
impl AddressInfoCache {
|
||||
pub(crate) fn new() -> Self {
|
||||
// epoch duration = 1 hour
|
||||
// cache TTL is slightly lower than that to avoid too stale data in case
|
||||
// cache was refreshed JUST BEFORE epoch transition
|
||||
let cache_ttl = Duration::from_secs(60 * 30);
|
||||
let max_capacity = 1000;
|
||||
|
||||
pub(crate) fn new(cache_ttl: Duration, capacity: u64) -> Self {
|
||||
AddressInfoCache {
|
||||
inner: Cache::builder()
|
||||
.time_to_live(cache_ttl)
|
||||
.max_capacity(max_capacity)
|
||||
.max_capacity(capacity)
|
||||
.build(),
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user