mirror of
https://github.com/neondatabase/neon.git
synced 2026-05-27 10:00:38 +00:00
## Problem https://github.com/neondatabase/cloud/issues/30539 If the current leader cancels the `call` function, then it has removed the jobs from the queue, but will never finish sending the responses. Because of this, it is not cancellation safe. ## Summary of changes Document these functions as not cancellation safe. Move cancellation of the queued jobs into the queue itself. ## Alternatives considered 1. We could spawn the task that runs the batch, since that won't get cancelled. * This requires `fn call(self: Arc<Self>)` or `fn call(&'static self)`. 2. We could add another scopeguard and return the requests back to the queue. * This requires that requests are always retry safe, and also requires requests to be `Clone`.
37 lines
845 B
Rust
37 lines
845 B
Rust
use crate::pqproto::CancelKeyData;
|
|
|
|
pub mod keyspace {
|
|
pub const CANCEL_PREFIX: &str = "cancel";
|
|
}
|
|
|
|
#[derive(Clone, Debug, Eq, PartialEq)]
|
|
pub(crate) enum KeyPrefix {
|
|
Cancel(CancelKeyData),
|
|
}
|
|
|
|
impl KeyPrefix {
|
|
pub(crate) fn build_redis_key(&self) -> String {
|
|
match self {
|
|
KeyPrefix::Cancel(key) => {
|
|
let id = key.0.get();
|
|
let keyspace = keyspace::CANCEL_PREFIX;
|
|
format!("{keyspace}:{id:x}")
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod tests {
|
|
use super::*;
|
|
use crate::pqproto::id_to_cancel_key;
|
|
|
|
#[test]
|
|
fn test_build_redis_key() {
|
|
let cancel_key: KeyPrefix = KeyPrefix::Cancel(id_to_cancel_key(12345 << 32 | 54321));
|
|
|
|
let redis_key = cancel_key.build_redis_key();
|
|
assert_eq!(redis_key, "cancel:30390000d431");
|
|
}
|
|
}
|