1
0
mirror of https://github.com/postgres/postgres.git synced 2025-11-19 13:42:17 +03:00

Fix buffile.c error handling.

Convert buffile.c error handling to use ereport.  This fixes cases where
I/O errors were indistinguishable from EOF or not reported.  Also remove
"%m" from error messages where errno would be bogus.  While we're
modifying those strings, add block numbers and short read byte counts
where appropriate.

Back-patch to all supported releases.

Reported-by: Amit Khandekar <amitdkhan.pg@gmail.com>
Reviewed-by: Melanie Plageman <melanieplageman@gmail.com>
Reviewed-by: Alvaro Herrera <alvherre@2ndquadrant.com>
Reviewed-by: Robert Haas <robertmhaas@gmail.com>
Reviewed-by: Ibrar Ahmed <ibrar.ahmad@gmail.com>
Reviewed-by: Michael Paquier <michael@paquier.xyz>
Discussion: https://postgr.es/m/CA%2BhUKGJE04G%3D8TLK0DLypT_27D9dR8F1RQgNp0jK6qR0tZGWOw%40mail.gmail.com
This commit is contained in:
Thomas Munro
2020-06-16 13:50:56 +12:00
parent 4c5cf54314
commit 7897e3bb90
7 changed files with 88 additions and 110 deletions

View File

@@ -196,14 +196,9 @@ static void
sts_flush_chunk(SharedTuplestoreAccessor *accessor)
{
size_t size;
size_t written;
size = STS_CHUNK_PAGES * BLCKSZ;
written = BufFileWrite(accessor->write_file, accessor->write_chunk, size);
if (written != size)
ereport(ERROR,
(errcode_for_file_access(),
errmsg("could not write to temporary file: %m")));
BufFileWrite(accessor->write_file, accessor->write_chunk, size);
memset(accessor->write_chunk, 0, size);
accessor->write_pointer = &accessor->write_chunk->data[0];
accessor->sts->participants[accessor->participant].npages +=
@@ -555,6 +550,7 @@ sts_parallel_scan_next(SharedTuplestoreAccessor *accessor, void *meta_data)
if (!eof)
{
SharedTuplestoreChunk chunk_header;
size_t nread;
/* Make sure we have the file open. */
if (accessor->read_file == NULL)
@@ -570,14 +566,15 @@ sts_parallel_scan_next(SharedTuplestoreAccessor *accessor, void *meta_data)
if (BufFileSeekBlock(accessor->read_file, read_page) != 0)
ereport(ERROR,
(errcode_for_file_access(),
errmsg("could not read from shared tuplestore temporary file"),
errdetail_internal("Could not seek to next block.")));
if (BufFileRead(accessor->read_file, &chunk_header,
STS_CHUNK_HEADER_SIZE) != STS_CHUNK_HEADER_SIZE)
errmsg("could not seek block %u in shared tuplestore temporary file",
read_page)));
nread = BufFileRead(accessor->read_file, &chunk_header,
STS_CHUNK_HEADER_SIZE);
if (nread != STS_CHUNK_HEADER_SIZE)
ereport(ERROR,
(errcode_for_file_access(),
errmsg("could not read from shared tuplestore temporary file"),
errdetail_internal("Short read while reading chunk header.")));
errmsg("could not read from shared tuplestore temporary file: read only %zu of %zu bytes",
nread, STS_CHUNK_HEADER_SIZE)));
/*
* If this is an overflow chunk, we skip it and any following