|
23 | 23 | #include <lz4.h>
|
24 | 24 | #endif
|
25 | 25 |
|
| 26 | +#ifdef USE_ZSTD |
| 27 | +#include <zstd.h> |
| 28 | +#endif |
| 29 | + |
26 | 30 | #include "access/xact.h"
|
27 | 31 | #include "access/xlog.h"
|
28 | 32 | #include "access/xlog_internal.h"
|
|
47 | 51 | #define LZ4_MAX_BLCKSZ 0
|
48 | 52 | #endif
|
49 | 53 |
|
| 54 | +#ifdef USE_ZSTD |
| 55 | +#define ZSTD_MAX_BLCKSZ ZSTD_COMPRESSBOUND(BLCKSZ) |
| 56 | +#else |
| 57 | +#define ZSTD_MAX_BLCKSZ 0 |
| 58 | +#endif |
| 59 | + |
50 | 60 | #define PGLZ_MAX_BLCKSZ PGLZ_MAX_OUTPUT(BLCKSZ)
|
51 | 61 |
|
52 |
| -#define COMPRESS_BUFSIZE Max(PGLZ_MAX_BLCKSZ, LZ4_MAX_BLCKSZ) |
| 62 | +/* Buffer size required to store a compressed version of backup block image */ |
| 63 | +#define COMPRESS_BUFSIZE Max(Max(PGLZ_MAX_BLCKSZ, LZ4_MAX_BLCKSZ), ZSTD_MAX_BLCKSZ) |
53 | 64 |
|
54 | 65 | /*
|
55 | 66 | * For each block reference registered with XLogRegisterBuffer, we fill in
|
@@ -698,6 +709,14 @@ XLogRecordAssemble(RmgrId rmid, uint8 info,
|
698 | 709 | #endif
|
699 | 710 | break;
|
700 | 711 |
|
| 712 | + case WAL_COMPRESSION_ZSTD: |
| 713 | +#ifdef USE_ZSTD |
| 714 | + bimg.bimg_info |= BKPIMAGE_COMPRESS_ZSTD; |
| 715 | +#else |
| 716 | + elog(ERROR, "zstd is not supported by this build"); |
| 717 | +#endif |
| 718 | + break; |
| 719 | + |
701 | 720 | case WAL_COMPRESSION_NONE:
|
702 | 721 | Assert(false); /* cannot happen */
|
703 | 722 | break;
|
@@ -906,6 +925,17 @@ XLogCompressBackupBlock(char *page, uint16 hole_offset, uint16 hole_length,
|
906 | 925 | #endif
|
907 | 926 | break;
|
908 | 927 |
|
| 928 | + case WAL_COMPRESSION_ZSTD: |
| 929 | +#ifdef USE_ZSTD |
| 930 | + len = ZSTD_compress(dest, COMPRESS_BUFSIZE, source, orig_len, |
| 931 | + ZSTD_CLEVEL_DEFAULT); |
| 932 | + if (ZSTD_isError(len)) |
| 933 | + len = -1; /* failure */ |
| 934 | +#else |
| 935 | + elog(ERROR, "zstd is not supported by this build"); |
| 936 | +#endif |
| 937 | + break; |
| 938 | + |
909 | 939 | case WAL_COMPRESSION_NONE:
|
910 | 940 | Assert(false); /* cannot happen */
|
911 | 941 | break;
|
|
0 commit comments