diff --git a/pageserver/src/http/routes.rs b/pageserver/src/http/routes.rs
index 26f23fb8c2..ad8e0c6df4 100644
--- a/pageserver/src/http/routes.rs
+++ b/pageserver/src/http/routes.rs
@@ -2080,6 +2080,16 @@ async fn put_io_engine_handler(
json_response(StatusCode::OK, ())
}
+async fn put_walredo_process_kind(
+ mut r: Request
,
+ _cancel: CancellationToken,
+) -> Result, ApiError> {
+ check_permission(&r, None)?;
+ let kind: crate::walredo::ProcessKind = json_request(&mut r).await?;
+ crate::walredo::set_process_kind(kind);
+ json_response(StatusCode::OK, ())
+}
+
/// Polled by control plane.
///
/// See [`crate::utilization`].
@@ -2407,6 +2417,9 @@ pub fn make_router(
|r| api_handler(r, timeline_collect_keyspace),
)
.put("/v1/io_engine", |r| api_handler(r, put_io_engine_handler))
+ .put("/v1/walredo_process_kind", |r| {
+ api_handler(r, put_walredo_process_kind)
+ })
.get("/v1/utilization", |r| api_handler(r, get_utilization))
.any(handler_404))
}
diff --git a/pageserver/src/metrics.rs b/pageserver/src/metrics.rs
index 075bb76a1b..bcee5613b6 100644
--- a/pageserver/src/metrics.rs
+++ b/pageserver/src/metrics.rs
@@ -1805,6 +1805,20 @@ impl Default for WalRedoProcessCounters {
pub(crate) static WAL_REDO_PROCESS_COUNTERS: Lazy =
Lazy::new(WalRedoProcessCounters::default);
+#[cfg(not(test))]
+pub(crate) mod wal_redo {
+ use super::*;
+
+ pub(crate) static PROCESS_KIND: Lazy = Lazy::new(|| {
+ register_uint_gauge_vec!(
+ "pageserver_wal_redo_process_kind",
+ "The configured process kind for walredo",
+ &["kind"],
+ )
+ .unwrap()
+ });
+}
+
/// Similar to `prometheus::HistogramTimer` but does not record on drop.
pub(crate) struct StorageTimeMetricsTimer {
metrics: StorageTimeMetrics,
diff --git a/pageserver/src/walredo.rs b/pageserver/src/walredo.rs
index 9c24389379..ef0b96622c 100644
--- a/pageserver/src/walredo.rs
+++ b/pageserver/src/walredo.rs
@@ -20,6 +20,7 @@
/// Process lifecycle and abstracction for the IPC protocol.
mod process;
+pub(crate) use process::{Kind as ProcessKind, set_kind as set_process_kind};
/// Code to apply [`NeonWalRecord`]s.
pub(crate) mod apply_neon;
@@ -53,7 +54,7 @@ pub struct PostgresRedoManager {
tenant_shard_id: TenantShardId,
conf: &'static PageServerConf,
last_redo_at: std::sync::Mutex