Skip to content
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,13 @@

## [Unreleased]

### Fixed

- Fix container not starting because Superset was starting too slow and was killed because a failing liveness probe.
We now add a proper startup probe, which allows Superset to take longer to start up ([#654]).

[#654]: https://github.com/stackabletech/superset-operator/pull/654

## [25.7.0] - 2025-07-23

## [25.7.0-rc1] - 2025-07-18
Expand Down
16 changes: 8 additions & 8 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,6 @@ strum = { version = "0.27", features = ["derive"] }
tokio = { version = "1.40", features = ["full"] }
tracing = "0.1"

# [patch."https://github.com/stackabletech/operator-rs"]
# stackable-operator = { git = "https://github.com/stackabletech//operator-rs.git", branch = "main" }
[patch."https://github.com/stackabletech/operator-rs"]
stackable-operator = { git = "https://github.com/stackabletech//operator-rs.git", branch = "fix/probe-builder-clone" }
# stackable-operator = { path = "../operator-rs/crates/stackable-operator" }
51 changes: 34 additions & 17 deletions rust/operator-binary/src/superset_controller.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ use stackable_operator::{
pod::{
PodBuilder,
container::ContainerBuilder,
probe::ProbeBuilder,
resources::ResourceRequirementsBuilder,
security::PodSecurityContextBuilder,
volume::{
Expand All @@ -40,9 +41,9 @@ use stackable_operator::{
DeepMerge,
api::{
apps::v1::{StatefulSet, StatefulSetSpec},
core::v1::{ConfigMap, EnvVar, HTTPGetAction, Probe},
core::v1::{ConfigMap, EnvVar},
},
apimachinery::pkg::{apis::meta::v1::LabelSelector, util::intstr::IntOrString},
apimachinery::pkg::apis::meta::v1::LabelSelector,
},
kube::{
Resource, ResourceExt,
Expand Down Expand Up @@ -797,21 +798,7 @@ fn build_server_rolegroup_statefulset(
create_vector_shutdown_file_command(STACKABLE_LOG_DIR),
}])
.resources(merged_config.resources.clone().into());
let probe = Probe {
http_get: Some(HTTPGetAction {
port: IntOrString::Int(APP_PORT.into()),
path: Some("/health".to_string()),
..HTTPGetAction::default()
}),
initial_delay_seconds: Some(15),
period_seconds: Some(15),
timeout_seconds: Some(1),
failure_threshold: Some(3),
success_threshold: Some(1),
..Probe::default()
};
superset_cb.readiness_probe(probe.clone());
superset_cb.liveness_probe(probe);
add_superset_container_probes(&mut superset_cb);

// listener endpoints will use persistent volumes
// so that load balancers can hard-code the target addresses and
Expand Down Expand Up @@ -943,6 +930,36 @@ fn build_server_rolegroup_statefulset(
})
}

fn add_superset_container_probes(superset_cb: &mut ContainerBuilder) {
let common =
ProbeBuilder::http_get_port_scheme_path(APP_PORT, None, Some("/health".to_owned()))
.with_period(Duration::from_secs(5));

superset_cb.startup_probe(
common
.clone()
.with_failure_threshold_duration(Duration::from_minutes_unchecked(10))
.expect("static period is always non-zero")
.build()
.expect("static durations are not too long"),
);

// Remove it from the Service immediately
superset_cb.readiness_probe(
common
.clone()
.build()
.expect("static durations are not too long"),
);
// But only restart it after 3 failures
superset_cb.liveness_probe(
common
.with_failure_threshold(3)
.build()
.expect("static durations are not too long"),
);
}

fn add_authentication_volumes_and_volume_mounts(
auth_config: &SupersetClientAuthenticationDetailsResolved,
cb: &mut ContainerBuilder,
Expand Down
Loading