prep for query cancellation

This commit is contained in:
Lev Kokotov
2022-02-03 17:48:37 -08:00
parent 4146245f15
commit baf2852f03

View File

@@ -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(&param[..]);
} }
'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;