From ef2cba609d4cbb3dffe423dccf737165c72b4b2e Mon Sep 17 00:00:00 2001 From: Yonatan Komornik Date: Tue, 30 Nov 2021 10:31:52 -0800 Subject: [PATCH] `ZSTD_maxCLevel` now limited to 21 for 32-bit binaries. CI tests for constrained memory runs with max level on 32-bit binaries. --- .github/workflows/dev-short-tests.yml | 2 ++ doc/zstd_manual.html | 2 +- lib/compress/clevels.h | 3 ++- lib/compress/zstd_compress.c | 4 ++-- tests/fuzzer.c | 2 +- tests/playTests.sh | 5 +++++ 6 files changed, 13 insertions(+), 5 deletions(-) diff --git a/.github/workflows/dev-short-tests.yml b/.github/workflows/dev-short-tests.yml index c68fe5edf..bc931e836 100644 --- a/.github/workflows/dev-short-tests.yml +++ b/.github/workflows/dev-short-tests.yml @@ -30,6 +30,8 @@ jobs: steps: - uses: actions/checkout@v2 - name: make check on 32-bit + env: + CHECK_CONSTRAINED_MEM: true run: | sudo apt update APT_PACKAGES="gcc-multilib" make apt-install diff --git a/doc/zstd_manual.html b/doc/zstd_manual.html index 3d62f5952..7d2e1c6ca 100644 --- a/doc/zstd_manual.html +++ b/doc/zstd_manual.html @@ -40,7 +40,7 @@ functions. The library supports regular compression levels from 1 up to ZSTD_maxCLevel(), - which is currently 22. Levels >= 20, labeled `--ultra`, should be used with + which is 22 in most cases. Levels >= 20, labeled `--ultra`, should be used with caution, as they require more memory. The library also offers negative compression levels, which extend the range of speed vs. ratio preferences. The lower the level, the faster the speed (at the cost of compression). diff --git a/lib/compress/clevels.h b/lib/compress/clevels.h index 9fa6adb5f..38622f1a1 100644 --- a/lib/compress/clevels.h +++ b/lib/compress/clevels.h @@ -16,7 +16,8 @@ /*-===== Pre-defined compression levels =====-*/ -#define ZSTD_MAX_CLEVEL 22 +#define ZSTD_MAX_CLEVEL 22 +#define ZSTD_MAX_32BIT_CLEVEL 21 #ifdef __GNUC__ __attribute__((__unused__)) diff --git a/lib/compress/zstd_compress.c b/lib/compress/zstd_compress.c index 32e486cd8..1edd1444a 100644 --- a/lib/compress/zstd_compress.c +++ b/lib/compress/zstd_compress.c @@ -6166,7 +6166,7 @@ size_t ZSTD_endStream(ZSTD_CStream* zcs, ZSTD_outBuffer* output) /*-===== Pre-defined compression levels =====-*/ #include "clevels.h" -int ZSTD_maxCLevel(void) { return ZSTD_MAX_CLEVEL; } +int ZSTD_maxCLevel(void) { return MEM_32bits() ? ZSTD_MAX_32BIT_CLEVEL : ZSTD_MAX_CLEVEL; } int ZSTD_minCLevel(void) { return (int)-ZSTD_TARGETLENGTH_MAX; } int ZSTD_defaultCLevel(void) { return ZSTD_CLEVEL_DEFAULT; } @@ -6262,7 +6262,7 @@ static ZSTD_compressionParameters ZSTD_getCParams_internal(int compressionLevel, /* row */ if (compressionLevel == 0) row = ZSTD_CLEVEL_DEFAULT; /* 0 == default */ else if (compressionLevel < 0) row = 0; /* entry 0 is baseline for fast mode */ - else if (compressionLevel > ZSTD_MAX_CLEVEL) row = ZSTD_MAX_CLEVEL; + else if (compressionLevel > ZSTD_maxCLevel()) row = ZSTD_maxCLevel(); else row = compressionLevel; { ZSTD_compressionParameters cp = ZSTD_defaultCParameters[tableID][row]; diff --git a/tests/fuzzer.c b/tests/fuzzer.c index e3cdd321d..e2eedbcea 100644 --- a/tests/fuzzer.c +++ b/tests/fuzzer.c @@ -1982,7 +1982,7 @@ static int basicUnitTests(U32 const seed, double compressibility) int const rowLevelEnd = 8; DISPLAYLEVEL(3, "test%3i : flat-dictionary efficiency test : \n", testNb++); - assert(maxLevel == 22); + assert(maxLevel == (MEM_32bits() ? 21 : 22)); RDG_genBuffer(CNBuffer, flatdictSize + contentSize, compressibility, 0., seed); DISPLAYLEVEL(4, "content hash : %016llx; dict hash : %016llx \n", XXH64(contentStart, contentSize, 0), XXH64(dict, flatdictSize, 0)); diff --git a/tests/playTests.sh b/tests/playTests.sh index 1edca7c3c..dc7c2e8ed 100755 --- a/tests/playTests.sh +++ b/tests/playTests.sh @@ -1538,6 +1538,11 @@ elif [ "$longCSize19wlog23" -gt "$optCSize19wlog23" ]; then exit 1 fi +if [ -n "$CHECK_CONSTRAINED_MEM" ]; then + println "\n===> zsdt constrained memory tests " + # shellcheck disable=SC2039 + (ulimit -Sv 500000 ; datagen -g2M | zstd -22 --single-thread --ultra > /dev/null) +fi if [ "$1" != "--test-large-data" ]; then println "Skipping large data tests" -- 2.47.2