mirror of
https://github.com/postgresml/pgcat.git
synced 2026-03-27 10:46:30 +00:00
prep for query cancellation
This commit is contained in:
@@ -1,3 +1,6 @@
|
|||||||
|
#![allow(dead_code)]
|
||||||
|
#![allow(unused_variables)]
|
||||||
|
|
||||||
use bytes::{Buf, BufMut, BytesMut};
|
use bytes::{Buf, BufMut, BytesMut};
|
||||||
use tokio::io::{AsyncReadExt, BufReader};
|
use tokio::io::{AsyncReadExt, BufReader};
|
||||||
use tokio::net::tcp::{OwnedReadHalf, OwnedWriteHalf};
|
use tokio::net::tcp::{OwnedReadHalf, OwnedWriteHalf};
|
||||||
@@ -10,6 +13,9 @@ pub struct Server {
|
|||||||
read: BufReader<OwnedReadHalf>,
|
read: BufReader<OwnedReadHalf>,
|
||||||
write: OwnedWriteHalf,
|
write: OwnedWriteHalf,
|
||||||
buffer: BytesMut,
|
buffer: BytesMut,
|
||||||
|
server_info: BytesMut,
|
||||||
|
backend_id: i32,
|
||||||
|
secret_key: i32,
|
||||||
in_transaction: bool,
|
in_transaction: bool,
|
||||||
bad: bool,
|
bad: bool,
|
||||||
}
|
}
|
||||||
@@ -32,6 +38,10 @@ impl Server {
|
|||||||
|
|
||||||
startup(&mut stream, user, database).await?;
|
startup(&mut stream, user, database).await?;
|
||||||
|
|
||||||
|
let mut server_info = BytesMut::with_capacity(25);
|
||||||
|
let mut backend_id: i32 = 0;
|
||||||
|
let mut secret_key: i32 = 0;
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
let code = match stream.read_u8().await {
|
let code = match stream.read_u8().await {
|
||||||
Ok(code) => code as char,
|
Ok(code) => code as char,
|
||||||
@@ -88,14 +98,22 @@ impl Server {
|
|||||||
Ok(_) => (),
|
Ok(_) => (),
|
||||||
Err(_) => return Err(Error::SocketError),
|
Err(_) => return Err(Error::SocketError),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
server_info.put_u8(b'S');
|
||||||
|
server_info.put_i32(len);
|
||||||
|
server_info.put_slice(¶m[..]);
|
||||||
}
|
}
|
||||||
|
|
||||||
'K' => {
|
'K' => {
|
||||||
// TODO: save cancellation secret
|
// Query cancellation data.
|
||||||
let mut cancel_secret = vec![0u8; len as usize - 4];
|
backend_id = match stream.read_i32().await {
|
||||||
match stream.read_exact(&mut cancel_secret).await {
|
Ok(id) => id,
|
||||||
Ok(_) => (),
|
Err(err) => return Err(Error::SocketError),
|
||||||
Err(_) => return Err(Error::SocketError),
|
};
|
||||||
|
|
||||||
|
secret_key = match stream.read_i32().await {
|
||||||
|
Ok(id) => id,
|
||||||
|
Err(err) => return Err(Error::SocketError),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -114,6 +132,9 @@ impl Server {
|
|||||||
read: BufReader::new(read),
|
read: BufReader::new(read),
|
||||||
write: write,
|
write: write,
|
||||||
buffer: BytesMut::with_capacity(8196),
|
buffer: BytesMut::with_capacity(8196),
|
||||||
|
server_info: server_info,
|
||||||
|
backend_id: backend_id,
|
||||||
|
secret_key: secret_key,
|
||||||
in_transaction: false,
|
in_transaction: false,
|
||||||
bad: false,
|
bad: false,
|
||||||
});
|
});
|
||||||
@@ -204,6 +225,10 @@ impl Server {
|
|||||||
self.bad
|
self.bad
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn server_info(&self) -> BytesMut {
|
||||||
|
self.server_info.clone()
|
||||||
|
}
|
||||||
|
|
||||||
pub fn mark_bad(&mut self) {
|
pub fn mark_bad(&mut self) {
|
||||||
println!(">> Server marked bad");
|
println!(">> Server marked bad");
|
||||||
self.bad = true;
|
self.bad = true;
|
||||||
|
|||||||
Reference in New Issue
Block a user