From 6172ccb12bcc85779678c439900727035b4ec3a4 Mon Sep 17 00:00:00 2001
From: Justin Pryzby <pryzbyj@telsasoft.com>
Date: Sun, 14 Mar 2021 17:12:07 -0500
Subject: [PATCH 09/10] Add zstd compression levels

---
 src/backend/access/transam/xlog.c       |  6 +++++-
 src/backend/access/transam/xloginsert.c | 15 +++++++++++++--
 src/backend/access/transam/xlogreader.c | 12 ++++++++++++
 src/backend/utils/misc/guc.c            |  2 +-
 src/include/access/xlog_internal.h      |  4 ++++
 5 files changed, 35 insertions(+), 4 deletions(-)

diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c
index 92023de9f5..b14c7c5929 100644
--- a/src/backend/access/transam/xlog.c
+++ b/src/backend/access/transam/xlog.c
@@ -99,7 +99,7 @@ bool		EnableHotStandby = false;
 bool		fullPageWrites = true;
 bool		wal_log_hints = false;
 bool		wal_compression = false;
-int			wal_compression_method = WAL_COMPRESSION_ZSTD;
+int			wal_compression_method = WAL_COMPRESSION_ZSTD_FAST_10;
 char	   *wal_consistency_checking_string = NULL;
 bool	   *wal_consistency_checking = NULL;
 bool		wal_init_zero = true;
@@ -192,6 +192,10 @@ const struct config_enum_entry wal_compression_options[] = {
 #endif
 #ifdef  USE_ZSTD
 	{"zstd", WAL_COMPRESSION_ZSTD, false},
+	{"zstd-1", WAL_COMPRESSION_ZSTD_1, false},
+	{"zstd-fast-10", WAL_COMPRESSION_ZSTD_FAST_10, false},
+	{"zstd-fast-20", WAL_COMPRESSION_ZSTD_FAST_20, false},
+	{"zstd-fast-40", WAL_COMPRESSION_ZSTD_FAST_40, false},
 #endif
 	{NULL, 0, false}
 };
diff --git a/src/backend/access/transam/xloginsert.c b/src/backend/access/transam/xloginsert.c
index 4591e476c6..4f11f96373 100644
--- a/src/backend/access/transam/xloginsert.c
+++ b/src/backend/access/transam/xloginsert.c
@@ -915,11 +915,22 @@ XLogCompressBackupBlock(char *page, uint16 hole_offset, uint16 hole_length,
 
 #ifdef USE_ZSTD
 	case WAL_COMPRESSION_ZSTD:
-		len = ZSTD_compress(dest, COMPRESS_BUFSIZE, source, orig_len,
-				ZSTD_CLEVEL_DEFAULT);
+	case WAL_COMPRESSION_ZSTD_1:
+	case WAL_COMPRESSION_ZSTD_FAST_10:
+	case WAL_COMPRESSION_ZSTD_FAST_20:
+	case WAL_COMPRESSION_ZSTD_FAST_40:
+	{
+		int level = compression == WAL_COMPRESSION_ZSTD_1 ? 1 :
+			compression == WAL_COMPRESSION_ZSTD_FAST_10 ? -10 :
+			compression == WAL_COMPRESSION_ZSTD_FAST_20 ? -20 :
+			compression == WAL_COMPRESSION_ZSTD_FAST_40 ? -40 :
+			ZSTD_CLEVEL_DEFAULT;
+
+		len = ZSTD_compress(dest, COMPRESS_BUFSIZE, source, orig_len, level);
 		if (ZSTD_isError(len))
 			len = -1;
 		break;
+	}
 #endif
 
 	default:
diff --git a/src/backend/access/transam/xlogreader.c b/src/backend/access/transam/xlogreader.c
index 0f9d522087..0de61d3073 100644
--- a/src/backend/access/transam/xlogreader.c
+++ b/src/backend/access/transam/xlogreader.c
@@ -1554,6 +1554,10 @@ struct walcompression walmethods[] = {
 	{"zlib",	WAL_COMPRESSION_ZLIB},
 	{"lz4",		WAL_COMPRESSION_LZ4},
 	{"zstd",	WAL_COMPRESSION_ZSTD},
+	{"zstd-1",	WAL_COMPRESSION_ZSTD},
+	{"zstd-fast-10",WAL_COMPRESSION_ZSTD},
+	{"zstd-fast-20",WAL_COMPRESSION_ZSTD},
+	{"zstd-fast-40",WAL_COMPRESSION_ZSTD},
 };
 
 /*
@@ -1628,6 +1632,14 @@ RestoreBlockImage(XLogReaderState *record, uint8 block_id, char *page)
 
 #ifdef USE_ZSTD
 		case WAL_COMPRESSION_ZSTD:
+		/*
+		 * There aren't actually written into the header - decompression is the
+		 * same.
+		 * case WAL_COMPRESSION_ZSTD_1:
+		 * case WAL_COMPRESSION_ZSTD_FAST_10:
+		 * case WAL_COMPRESSION_ZSTD_FAST_20:
+		 * case WAL_COMPRESSION_ZSTD_FAST_40:
+		 */
 			decomp_result = ZSTD_decompress(tmp.data, BLCKSZ-bkpb->hole_length,
 					ptr, bkpb->bimg_len);
 			// XXX: ZSTD_getErrorName
diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c
index 8031e027aa..667fc4c0c1 100644
--- a/src/backend/utils/misc/guc.c
+++ b/src/backend/utils/misc/guc.c
@@ -4728,7 +4728,7 @@ static struct config_enum ConfigureNamesEnum[] =
 			NULL
 		},
 		&wal_compression_method,
-		WAL_COMPRESSION_ZSTD, wal_compression_options,
+		WAL_COMPRESSION_ZSTD_FAST_10, wal_compression_options,
 		NULL, NULL, NULL
 	},
 
diff --git a/src/include/access/xlog_internal.h b/src/include/access/xlog_internal.h
index fa8146645d..a435b1a654 100644
--- a/src/include/access/xlog_internal.h
+++ b/src/include/access/xlog_internal.h
@@ -338,6 +338,10 @@ typedef enum WalCompression
 	WAL_COMPRESSION_ZLIB,
 	WAL_COMPRESSION_LZ4,
 	WAL_COMPRESSION_ZSTD,
+	WAL_COMPRESSION_ZSTD_1,
+	WAL_COMPRESSION_ZSTD_FAST_10, /* level = -10 */
+	WAL_COMPRESSION_ZSTD_FAST_20, /* level = -20 */
+	WAL_COMPRESSION_ZSTD_FAST_40, /* level = -40 */
 } WalCompression;
 
 extern const char *wal_compression_name(WalCompression compression);
-- 
2.17.0

