From bc94afb46ad201af6c4a0e145ac07f8730973b01 Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Mon, 3 Jun 2024 23:28:23 +0300 Subject: [PATCH] lib: istream-seekable - Improve logging after write() errors Also don't silently handle out of disk space errors - log a warning instead. --- src/lib/istream-seekable.c | 16 ++++++++++------ src/lib/test-istream-seekable.c | 4 ++-- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/lib/istream-seekable.c b/src/lib/istream-seekable.c index b753c91991..786eae3098 100644 --- a/src/lib/istream-seekable.c +++ b/src/lib/istream-seekable.c @@ -243,6 +243,7 @@ static int i_stream_seekable_write_failed(struct seekable_istream *sstream) struct istream_private *stream = &sstream->istream; void *data; size_t old_pos = stream->pos; + int write_errno = errno; i_assert(sstream->fd != -1); i_assert(stream->skip == 0); @@ -256,8 +257,8 @@ static int i_stream_seekable_write_failed(struct seekable_istream *sstream) sstream->istream.istream.stream_errno = errno; sstream->istream.istream.eof = TRUE; io_stream_set_error(&sstream->istream.iostream, - "istream-seekable: read(%s) failed: %m", - sstream->temp_path); + "istream-seekable: write(%s) failed: %s, and attempt to read() it back failed: %m", + sstream->temp_path, strerror(write_errno)); return -1; } sstream->buffer_peak = sstream->write_peak; @@ -310,14 +311,17 @@ static ssize_t i_stream_seekable_read(struct istream_private *stream) ret = write(sstream->fd, data, size); i_assert(ret != 0); if (ret < 0) { - if (!ENOSPACE(errno)) { - i_error("istream-seekable: write_full(%s) failed: %m", - sstream->temp_path); - } + const char *orig_temp_path = t_strdup(sstream->temp_path); + int write_errno = errno; if (i_stream_seekable_write_failed(sstream) < 0) return -1; if (!read_from_buffer(sstream, &ret)) i_unreached(); + + errno = write_errno; + i_warning("istream-seekable: write_full(%s) failed: %m - " + "fallback to using only memory", + orig_temp_path); return ret; } i_stream_sync(sstream->fd_input); diff --git a/src/lib/test-istream-seekable.c b/src/lib/test-istream-seekable.c index 3373f52d64..b151771118 100644 --- a/src/lib/test-istream-seekable.c +++ b/src/lib/test-istream-seekable.c @@ -255,9 +255,9 @@ static void test_istream_seekable_failed_writes(void) i_close_fd(&fd_callback_fd); test_istream_set_size(streams[0], 5); - test_expect_error_string("istream-seekable: write_full(test-lib.tmp) failed: Bad file descriptor"); test_assert(i_stream_read(input) == -1); - test_expect_no_more_errors(); + test_assert(input->stream_errno == EBADF); + test_assert_strcmp(i_stream_get_error(input), "istream-seekable: write(test-lib.tmp) failed: Bad file descriptor, and attempt to read() it back failed: Bad file descriptor"); test_expect_error_string("file_istream.close((seekable temp-istream for: test seekable)) failed: Bad file descriptor"); i_stream_unref(&input); -- 2.47.3