mirror of
https://github.com/neondatabase/neon.git
synced 2026-01-13 16:32:56 +00:00
## Problem We don't detect if safekeeper migration fails after the the commiting the membership configuration to the database. As a result, we might leave stale timelines on excluded safekeepers and do not notify cplane/safekepeers about new configuration. - Implements solution proposed in https://github.com/neondatabase/neon/pull/12432 - Closes: https://github.com/neondatabase/neon/issues/12192 - Closes: [LKB-944](https://databricks.atlassian.net/browse/LKB-944) ## Summary of changes - Add `sk_set_notified_generation` column to `timelines` database - Update `*_notified_generation` in database during the finish state. - Commit reconciliation requests to database atomically with membership configuration. - Reload pending ops and retry "finish" step if we detect `*_notified_generation` mismatch. - Add failpoints and test that we handle failures well
137 lines
3.3 KiB
Rust
137 lines
3.3 KiB
Rust
// @generated automatically by Diesel CLI.
|
|
|
|
pub mod sql_types {
|
|
#[derive(diesel::query_builder::QueryId, diesel::sql_types::SqlType)]
|
|
#[diesel(postgres_type(name = "pg_lsn", schema = "pg_catalog"))]
|
|
pub struct PgLsn;
|
|
}
|
|
|
|
diesel::table! {
|
|
controllers (address, started_at) {
|
|
address -> Varchar,
|
|
started_at -> Timestamptz,
|
|
}
|
|
}
|
|
|
|
diesel::table! {
|
|
hadron_safekeepers (sk_node_id) {
|
|
sk_node_id -> Int8,
|
|
listen_http_addr -> Varchar,
|
|
listen_http_port -> Int4,
|
|
listen_pg_addr -> Varchar,
|
|
listen_pg_port -> Int4,
|
|
}
|
|
}
|
|
|
|
diesel::table! {
|
|
hadron_timeline_safekeepers (timeline_id, sk_node_id) {
|
|
timeline_id -> Varchar,
|
|
sk_node_id -> Int8,
|
|
legacy_endpoint_id -> Nullable<Uuid>,
|
|
}
|
|
}
|
|
|
|
diesel::table! {
|
|
metadata_health (tenant_id, shard_number, shard_count) {
|
|
tenant_id -> Varchar,
|
|
shard_number -> Int4,
|
|
shard_count -> Int4,
|
|
healthy -> Bool,
|
|
last_scrubbed_at -> Timestamptz,
|
|
}
|
|
}
|
|
|
|
diesel::table! {
|
|
nodes (node_id) {
|
|
node_id -> Int8,
|
|
scheduling_policy -> Varchar,
|
|
listen_http_addr -> Varchar,
|
|
listen_http_port -> Int4,
|
|
listen_pg_addr -> Varchar,
|
|
listen_pg_port -> Int4,
|
|
availability_zone_id -> Varchar,
|
|
listen_https_port -> Nullable<Int4>,
|
|
lifecycle -> Varchar,
|
|
listen_grpc_addr -> Nullable<Varchar>,
|
|
listen_grpc_port -> Nullable<Int4>,
|
|
}
|
|
}
|
|
|
|
diesel::table! {
|
|
safekeeper_timeline_pending_ops (tenant_id, timeline_id, sk_id) {
|
|
sk_id -> Int8,
|
|
tenant_id -> Varchar,
|
|
timeline_id -> Varchar,
|
|
generation -> Int4,
|
|
op_kind -> Varchar,
|
|
}
|
|
}
|
|
|
|
diesel::table! {
|
|
safekeepers (id) {
|
|
id -> Int8,
|
|
region_id -> Text,
|
|
version -> Int8,
|
|
host -> Text,
|
|
port -> Int4,
|
|
http_port -> Int4,
|
|
availability_zone_id -> Text,
|
|
scheduling_policy -> Varchar,
|
|
https_port -> Nullable<Int4>,
|
|
}
|
|
}
|
|
|
|
diesel::table! {
|
|
tenant_shards (tenant_id, shard_number, shard_count) {
|
|
tenant_id -> Varchar,
|
|
shard_number -> Int4,
|
|
shard_count -> Int4,
|
|
shard_stripe_size -> Int4,
|
|
generation -> Nullable<Int4>,
|
|
generation_pageserver -> Nullable<Int8>,
|
|
placement_policy -> Varchar,
|
|
splitting -> Int2,
|
|
config -> Text,
|
|
scheduling_policy -> Varchar,
|
|
preferred_az_id -> Nullable<Varchar>,
|
|
}
|
|
}
|
|
|
|
diesel::table! {
|
|
timeline_imports (tenant_id, timeline_id) {
|
|
tenant_id -> Varchar,
|
|
timeline_id -> Varchar,
|
|
shard_statuses -> Jsonb,
|
|
}
|
|
}
|
|
|
|
diesel::table! {
|
|
use diesel::sql_types::*;
|
|
use super::sql_types::PgLsn;
|
|
|
|
timelines (tenant_id, timeline_id) {
|
|
tenant_id -> Varchar,
|
|
timeline_id -> Varchar,
|
|
start_lsn -> PgLsn,
|
|
generation -> Int4,
|
|
sk_set -> Array<Nullable<Int8>>,
|
|
new_sk_set -> Nullable<Array<Nullable<Int8>>>,
|
|
cplane_notified_generation -> Int4,
|
|
deleted_at -> Nullable<Timestamptz>,
|
|
sk_set_notified_generation -> Int4,
|
|
}
|
|
}
|
|
|
|
diesel::allow_tables_to_appear_in_same_query!(
|
|
controllers,
|
|
hadron_safekeepers,
|
|
hadron_timeline_safekeepers,
|
|
metadata_health,
|
|
nodes,
|
|
safekeeper_timeline_pending_ops,
|
|
safekeepers,
|
|
tenant_shards,
|
|
timeline_imports,
|
|
timelines,
|
|
);
|