mirror of
https://github.com/postgresml/pgcat.git
synced 2026-03-25 18:06:29 +00:00
Buffer client CopyData messages (#284)
Buffers CopyData messages and removes buffer clone for the sync message
This commit is contained in:
@@ -861,7 +861,7 @@ where
|
||||
'Q' => {
|
||||
debug!("Sending query to server");
|
||||
|
||||
self.send_and_receive_loop(code, message, server, &address, &pool)
|
||||
self.send_and_receive_loop(code, Some(&message), server, &address, &pool)
|
||||
.await?;
|
||||
|
||||
if !server.in_transaction() {
|
||||
@@ -931,14 +931,8 @@ where
|
||||
}
|
||||
}
|
||||
|
||||
self.send_and_receive_loop(
|
||||
code,
|
||||
self.buffer.clone(),
|
||||
server,
|
||||
&address,
|
||||
&pool,
|
||||
)
|
||||
.await?;
|
||||
self.send_and_receive_loop(code, None, server, &address, &pool)
|
||||
.await?;
|
||||
|
||||
self.buffer.clear();
|
||||
|
||||
@@ -955,21 +949,32 @@ where
|
||||
|
||||
// CopyData
|
||||
'd' => {
|
||||
// Forward the data to the server,
|
||||
// don't buffer it since it can be rather large.
|
||||
self.send_server_message(server, message, &address, &pool)
|
||||
.await?;
|
||||
self.buffer.put(&message[..]);
|
||||
|
||||
// Want to limit buffer size
|
||||
if self.buffer.len() > 8196 {
|
||||
// Forward the data to the server,
|
||||
self.send_server_message(server, &self.buffer, &address, &pool)
|
||||
.await?;
|
||||
self.buffer.clear();
|
||||
}
|
||||
}
|
||||
|
||||
// CopyDone or CopyFail
|
||||
// Copy is done, successfully or not.
|
||||
'c' | 'f' => {
|
||||
self.send_server_message(server, message, &address, &pool)
|
||||
// We may already have some copy data in the buffer, add this message to buffer
|
||||
self.buffer.put(&message[..]);
|
||||
|
||||
self.send_server_message(server, &self.buffer, &address, &pool)
|
||||
.await?;
|
||||
|
||||
// Clear the buffer
|
||||
self.buffer.clear();
|
||||
|
||||
let response = self.receive_server_message(server, &address, &pool).await?;
|
||||
|
||||
match write_all_half(&mut self.write, response).await {
|
||||
match write_all_half(&mut self.write, &response).await {
|
||||
Ok(_) => (),
|
||||
Err(err) => {
|
||||
server.mark_bad();
|
||||
@@ -1016,13 +1021,18 @@ where
|
||||
async fn send_and_receive_loop(
|
||||
&mut self,
|
||||
code: char,
|
||||
message: BytesMut,
|
||||
message: Option<&BytesMut>,
|
||||
server: &mut Server,
|
||||
address: &Address,
|
||||
pool: &ConnectionPool,
|
||||
) -> Result<(), Error> {
|
||||
debug!("Sending {} to server", code);
|
||||
|
||||
let message = match message {
|
||||
Some(message) => message,
|
||||
None => &self.buffer,
|
||||
};
|
||||
|
||||
self.send_server_message(server, message, address, pool)
|
||||
.await?;
|
||||
|
||||
@@ -1032,7 +1042,7 @@ where
|
||||
loop {
|
||||
let response = self.receive_server_message(server, address, pool).await?;
|
||||
|
||||
match write_all_half(&mut self.write, response).await {
|
||||
match write_all_half(&mut self.write, &response).await {
|
||||
Ok(_) => (),
|
||||
Err(err) => {
|
||||
server.mark_bad();
|
||||
@@ -1058,7 +1068,7 @@ where
|
||||
async fn send_server_message(
|
||||
&self,
|
||||
server: &mut Server,
|
||||
message: BytesMut,
|
||||
message: &BytesMut,
|
||||
address: &Address,
|
||||
pool: &ConnectionPool,
|
||||
) -> Result<(), Error> {
|
||||
|
||||
Reference in New Issue
Block a user