Skip to content

Commit ed81839

Browse files
committed
Improve error reporting in remote backup
1 parent cec20cc commit ed81839

File tree

4 files changed

+22
-4
lines changed

4 files changed

+22
-4
lines changed

src/data.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1052,7 +1052,7 @@ get_gz_error(gzFile gzf, int errnum)
10521052
int gz_errnum;
10531053
const char *errmsg;
10541054

1055-
errmsg = gzerror(gzf, &gz_errnum);
1055+
errmsg = fio_gzerror(gzf, &gz_errnum);
10561056
if (gz_errnum == Z_ERRNO)
10571057
return strerror(errnum);
10581058
else

src/parsexlog.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -906,7 +906,7 @@ get_gz_error(gzFile gzf)
906906
int errnum;
907907
const char *errmsg;
908908

909-
errmsg = gzerror(gzf, &errnum);
909+
errmsg = fio_gzerror(gzf, &errnum);
910910
if (errnum == Z_ERRNO)
911911
return strerror(errno);
912912
else

src/utils/file.c

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -740,6 +740,7 @@ typedef struct fioGZFile
740740
{
741741
z_stream strm;
742742
int fd;
743+
int errnum;
743744
bool compress;
744745
bool eof;
745746
Bytef buf[ZLIB_BUFFER_SIZE];
@@ -754,7 +755,7 @@ fio_gzopen(char const* path, char const* mode, int level, fio_location location)
754755
fioGZFile* gz = (fioGZFile*)malloc(sizeof(fioGZFile));
755756
memset(&gz->strm, 0, sizeof(gz->strm));
756757
gz->eof = 0;
757-
758+
gz->errnum = Z_OK;
758759
if (strcmp(mode, PG_BINARY_W) == 0) /* compress */
759760
{
760761
gz->strm.next_out = gz->buf;
@@ -838,6 +839,7 @@ fio_gzread(gzFile f, void *buf, unsigned size)
838839
}
839840
else if (rc != Z_OK)
840841
{
842+
gz->errnum = rc;
841843
return -1;
842844
}
843845
if (gz->strm.avail_out != size)
@@ -968,6 +970,21 @@ int fio_gzeof(gzFile f)
968970
}
969971
}
970972

973+
const char* fio_gzerror(gzFile f, int *errnum)
974+
{
975+
if ((size_t)f & FIO_GZ_REMOTE_MARKER)
976+
{
977+
fioGZFile* gz = (fioGZFile*)((size_t)f - FIO_GZ_REMOTE_MARKER);
978+
if (errnum)
979+
*errnum = gz->errnum;
980+
return gz->strm.msg;
981+
}
982+
else
983+
{
984+
return gzerror(f, errnum);
985+
}
986+
}
987+
971988
z_off_t fio_gzseek(gzFile f, z_off_t offset, int whence)
972989
{
973990
Assert(!((size_t)f & FIO_GZ_REMOTE_MARKER));

src/utils/file.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ typedef enum
4949
#define PAGE_CHECKSUM_MISMATCH (-256)
5050

5151
#define SYS_CHECK(cmd) do if ((cmd) < 0) { fprintf(stderr, "%s:%d: (%s) %s\n", __FILE__, __LINE__, #cmd, strerror(errno)); exit(EXIT_FAILURE); } while (0)
52-
#define IO_CHECK(cmd, size) do { int _rc = (cmd); if (_rc != (size)) { fprintf(stderr, "%s:%d: proceeds %d bytes instead of %d: %s\n", __FILE__, __LINE__, _rc, (int)(size), _rc < 0 ? "end of data" : strerror(errno)); exit(EXIT_FAILURE); } } while (0)
52+
#define IO_CHECK(cmd, size) do { int _rc = (cmd); if (_rc != (size)) if (remote_agent) { fprintf(stderr, "%s:%d: proceeds %d bytes instead of %d: %s\n", __FILE__, __LINE__, _rc, (int)(size), _rc >= 0 ? "end of data" : strerror(errno)); exit(EXIT_FAILURE); } else elog(ERROR, "Communication error: %s", _rc >= 0 ? "end of data" : strerror(errno)); } while (0)
5353

5454
typedef struct
5555
{
@@ -111,6 +111,7 @@ extern int fio_gzread(gzFile f, void *buf, unsigned size);
111111
extern int fio_gzwrite(gzFile f, void const* buf, unsigned size);
112112
extern int fio_gzeof(gzFile f);
113113
extern z_off_t fio_gzseek(gzFile f, z_off_t offset, int whence);
114+
extern const char* fio_gzerror(gzFile file, int *errnum);
114115
#endif
115116

116117
#endif

0 commit comments

Comments
 (0)