Buffer client CopyData messages (#284)

Buffers CopyData messages and removes buffer clone for the sync message
This commit is contained in:
zainkabani
2023-01-17 20:39:55 -05:00
committed by GitHub
parent 7894bba59b
commit 85ac3ef9a5
4 changed files with 44 additions and 34 deletions

View File

@@ -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> {