Use min/max bounds defined by Zstd for compression level
authorMichael Paquier <michael@paquier.xyz>
Thu, 22 Sep 2022 11:02:40 +0000 (20:02 +0900)
committerMichael Paquier <michael@paquier.xyz>
Thu, 22 Sep 2022 11:02:40 +0000 (20:02 +0900)
The bounds hardcoded in compression.c since ffd5365 (minimum at 1 and
maximum at 22) do not match the reality of what zstd is able to
handle, these values being available via ZSTD_maxCLevel() and
ZSTD_minCLevel() at run-time.  The maximum of 22 is actually correct
in recent versions, but the minimum was not as the library can go down
to -131720 by design.  This commit changes the code to use the run-time
values in the code instead of some hardcoded ones.

Zstd seems to assume that these bounds could change in the future, and
Postgres will be able to adapt automatically to such changes thanks to
what's being done in this commit.

Reported-by: Justin Prysby
Discussion: https://postgr.es/m/20220922033716.GL31833@telsasoft.com
Backpatch-through: 15

doc/src/sgml/protocol.sgml
src/common/compression.c

index f63c912e9713dde0bd0b1c2b0a3530e2fbd1746c..75caa7fdb67941c8f7b3aca1e35cbc7c3914d96a 100644 (file)
@@ -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>
index e40ce98ef3a80a1392b422ef6406895b982245d8..0c6bb9177b9e1ab3c1427cd32d0322198ac37fd8 100644 (file)
@@ -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;