mirror of
https://github.com/postgres/postgres.git
synced 2025-06-25 01:02:05 +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:
@ -757,26 +757,20 @@ gistRelocateBuildBuffersOnSplit(GISTBuildBuffers *gfbb, GISTSTATE *giststate,
|
||||
static void
|
||||
ReadTempFileBlock(BufFile *file, long blknum, void *ptr)
|
||||
{
|
||||
size_t nread;
|
||||
|
||||
if (BufFileSeekBlock(file, blknum) != 0)
|
||||
elog(ERROR, "could not seek temporary file: %m");
|
||||
if (BufFileRead(file, ptr, BLCKSZ) != BLCKSZ)
|
||||
elog(ERROR, "could not read temporary file: %m");
|
||||
elog(ERROR, "could not seek to block %ld in temporary file", blknum);
|
||||
nread = BufFileRead(file, ptr, BLCKSZ);
|
||||
if (nread != BLCKSZ)
|
||||
elog(ERROR, "could not read temporary file: read only %zu of %zu bytes",
|
||||
nread, (size_t) BLCKSZ);
|
||||
}
|
||||
|
||||
static void
|
||||
WriteTempFileBlock(BufFile *file, long blknum, void *ptr)
|
||||
{
|
||||
if (BufFileSeekBlock(file, blknum) != 0)
|
||||
elog(ERROR, "could not seek temporary file: %m");
|
||||
if (BufFileWrite(file, ptr, BLCKSZ) != BLCKSZ)
|
||||
{
|
||||
/*
|
||||
* the other errors in Read/WriteTempFileBlock shouldn't happen, but
|
||||
* an error at write can easily happen if you run out of disk space.
|
||||
*/
|
||||
ereport(ERROR,
|
||||
(errcode_for_file_access(),
|
||||
errmsg("could not write block %ld of temporary file: %m",
|
||||
blknum)));
|
||||
}
|
||||
elog(ERROR, "could not seek to block %ld in temporary file", blknum);
|
||||
BufFileWrite(file, ptr, BLCKSZ);
|
||||
}
|
||||
|
Reference in New Issue
Block a user