safekeeper: don't allocate send buffers on stack (#9644)

## Problem

While experimenting with `MAX_SEND_SIZE` for benchmarking, I saw stack
overflows when increasing it to 1 MB. Turns out a few buffers of this
size are stack-allocated rather than heap-allocated. Even at the default
128 KB size, that's a bit large to allocate on the stack.

## Summary of changes

Heap-allocate buffers of size `MAX_SEND_SIZE`.
This commit is contained in:
Erik Grinaker
2024-11-05 18:05:30 +01:00
committed by GitHub
parent 2f1a56c8f9
commit babfeb70ba
3 changed files with 4 additions and 4 deletions

View File

@@ -172,7 +172,7 @@ async fn copy_disk_segments(
) -> Result<()> {
let mut wal_reader = tli.get_walreader(start_lsn).await?;
let mut buf = [0u8; MAX_SEND_SIZE];
let mut buf = vec![0u8; MAX_SEND_SIZE];
let first_segment = start_lsn.segment_number(wal_seg_size);
let last_segment = end_lsn.segment_number(wal_seg_size);

View File

@@ -383,7 +383,7 @@ pub async fn calculate_digest(
let mut wal_reader = tli.get_walreader(request.from_lsn).await?;
let mut hasher = Sha256::new();
let mut buf = [0u8; MAX_SEND_SIZE];
let mut buf = vec![0u8; MAX_SEND_SIZE];
let mut bytes_left = (request.until_lsn.0 - request.from_lsn.0) as usize;
while bytes_left > 0 {

View File

@@ -467,7 +467,7 @@ impl SafekeeperPostgresHandler {
end_watch,
ws_guard: ws_guard.clone(),
wal_reader,
send_buf: [0; MAX_SEND_SIZE],
send_buf: vec![0u8; MAX_SEND_SIZE],
};
let mut reply_reader = ReplyReader {
reader,
@@ -548,7 +548,7 @@ struct WalSender<'a, IO> {
ws_guard: Arc<WalSenderGuard>,
wal_reader: WalReader,
// buffer for readling WAL into to send it
send_buf: [u8; MAX_SEND_SIZE],
send_buf: Vec<u8>,
}
const POLL_STATE_TIMEOUT: Duration = Duration::from_secs(1);