mirror of
https://github.com/neondatabase/neon.git
synced 2026-01-17 02:12:56 +00:00
## Problem Spun off from https://github.com/neondatabase/neon/pull/6394 -- this PR is just the persistence parts and the changes that enable it to work nicely ## Summary of changes - Revert #6444 and #6450 - In neon_local, start a vanilla postgres instance for the attachment service to use. - Adopt `diesel` crate for database access in attachment service. This uses raw SQL migrations as the source of truth for the schema, so it's a soft dependency: we can switch libraries pretty easily. - Rewrite persistence.rs to use postgres (via diesel) instead of JSON. - Preserve JSON read+write at startup and shutdown: this enables using the JSON format in compatibility tests, so that we don't have to commit to our DB schema yet. - In neon_local, run database creation + migrations before starting attachment service - Run the initial reconciliation in Service::spawn in the background, so that the pageserver + attachment service don't get stuck waiting for each other to start, when restarting both together in a test.
51 lines
1.5 KiB
Rust
51 lines
1.5 KiB
Rust
use control_plane::attachment_service::{NodeAvailability, NodeSchedulingPolicy};
|
|
use utils::id::NodeId;
|
|
|
|
use crate::persistence::NodePersistence;
|
|
|
|
#[derive(Clone)]
|
|
pub(crate) struct Node {
|
|
pub(crate) id: NodeId,
|
|
|
|
pub(crate) availability: NodeAvailability,
|
|
pub(crate) scheduling: NodeSchedulingPolicy,
|
|
|
|
pub(crate) listen_http_addr: String,
|
|
pub(crate) listen_http_port: u16,
|
|
|
|
pub(crate) listen_pg_addr: String,
|
|
pub(crate) listen_pg_port: u16,
|
|
}
|
|
|
|
impl Node {
|
|
pub(crate) fn base_url(&self) -> String {
|
|
format!("http://{}:{}", self.listen_http_addr, self.listen_http_port)
|
|
}
|
|
|
|
/// Is this node elegible to have work scheduled onto it?
|
|
pub(crate) fn may_schedule(&self) -> bool {
|
|
match self.availability {
|
|
NodeAvailability::Active => {}
|
|
NodeAvailability::Offline => return false,
|
|
}
|
|
|
|
match self.scheduling {
|
|
NodeSchedulingPolicy::Active => true,
|
|
NodeSchedulingPolicy::Draining => false,
|
|
NodeSchedulingPolicy::Filling => true,
|
|
NodeSchedulingPolicy::Pause => false,
|
|
}
|
|
}
|
|
|
|
pub(crate) fn to_persistent(&self) -> NodePersistence {
|
|
NodePersistence {
|
|
node_id: self.id.0 as i64,
|
|
scheduling_policy: self.scheduling.into(),
|
|
listen_http_addr: self.listen_http_addr.clone(),
|
|
listen_http_port: self.listen_http_port as i32,
|
|
listen_pg_addr: self.listen_pg_addr.clone(),
|
|
listen_pg_port: self.listen_pg_port as i32,
|
|
}
|
|
}
|
|
}
|