-
Type:
Task
-
Resolution: Done
-
None
-
Affects Version/s: None
-
Component/s: None
-
None
-
None
@michaelcahill, to test this, add code to force rollbacks and turn on the debugging code that compares the compressed result against the original source, then test/format will hit it pretty quickly.
--- a/ext/compressors/zlib/zlib_compress.c
+++ b/ext/compressors/zlib/zlib_compress.c
@@ -236,7 +236,7 @@ zlib_compress_raw(WT_COMPRESSOR *compressor, WT_SESSION *session,
ZLIB_OPAQUE opaque;
z_stream zs;
uint32_t curr_slot, last_slot;
- int ret;
+ int ret, rbcnt;
curr_slot = last_slot = 0;
(void)split_pct;
@@ -277,6 +277,7 @@ zlib_compress_raw(WT_COMPRESSOR *compressor, WT_SESSION *session,
* page results in forced eviction based on in-memory size, even though
* the data fits into a single on-disk block.
*/
+ rbcnt = 1;
while (zs.avail_out > 0 && zs.total_in <= zs.total_out * 20) {
/* Find the slot we will try to compress up to. */
if ((curr_slot = zlib_find_slot(
@@ -290,7 +291,7 @@ zlib_compress_raw(WT_COMPRESSOR *compressor, WT_SESSION *session,
compressor, session, "deflate", ret));
/* Roll back if the last deflate didn't complete. */
- if (zs.avail_in > 0)
+ if (zs.avail_in > 0 || ++rbcnt > 10)
goto rollback;
last_slot = curr_slot;
@@ -341,7 +342,7 @@ rollback: if ((ret = deflateReset(&zs)) != Z_OK)
*result_lenp = 1;
}
-#if 0
+#if 1
/* Decompress the result and confirm it matches the original source. */
if (last_slot > 0) {
void *decomp;
- related to
-
WT-1816 Use deflateCopy to copy zlib streams
- Closed