diff --git a/src/bin/pg_verifybackup/pg_verifybackup.c b/src/bin/pg_verifybackup/pg_verifybackup.c index 935ab8fafa8..db79dd39103 100644 --- a/src/bin/pg_verifybackup/pg_verifybackup.c +++ b/src/bin/pg_verifybackup/pg_verifybackup.c @@ -131,6 +131,7 @@ main(int argc, char **argv) {"quiet", no_argument, NULL, 'q'}, {"skip-checksums", no_argument, NULL, 's'}, {"wal-path", required_argument, NULL, 'w'}, + {"wal-directory", required_argument, NULL, 'w'}, /* deprecated */ {NULL, 0, NULL, 0} }; diff --git a/src/bin/pg_waldump/archive_waldump.c b/src/bin/pg_waldump/archive_waldump.c index 1479efe61f5..f0cc42b18bf 100644 --- a/src/bin/pg_waldump/archive_waldump.c +++ b/src/bin/pg_waldump/archive_waldump.c @@ -236,6 +236,13 @@ free_archive_reader(XLogDumpPrivate *privateInfo) */ astreamer_free(privateInfo->archive_streamer); + /* Free the reusable read buffer. */ + if (privateInfo->archive_read_buf != NULL) + { + pg_free(privateInfo->archive_read_buf); + privateInfo->archive_read_buf = NULL; + } + /* Close the file. */ if (close(privateInfo->archive_fd) != 0) pg_log_error("could not close file \"%s\": %m", @@ -350,17 +357,17 @@ read_archive_wal_page(XLogDumpPrivate *privateInfo, XLogRecPtr targetPagePtr, } /* - * Should have either have successfully read all the requested bytes or - * reported a failure before this point. + * Should have successfully read all the requested bytes or reported a + * failure before this point. */ Assert(nbytes == 0); /* - * NB: We return the fixed value provided as input. Although we could - * return a boolean since we either successfully read the WAL page or - * raise an error, but the caller expects this value to be returned. The - * routine that reads WAL pages from the physical WAL file follows the - * same convention. + * NB: We return the fixed value provided as input. We could return a + * boolean since we either successfully read the WAL page or raise an + * error, but the caller expects this value to be returned. The routine + * that reads WAL pages from the physical WAL file follows the same + * convention. */ return count; } @@ -368,8 +375,8 @@ read_archive_wal_page(XLogDumpPrivate *privateInfo, XLogRecPtr targetPagePtr, /* * Clears the buffer of a WAL entry that is being ignored. This frees up memory * and prevents the accumulation of irrelevant WAL data. Additionally, - * conditionally setting cur_file within privateinfo to NULL ensures the - * archive streamer skips unnecessary copy operations + * conditionally setting cur_file within privateInfo to NULL ensures the + * archive streamer skips unnecessary copy operations. */ void free_archive_wal_entry(const char *fname, XLogDumpPrivate *privateInfo) @@ -498,11 +505,18 @@ static int read_archive_file(XLogDumpPrivate *privateInfo, Size count) { int rc; - char *buffer; - buffer = pg_malloc(count * sizeof(uint8)); + /* Allocate or grow the reusable read buffer as needed */ + if (privateInfo->archive_read_buf == NULL || + privateInfo->archive_read_buf_size < count) + { + if (privateInfo->archive_read_buf != NULL) + pg_free(privateInfo->archive_read_buf); + privateInfo->archive_read_buf = pg_malloc(count); + privateInfo->archive_read_buf_size = count; + } - rc = read(privateInfo->archive_fd, buffer, count); + rc = read(privateInfo->archive_fd, privateInfo->archive_read_buf, count); if (rc < 0) pg_fatal("could not read file \"%s\": %m", privateInfo->archive_name); @@ -513,8 +527,8 @@ read_archive_file(XLogDumpPrivate *privateInfo, Size count) */ if (rc > 0) astreamer_content(privateInfo->archive_streamer, NULL, - buffer, rc, ASTREAMER_UNKNOWN); - pg_free(buffer); + privateInfo->archive_read_buf, rc, + ASTREAMER_UNKNOWN); return rc; } diff --git a/src/bin/pg_waldump/pg_waldump.c b/src/bin/pg_waldump/pg_waldump.c index 4b438b53ead..e970b007883 100644 --- a/src/bin/pg_waldump/pg_waldump.c +++ b/src/bin/pg_waldump/pg_waldump.c @@ -491,7 +491,7 @@ TarWALDumpReadPage(XLogReaderState *state, XLogRecPtr targetPagePtr, int reqLen, if (!XLByteInSeg(targetPagePtr, curSegNo, WalSegSz)) { char fname[MAXFNAMELEN]; - XLogSegNo nextSegNo; + XLogSegNo nextSegNo; /* * Calculate the next WAL segment to be decoded from the given page @@ -509,9 +509,10 @@ TarWALDumpReadPage(XLogReaderState *state, XLogRecPtr targetPagePtr, int reqLen, } /* - * If in pre-reading mode (prior to actual decoding), do not delete any - * entries that might be requested again once the decoding loop starts. - * For more details, see the comments in read_archive_wal_page(). + * If in pre-reading mode (prior to actual decoding), do not delete + * any entries that might be requested again once the decoding loop + * starts. For more details, see the comments in + * read_archive_wal_page(). */ if (private->decoding_started && curSegNo < nextSegNo) { @@ -908,7 +909,7 @@ main(int argc, char **argv) char *waldir = NULL; char *walpath = NULL; char *errormsg; - pg_compress_algorithm compression; + pg_compress_algorithm compression = PG_COMPRESSION_NONE; static struct option long_options[] = { {"bkp-details", no_argument, NULL, 'b'}, @@ -1317,7 +1318,6 @@ main(int argc, char **argv) segno = endsegno; } - if (!XLByteInSeg(private.endptr, segno, private.segsize) && private.endptr != (segno + 1) * private.segsize) { diff --git a/src/bin/pg_waldump/pg_waldump.h b/src/bin/pg_waldump/pg_waldump.h index 6c242b7fcbc..1097390d575 100644 --- a/src/bin/pg_waldump/pg_waldump.h +++ b/src/bin/pg_waldump/pg_waldump.h @@ -36,6 +36,8 @@ typedef struct XLogDumpPrivate int archive_fd; /* File descriptor for the open tar file */ astreamer *archive_streamer; + char *archive_read_buf; /* Reusable read buffer for archive I/O */ + Size archive_read_buf_size; /* What the archive streamer is currently reading */ struct ArchivedWALFile *cur_file; diff --git a/src/common/compression.c b/src/common/compression.c index f117e21237f..fb27501d297 100644 --- a/src/common/compression.c +++ b/src/common/compression.c @@ -46,7 +46,7 @@ static bool expect_boolean_value(char *keyword, char *value, * sets *algorithm if the name is recognized. Otherwise returns false. */ bool -parse_tar_compress_algorithm(char *fname, pg_compress_algorithm *algorithm) +parse_tar_compress_algorithm(const char *fname, pg_compress_algorithm *algorithm) { int fname_len = strlen(fname); diff --git a/src/include/common/compression.h b/src/include/common/compression.h index 50f21656b88..f99c747cdd3 100644 --- a/src/include/common/compression.h +++ b/src/include/common/compression.h @@ -41,7 +41,7 @@ typedef struct pg_compress_specification extern void parse_compress_options(const char *option, char **algorithm, char **detail); -extern bool parse_tar_compress_algorithm(char *fname, +extern bool parse_tar_compress_algorithm(const char *fname, pg_compress_algorithm *algorithm); extern bool parse_compress_algorithm(char *name, pg_compress_algorithm *algorithm); extern const char *get_compress_algorithm_name(pg_compress_algorithm algorithm);