mirror of
https://github.com/neondatabase/neon.git
synced 2025-12-26 07:39:58 +00:00
## Problem The current deletion operation is synchronous and blocking, which is unsuitable for potentially long-running tasks like. In such cases, the standard HTTP request-response pattern is not a good fit. ## Summary of Changes - Added new `storcon_cli` commands: `NodeStartDelete` and `NodeCancelDelete` to initiate and cancel deletion asynchronously. - Added corresponding `storcon` HTTP handlers to support the new start/cancel deletion flow. - Introduced a new type of background operation: `Delete`, to track and manage the deletion process outside the request lifecycle. --------- Co-authored-by: Aleksandr Sarantsev <aleksandr.sarantsev@databricks.com>
76 lines
1.8 KiB
Rust
76 lines
1.8 KiB
Rust
use std::borrow::Cow;
|
|
use std::fmt::{Debug, Display};
|
|
|
|
use tokio_util::sync::CancellationToken;
|
|
use utils::id::NodeId;
|
|
|
|
pub(crate) const MAX_RECONCILES_PER_OPERATION: usize = 64;
|
|
|
|
#[derive(Copy, Clone)]
|
|
pub(crate) struct Delete {
|
|
pub(crate) node_id: NodeId,
|
|
}
|
|
|
|
#[derive(Copy, Clone)]
|
|
pub(crate) struct Drain {
|
|
pub(crate) node_id: NodeId,
|
|
}
|
|
|
|
#[derive(Copy, Clone)]
|
|
pub(crate) struct Fill {
|
|
pub(crate) node_id: NodeId,
|
|
}
|
|
|
|
#[derive(Copy, Clone)]
|
|
pub(crate) enum Operation {
|
|
Delete(Delete),
|
|
Drain(Drain),
|
|
Fill(Fill),
|
|
}
|
|
|
|
#[derive(Debug, thiserror::Error)]
|
|
pub(crate) enum OperationError {
|
|
#[error("Node state changed during operation: {0}")]
|
|
NodeStateChanged(Cow<'static, str>),
|
|
#[error("Operation finalize error: {0}")]
|
|
FinalizeError(Cow<'static, str>),
|
|
#[error("Operation cancelled")]
|
|
Cancelled,
|
|
#[error("Impossible constraint error: {0}")]
|
|
ImpossibleConstraint(Cow<'static, str>),
|
|
}
|
|
|
|
pub(crate) struct OperationHandler {
|
|
pub(crate) operation: Operation,
|
|
#[allow(unused)]
|
|
pub(crate) cancel: CancellationToken,
|
|
}
|
|
|
|
impl Display for Delete {
|
|
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
|
|
write!(f, "delete {}", self.node_id)
|
|
}
|
|
}
|
|
|
|
impl Display for Drain {
|
|
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
|
|
write!(f, "drain {}", self.node_id)
|
|
}
|
|
}
|
|
|
|
impl Display for Fill {
|
|
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
|
|
write!(f, "fill {}", self.node_id)
|
|
}
|
|
}
|
|
|
|
impl Display for Operation {
|
|
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
|
|
match self {
|
|
Operation::Delete(op) => write!(f, "{op}"),
|
|
Operation::Drain(op) => write!(f, "{op}"),
|
|
Operation::Fill(op) => write!(f, "{op}"),
|
|
}
|
|
}
|
|
}
|