Compress the ziplist in 'node' and update encoding details. * Returns 1 if ziplist compressed successfully. * Returns 0 if compression failed or if ziplist too small to compress. */
| 183 | * Returns 1 if ziplist compressed successfully. |
| 184 | * Returns 0 if compression failed or if ziplist too small to compress. */ |
| 185 | REDIS_STATIC int __quicklistCompressNode(quicklistNode *node) { |
| 186 | #ifdef REDIS_TEST |
| 187 | node->attempted_compress = 1; |
| 188 | #endif |
| 189 | |
| 190 | /* Don't bother compressing small values */ |
| 191 | if (node->sz < MIN_COMPRESS_BYTES) |
| 192 | return 0; |
| 193 | |
| 194 | quicklistLZF *lzf = zmalloc(sizeof(*lzf) + node->sz); |
| 195 | |
| 196 | /* Cancel if compression fails or doesn't compress small enough */ |
| 197 | if (((lzf->sz = lzf_compress(node->zl, node->sz, lzf->compressed, |
| 198 | node->sz)) == 0) || |
| 199 | lzf->sz + MIN_COMPRESS_IMPROVE >= node->sz) { |
| 200 | /* lzf_compress aborts/rejects compression if value not compressable. */ |
| 201 | zfree(lzf); |
| 202 | return 0; |
| 203 | } |
| 204 | lzf = zrealloc(lzf, sizeof(*lzf) + lzf->sz); |
| 205 | zfree(node->zl); |
| 206 | node->zl = (unsigned char *)lzf; |
| 207 | node->encoding = QUICKLIST_NODE_ENCODING_LZF; |
| 208 | node->recompress = 0; |
| 209 | return 1; |
| 210 | } |
| 211 | |
| 212 | /* Compress only uncompressed nodes. */ |
| 213 | #define quicklistCompressNode(_node) \ |
nothing calls this directly
no test coverage detected