It looks like whoever wrote the astreamer (nee bbstreamer) code
thought that pg_log_error() is equivalent to elog(ERROR), but
it's not; it just prints a message. So all these places tried to
continue on after a compression or decompression error return,
with the inevitable result being garbage output and possibly
cascading error messages. We should use pg_fatal() instead.
These error conditions are probably pretty unlikely in practice,
which no doubt accounts for the lack of field complaints.
Author: Tom Lane <tgl@sss.pgh.pa.us>
Reviewed-by: Chao Li <li.evan.chao@gmail.com>
Discussion: https://postgr.es/m/
1531718.
1772644615@sss.pgh.pa.us
Backpatch-through: 15
size_t required;
size_t status;
int ret;
+ bool success = true;
fp = state->fp;
if (state->inited)
{
errno = (errno) ? errno : ENOSPC;
pg_log_error("could not write to output file: %m");
+ success = false;
}
state->bufdata = 0;
}
{
pg_log_error("could not end compression: %s",
LZ4F_getErrorName(status));
+ success = false;
}
else
state->bufdata += status;
{
errno = (errno) ? errno : ENOSPC;
pg_log_error("could not write to output file: %m");
+ success = false;
}
status = LZ4F_freeCompressionContext(state->ctx);
if (LZ4F_isError(status))
+ {
pg_log_error("could not end compression: %s",
LZ4F_getErrorName(status));
+ success = false;
+ }
}
else
{
status = LZ4F_freeDecompressionContext(state->dtx);
if (LZ4F_isError(status))
+ {
pg_log_error("could not end decompression: %s",
LZ4F_getErrorName(status));
+ success = false;
+ }
pg_free(state->outbuf);
}
if (ret != 0)
{
pg_log_error("could not close file: %m");
- return false;
+ success = false;
}
- return true;
+ return success;
}
static bool
res = inflate(zs, Z_NO_FLUSH);
if (res == Z_STREAM_ERROR)
- pg_log_error("could not decompress data: %s", zs->msg);
+ pg_fatal("could not decompress data: %s", zs->msg);
mystreamer->bytes_written =
mystreamer->base.bbs_buffer.maxlen - zs->avail_out;
ctxError = LZ4F_createCompressionContext(&streamer->cctx, LZ4F_VERSION);
if (LZ4F_isError(ctxError))
- pg_log_error("could not create lz4 compression context: %s",
- LZ4F_getErrorName(ctxError));
+ pg_fatal("could not create lz4 compression context: %s",
+ LZ4F_getErrorName(ctxError));
return &streamer->base;
#else
&mystreamer->prefs);
if (LZ4F_isError(compressed_size))
- pg_log_error("could not write lz4 header: %s",
- LZ4F_getErrorName(compressed_size));
+ pg_fatal("could not write lz4 header: %s",
+ LZ4F_getErrorName(compressed_size));
mystreamer->bytes_written += compressed_size;
mystreamer->header_written = true;
next_in, len, NULL);
if (LZ4F_isError(compressed_size))
- pg_log_error("could not compress data: %s",
- LZ4F_getErrorName(compressed_size));
+ pg_fatal("could not compress data: %s",
+ LZ4F_getErrorName(compressed_size));
mystreamer->bytes_written += compressed_size;
}
next_out, avail_out, NULL);
if (LZ4F_isError(compressed_size))
- pg_log_error("could not end lz4 compression: %s",
- LZ4F_getErrorName(compressed_size));
+ pg_fatal("could not end lz4 compression: %s",
+ LZ4F_getErrorName(compressed_size));
mystreamer->bytes_written += compressed_size;
next_in, &read_size, NULL);
if (LZ4F_isError(ret))
- pg_log_error("could not decompress data: %s",
- LZ4F_getErrorName(ret));
+ pg_fatal("could not decompress data: %s",
+ LZ4F_getErrorName(ret));
/* Update input buffer based on number of bytes consumed */
avail_in -= read_size;
ZSTD_c_enableLongDistanceMatching,
compress->long_distance);
if (ZSTD_isError(ret))
- {
- pg_log_error("could not enable long-distance mode: %s",
- ZSTD_getErrorName(ret));
- exit(1);
- }
+ pg_fatal("could not enable long-distance mode: %s",
+ ZSTD_getErrorName(ret));
}
/* Initialize the ZSTD output buffer. */
&inBuf, ZSTD_e_continue);
if (ZSTD_isError(yet_to_flush))
- pg_log_error("could not compress data: %s",
- ZSTD_getErrorName(yet_to_flush));
+ pg_fatal("could not compress data: %s",
+ ZSTD_getErrorName(yet_to_flush));
}
}
&in, ZSTD_e_end);
if (ZSTD_isError(yet_to_flush))
- pg_log_error("could not compress data: %s",
- ZSTD_getErrorName(yet_to_flush));
+ pg_fatal("could not compress data: %s",
+ ZSTD_getErrorName(yet_to_flush));
} while (yet_to_flush > 0);
&mystreamer->zstd_outBuf, &inBuf);
if (ZSTD_isError(ret))
- pg_log_error("could not decompress data: %s",
- ZSTD_getErrorName(ret));
+ pg_fatal("could not decompress data: %s",
+ ZSTD_getErrorName(ret));
}
}