From b977f6ba8e491145165b9ab9f2f1bd407b4e2d26 Mon Sep 17 00:00:00 2001
From: Justin Pryzby <pryzbyj@telsasoft.com>
Date: Sun, 27 Mar 2022 12:28:32 -0500
Subject: [PATCH 3/5] f!workers

---
 src/backend/replication/basebackup_zstd.c | 31 +++++++++++++----------
 src/bin/pg_basebackup/bbstreamer_zstd.c   | 21 +++++++--------
 2 files changed, 26 insertions(+), 26 deletions(-)

diff --git a/src/backend/replication/basebackup_zstd.c b/src/backend/replication/basebackup_zstd.c
index d6eb0617d8a..a112d6e181e 100644
--- a/src/backend/replication/basebackup_zstd.c
+++ b/src/backend/replication/basebackup_zstd.c
@@ -71,6 +71,7 @@ bbsink_zstd_new(bbsink *next, bc_specification *compress)
 #else
 	bbsink_zstd *sink;
 	int		compresslevel;
+	int		workers;
 
 	Assert(next != NULL);
 
@@ -82,11 +83,16 @@ bbsink_zstd_new(bbsink *next, bc_specification *compress)
 		Assert(compresslevel >= 1 && compresslevel <= 22);
 	}
 
+	if (compress->options & BACKUP_COMPRESSION_OPTION_WORKERS)
+		workers = compress->workers;
+	else
+		workers = 0;
+
 	sink = palloc0(sizeof(bbsink_zstd));
 	*((const bbsink_ops **) &sink->base.bbs_ops) = &bbsink_zstd_ops;
 	sink->base.bbs_next = next;
 	sink->compresslevel = compresslevel;
-	sink->workers = compress->workers;
+	sink->workers = workers;
 
 	return &sink->base;
 #endif
@@ -114,19 +120,16 @@ bbsink_zstd_begin_backup(bbsink *sink)
 		elog(ERROR, "could not set zstd compression level to %d: %s",
 			 mysink->compresslevel, ZSTD_getErrorName(ret));
 
-	/*
-	 * We check for failure here because (1) older versions of the library
-	 * do not support ZSTD_c_nbWorkers and (2) the library might want to
-	 * reject an unreasonable values (though in practice it does not seem to do
-	 * so).
-	 */
-	ret = ZSTD_CCtx_setParameter(mysink->cctx, ZSTD_c_nbWorkers,
-								 mysink->workers);
-	if (ZSTD_isError(ret))
-		ereport(ERROR,
-				errcode(ERRCODE_INVALID_PARAMETER_VALUE),
-				errmsg("could not set compression worker count to %d: %s",
-					   mysink->workers, ZSTD_getErrorName(ret)));
+	if (mysink->workers > 0)
+	{
+		ret = ZSTD_CCtx_setParameter(mysink->cctx, ZSTD_c_nbWorkers,
+									 mysink->workers);
+		if (ZSTD_isError(ret))
+			ereport(ERROR,
+					errcode(ERRCODE_INVALID_PARAMETER_VALUE),
+					errmsg("could not set compression worker count to %d: %s",
+						   mysink->workers, ZSTD_getErrorName(ret)));
+	}
 
 	/*
 	 * We need our own buffer, because we're going to pass different data to
diff --git a/src/bin/pg_basebackup/bbstreamer_zstd.c b/src/bin/pg_basebackup/bbstreamer_zstd.c
index 20393da595b..678af73e6f0 100644
--- a/src/bin/pg_basebackup/bbstreamer_zstd.c
+++ b/src/bin/pg_basebackup/bbstreamer_zstd.c
@@ -102,19 +102,16 @@ bbstreamer_zstd_compressor_new(bbstreamer *next, bc_specification *compress)
 		exit(1);
 	}
 
-	/*
-	 * We check for failure here because (1) older versions of the library
-	 * do not support ZSTD_c_nbWorkers and (2) the library might want to
-	 * reject unreasonable values (though in practice it does not seem to do
-	 * so).
-	 */
-	ret = ZSTD_CCtx_setParameter(streamer->cctx, ZSTD_c_nbWorkers,
-								 compress->workers);
-	if (ZSTD_isError(ret))
+	if (compress->workers > 0)
 	{
-		pg_log_error("could not set compression worker count to %d: %s",
-					 compress->workers, ZSTD_getErrorName(ret));
-		exit(1);
+		ret = ZSTD_CCtx_setParameter(streamer->cctx, ZSTD_c_nbWorkers,
+									 compress->workers);
+		if (ZSTD_isError(ret))
+		{
+			pg_log_error("could not set compression worker count to %d: %s",
+						 compress->workers, ZSTD_getErrorName(ret));
+			exit(1);
+		}
 	}
 
 	/* Initialize the ZSTD output buffer. */
-- 
2.17.1

