mirror of
https://github.com/neondatabase/neon.git
synced 2026-01-04 03:52:56 +00:00
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:
@@ -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);
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user