I recently noticed this in a customer log file: ERROR: could not read from hash-join temporary file: Success
The problem is we're reporting with %m when the problem is a partial read or write. I propose the attached patch to solve it: report "wrote only X of X bytes". This caused a lot of other trouble, the cause of which I've been unable to pinpoint as yet. But in the meantime, this is already a small improvement. -- Álvaro Herrera
diff --git a/src/backend/executor/nodeHashjoin.c b/src/backend/executor/nodeHashjoin.c index d13efc4d98..377554772b 100644 --- a/src/backend/executor/nodeHashjoin.c +++ b/src/backend/executor/nodeHashjoin.c @@ -882,16 +882,26 @@ ExecHashJoinSaveTuple(MinimalTuple tuple, uint32 hashvalue, } written = BufFileWrite(file, (void *) &hashvalue, sizeof(uint32)); + if (written < 0) + ereport(ERROR, + (errcode_for_file_access(), + errmsg("could not write to hash-join temporary file: %m"))); if (written != sizeof(uint32)) ereport(ERROR, (errcode_for_file_access(), - errmsg("could not write to hash-join temporary file: %m"))); + errmsg("could not write to hash-join temporary file: wrote only %d of %d bytes", + (int) written, (int) sizeof(uint32)))); written = BufFileWrite(file, (void *) tuple, tuple->t_len); - if (written != tuple->t_len) + if (written < 0) ereport(ERROR, (errcode_for_file_access(), errmsg("could not write to hash-join temporary file: %m"))); + if (written != tuple->t_len) + ereport(ERROR, + (errcode_for_file_access(), + errmsg("could not write to hash-join temporary file: wrote only %d of %d bytes", + (int) written, (int) tuple->t_len))); } /* @@ -929,20 +939,30 @@ ExecHashJoinGetSavedTuple(HashJoinState *hjstate, ExecClearTuple(tupleSlot); return NULL; } - if (nread != sizeof(header)) + if (nread < 0) ereport(ERROR, (errcode_for_file_access(), errmsg("could not read from hash-join temporary file: %m"))); + if (nread != sizeof(header)) + ereport(ERROR, + (errcode_for_file_access(), + errmsg("could not read from hash-join temporary file: read only %d of %d bytes", + (int) nread, (int) sizeof(header)))); *hashvalue = header[0]; tuple = (MinimalTuple) palloc(header[1]); tuple->t_len = header[1]; nread = BufFileRead(file, (void *) ((char *) tuple + sizeof(uint32)), header[1] - sizeof(uint32)); - if (nread != header[1] - sizeof(uint32)) + if (nread < 0) ereport(ERROR, (errcode_for_file_access(), errmsg("could not read from hash-join temporary file: %m"))); + if (nread != header[1] - sizeof(uint32)) + ereport(ERROR, + (errcode_for_file_access(), + errmsg("could not read from hash-join temporary file: read only %d of %d bytes", + (int) nread, (int) (header[1] - sizeof(uint32))))); return ExecStoreMinimalTuple(tuple, tupleSlot, true); }