mirror of
https://github.com/neondatabase/neon.git
synced 2025-12-26 07:39:58 +00:00
# TLDR Problem-I is a bug fix. The rest are no-ops. ## Problem I Page server checks image layer creation based on the elapsed time but this check depends on the current logical size, which is only computed on shard 0. Thus, for non-0 shards, the check will be ineffective and image creation will never be done for idle tenants. ## Summary of changes I This PR fixes the problem by simply removing the dependency on current logical size. ## Summary of changes II This PR adds a timeout when calling page server to split shard to make sure SC does not wait for the API call forever. Currently the PR doesn't adds any retry logic because it's not clear whether page server shard split can be safely retried if the existing operation is still ongoing or left the storage in a bad state. Thus it's better to abort the whole operation and restart. ## Problem III `test_remote_failures` requires PS to be compiled in the testing mode. For PS in dev/staging, they are compiled without this mode. ## Summary of changes III Remove the restriction and also increase the number of total failures allowed. ## Summary of changes IV remove test on PS getpage http route. --------- Co-authored-by: Chen Luo <chen.luo@databricks.com> Co-authored-by: Yecheng Yang <carlton.yang@databricks.com> Co-authored-by: Vlad Lazar <vlad@neon.tech>
107 lines
2.8 KiB
Rust
107 lines
2.8 KiB
Rust
//! Wrapper around `std::env::var` for parsing environment variables.
|
|
|
|
use std::fmt::Display;
|
|
use std::str::FromStr;
|
|
|
|
/// For types `V` that implement [`FromStr`].
|
|
pub fn var<V, E>(varname: &str) -> Option<V>
|
|
where
|
|
V: FromStr<Err = E>,
|
|
E: Display,
|
|
{
|
|
match std::env::var(varname) {
|
|
Ok(s) => Some(
|
|
s.parse()
|
|
.map_err(|e| {
|
|
format!("failed to parse env var {varname} using FromStr::parse: {e:#}")
|
|
})
|
|
.unwrap(),
|
|
),
|
|
Err(std::env::VarError::NotPresent) => None,
|
|
Err(std::env::VarError::NotUnicode(_)) => {
|
|
panic!("env var {varname} is not unicode")
|
|
}
|
|
}
|
|
}
|
|
|
|
/// For types `V` that implement [`serde::de::DeserializeOwned`].
|
|
pub fn var_serde_json_string<V>(varname: &str) -> Option<V>
|
|
where
|
|
V: serde::de::DeserializeOwned,
|
|
{
|
|
match std::env::var(varname) {
|
|
Ok(s) => Some({
|
|
let value = serde_json::Value::String(s);
|
|
serde_json::from_value(value)
|
|
.map_err(|e| {
|
|
format!("failed to parse env var {varname} as a serde_json json string: {e:#}")
|
|
})
|
|
.unwrap()
|
|
}),
|
|
Err(std::env::VarError::NotPresent) => None,
|
|
Err(std::env::VarError::NotUnicode(_)) => {
|
|
panic!("env var {varname} is not unicode")
|
|
}
|
|
}
|
|
}
|
|
|
|
/* BEGIN_HADRON */
|
|
pub enum DeploymentMode {
|
|
Local,
|
|
Dev,
|
|
Staging,
|
|
Prod,
|
|
}
|
|
|
|
pub fn get_deployment_mode() -> Option<DeploymentMode> {
|
|
match std::env::var("DEPLOYMENT_MODE") {
|
|
Ok(env) => match env.as_str() {
|
|
"development" => Some(DeploymentMode::Dev),
|
|
"staging" => Some(DeploymentMode::Staging),
|
|
"production" => Some(DeploymentMode::Prod),
|
|
_ => {
|
|
tracing::error!("Unexpected DEPLOYMENT_MODE: {}", env);
|
|
None
|
|
}
|
|
},
|
|
Err(_) => {
|
|
// tracing::error!("DEPLOYMENT_MODE not set");
|
|
None
|
|
}
|
|
}
|
|
}
|
|
|
|
pub fn is_dev_or_staging() -> bool {
|
|
matches!(
|
|
get_deployment_mode(),
|
|
Some(DeploymentMode::Dev) | Some(DeploymentMode::Staging)
|
|
)
|
|
}
|
|
|
|
pub enum TestingMode {
|
|
Chaos,
|
|
Stress,
|
|
}
|
|
|
|
pub fn get_test_mode() -> Option<TestingMode> {
|
|
match std::env::var("HADRON_TEST_MODE") {
|
|
Ok(env) => match env.as_str() {
|
|
"chaos" => Some(TestingMode::Chaos),
|
|
"stress" => Some(TestingMode::Stress),
|
|
_ => {
|
|
tracing::error!("Unexpected HADRON_TEST_MODE: {}", env);
|
|
None
|
|
}
|
|
},
|
|
Err(_) => {
|
|
tracing::error!("HADRON_TEST_MODE not set");
|
|
None
|
|
}
|
|
}
|
|
}
|
|
|
|
pub fn is_chaos_testing() -> bool {
|
|
matches!(get_test_mode(), Some(TestingMode::Chaos))
|
|
}
|
|
/* END_HADRON */
|