From dc5455fda678bd81c7feae1a1067605f55a4df20 Mon Sep 17 00:00:00 2001 From: Anthony Yeh Date: Tue, 7 Jan 2020 13:57:50 -0800 Subject: [PATCH] xtrabackup: Add a buffered reader in front of xtrabackup's stdout pipe. The buffered reader implements WriteTo(), which allows io.CopyN() to avoid allocating a new buffer every time. Signed-off-by: Anthony Yeh --- go/vt/mysqlctl/xtrabackupengine.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/go/vt/mysqlctl/xtrabackupengine.go b/go/vt/mysqlctl/xtrabackupengine.go index 08d18638bce..6572064fa86 100644 --- a/go/vt/mysqlctl/xtrabackupengine.go +++ b/go/vt/mysqlctl/xtrabackupengine.go @@ -328,7 +328,11 @@ func (be *XtrabackupEngine) backupFiles(ctx context.Context, params BackupParams // Enforce minimum block size. blockSize = 1024 } - if _, err := copyToStripes(destWriters, backupOut, blockSize); err != nil { + // Add a buffer in front of the raw stdout pipe so io.CopyN() can use the + // buffered reader's WriteTo() method instead of allocating a new buffer + // every time. + backupOutBuf := bufio.NewReaderSize(backupOut, int(blockSize)) + if _, err := copyToStripes(destWriters, backupOutBuf, blockSize); err != nil { return replicationPosition, vterrors.Wrap(err, "cannot copy output from xtrabackup command") }