mirror of
https://github.com/neondatabase/neon.git
synced 2026-05-16 04:30:38 +00:00
Part of getpage@lsn benchmark epic: https://github.com/neondatabase/neon/issues/5771 This PR moves the control plane's spread-all-over-the-place client for the pageserver management API into a separate module within the pageserver crate. I need that client to be async in my benchmarking work, so, this PR switches to the async version of `reqwest`. That is also the right direction generally IMO. The switch to async in turn mandated converting most of the `control_plane/` code to async. Note that some of the client methods should be taking `TenantShardId` instead of `TenantId`, but, none of the callers seem to be sharding-aware. Leaving that for another time: https://github.com/neondatabase/neon/issues/6154
58 lines
1.8 KiB
Rust
58 lines
1.8 KiB
Rust
//! Code to manage the storage broker
|
|
//!
|
|
//! In the local test environment, the data for each safekeeper is stored in
|
|
//!
|
|
//! ```text
|
|
//! .neon/safekeepers/<safekeeper id>
|
|
//! ```
|
|
use anyhow::Context;
|
|
|
|
use camino::Utf8PathBuf;
|
|
|
|
use crate::{background_process, local_env};
|
|
|
|
pub async fn start_broker_process(env: &local_env::LocalEnv) -> anyhow::Result<()> {
|
|
let broker = &env.broker;
|
|
let listen_addr = &broker.listen_addr;
|
|
|
|
print!("Starting neon broker at {}", listen_addr);
|
|
|
|
let args = [format!("--listen-addr={listen_addr}")];
|
|
|
|
let client = reqwest::Client::new();
|
|
background_process::start_process(
|
|
"storage_broker",
|
|
&env.base_data_dir,
|
|
&env.storage_broker_bin(),
|
|
args,
|
|
[],
|
|
background_process::InitialPidFile::Create(storage_broker_pid_file_path(env)),
|
|
|| async {
|
|
let url = broker.client_url();
|
|
let status_url = url.join("status").with_context(|| {
|
|
format!("Failed to append /status path to broker endpoint {url}")
|
|
})?;
|
|
let request = client
|
|
.get(status_url)
|
|
.build()
|
|
.with_context(|| format!("Failed to construct request to broker endpoint {url}"))?;
|
|
match client.execute(request).await {
|
|
Ok(resp) => Ok(resp.status().is_success()),
|
|
Err(_) => Ok(false),
|
|
}
|
|
},
|
|
)
|
|
.await
|
|
.context("Failed to spawn storage_broker subprocess")?;
|
|
Ok(())
|
|
}
|
|
|
|
pub fn stop_broker_process(env: &local_env::LocalEnv) -> anyhow::Result<()> {
|
|
background_process::stop_process(true, "storage_broker", &storage_broker_pid_file_path(env))
|
|
}
|
|
|
|
fn storage_broker_pid_file_path(env: &local_env::LocalEnv) -> Utf8PathBuf {
|
|
Utf8PathBuf::from_path_buf(env.base_data_dir.join("storage_broker.pid"))
|
|
.expect("non-Unicode path")
|
|
}
|