mirror of
https://github.com/neondatabase/neon.git
synced 2026-06-02 13:00:37 +00:00
This PR stacks on https://github.com/neondatabase/neon/pull/6814 Observability: - Because we only persist a subset of our state, and our external API is pretty high level, it can be hard to get at the detail of what's going on internally (e.g. the IntentState of a shard). - Add debug endpoints for getting a full dump of all TenantState and SchedulerNode objects - Enrich the /control/v1/node listing endpoint to include full in-memory detail of `Node` rather than just the `NodePersistence` subset Consistency checks: - The storage controller maintains separate in-memory and on-disk states, by design. To catch subtle bugs, it is useful to occasionally cross-check these. - The Scheduler maintains reference counts for shard->node relationships, which could drift if there was a bug in IntentState: exhausively cross check them in tests.
68 lines
1.4 KiB
Rust
68 lines
1.4 KiB
Rust
use serde::{Deserialize, Serialize};
|
|
use utils::seqwait::MonotonicCounter;
|
|
|
|
mod compute_hook;
|
|
pub mod http;
|
|
pub mod metrics;
|
|
mod node;
|
|
pub mod persistence;
|
|
mod reconciler;
|
|
mod scheduler;
|
|
mod schema;
|
|
pub mod service;
|
|
mod tenant_state;
|
|
|
|
#[derive(Clone, Serialize, Deserialize, Debug)]
|
|
enum PlacementPolicy {
|
|
/// Cheapest way to attach a tenant: just one pageserver, no secondary
|
|
Single,
|
|
/// Production-ready way to attach a tenant: one attached pageserver and
|
|
/// some number of secondaries.
|
|
Double(usize),
|
|
/// Do not attach to any pageservers
|
|
Detached,
|
|
}
|
|
|
|
#[derive(Ord, PartialOrd, Eq, PartialEq, Copy, Clone, Serialize)]
|
|
struct Sequence(u64);
|
|
|
|
impl Sequence {
|
|
fn initial() -> Self {
|
|
Self(0)
|
|
}
|
|
}
|
|
|
|
impl std::fmt::Display for Sequence {
|
|
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
|
|
write!(f, "{}", self.0)
|
|
}
|
|
}
|
|
|
|
impl std::fmt::Debug for Sequence {
|
|
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
|
|
write!(f, "{}", self.0)
|
|
}
|
|
}
|
|
|
|
impl MonotonicCounter<Sequence> for Sequence {
|
|
fn cnt_advance(&mut self, v: Sequence) {
|
|
assert!(*self <= v);
|
|
*self = v;
|
|
}
|
|
fn cnt_value(&self) -> Sequence {
|
|
*self
|
|
}
|
|
}
|
|
|
|
impl Sequence {
|
|
fn next(&self) -> Sequence {
|
|
Sequence(self.0 + 1)
|
|
}
|
|
}
|
|
|
|
impl Default for PlacementPolicy {
|
|
fn default() -> Self {
|
|
PlacementPolicy::Double(1)
|
|
}
|
|
}
|