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 c68fe5ed..bc931e83 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 3d62f595..7d2e1c6c 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 9fa6adb5..38622f1a 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 32e486cd..1edd1444 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 e3cdd321..e2eedbce 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 1edca7c3..dc7c2e8e 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"