On Wed, Sep 21, 2022 at 07:31:48PM -0500, Justin Pryzby wrote: > I think at some point (maybe before releasing 1.3.4) the range was > increased to very large(small), negative levels. It's possible to query > the library about the lowest supported compression level, but then > there's a complication regarding the client-side library version vs the > server-side version. So it seems better to just use -7.
Indeed. Contrary to the default level, there are no variables for the minimum and maximum levels. As you are pointing out, a lookup at zstd_compress.c shows that we have ZSTD_minCLevel() and ZSTD_maxCLevel() that assign the bounds. Both are available since 1.4.0. We still need a backend-side check as the level passed with a BASE_BACKUP command would be only validated there. It seems to me that this is going to be less of a headache in the long-term if we just use those routines at runtime, as zstd wants to keep some freedom with the min and max bounds for the compression level, at least that's the flexibility that this gives the library. So I would tweak things as the attached. -- Michael
diff --git a/src/common/compression.c b/src/common/compression.c index e40ce98ef3..0c6bb9177b 100644 --- a/src/common/compression.c +++ b/src/common/compression.c @@ -324,8 +324,9 @@ validate_compress_specification(pg_compress_specification *spec) default_level = 0; /* fast mode */ break; case PG_COMPRESSION_ZSTD: - max_level = 22; #ifdef USE_ZSTD + max_level = ZSTD_maxCLevel(); + min_level = ZSTD_minCLevel(); default_level = ZSTD_CLEVEL_DEFAULT; #endif break; diff --git a/doc/src/sgml/protocol.sgml b/doc/src/sgml/protocol.sgml index f63c912e97..5cff3d3c07 100644 --- a/doc/src/sgml/protocol.sgml +++ b/doc/src/sgml/protocol.sgml @@ -2757,8 +2757,10 @@ psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;" <literal>-1</literal>), for <literal>lz4</literal> an integer between 1 and 12 (default <literal>0</literal> for fast compression mode), and for <literal>zstd</literal> an integer between - <literal>1</literal> and <literal>22</literal> (default - <literal>ZSTD_CLEVEL_DEFAULT</literal> or <literal>3</literal>). + <literal>ZSTD_minCLevel()</literal> (usually <literal>-131072</literal>) + and <literal>ZSTD_maxCLevel()</literal> (usually <literal>22</literal>) + (default <literal>ZSTD_CLEVEL_DEFAULT</literal> or + <literal>3</literal>). </para> <para>
signature.asc
Description: PGP signature