Description
Format core dump 5353, here's the CONFIG:
############################################
|
# RUN PARAMETERS
|
# stress run WT-5353
|
############################################
|
auto_throttle=1
|
firstfit=0
|
bitcnt=3
|
bloom=1
|
bloom_bit_count=45
|
bloom_hash_count=20
|
bloom_oldest=0
|
cache=59
|
checkpoints=1
|
checksum=off
|
chunk_size=1
|
compaction=0
|
compression=zlib
|
data_extend=0
|
data_source=file
|
delete_pct=42
|
dictionary=0
|
evict_max=5
|
file_type=variable-length column-store
|
backups=0
|
huffman_key=0
|
huffman_value=0
|
insert_pct=11
|
internal_key_truncation=1
|
internal_page_max=10
|
isolation=read-uncommitted
|
key_gap=16
|
key_max=49
|
key_min=13
|
leak_memory=0
|
leaf_page_max=17
|
logging=1
|
merge_max=17
|
merge_threads=2
|
mmap=1
|
ops=100000
|
prefix_compression=1
|
prefix_compression_min=2
|
repeat_data_pct=15
|
reverse=0
|
rows=100000
|
runs=100
|
split_pct=65
|
statistics=0
|
threads=8
|
value_max=209
|
value_min=0
|
wiredtiger_config=
|
write_pct=41
|
############################################
|
I've got thousands of runs of this without a failure, so it's not an obvious failure.
Here's the stack:
(gdb) where
|
#0 0x00000000004bc91d in __wt_bt_write (session=0x251e400,
|
buf=0x7fd71819eb58, addr=0x7fd757ffe6f0 "\030", addr_sizep=0x7fd757ffe7f8,
|
checkpoint=0, compressed=1) at ../src/btree/bt_io.c:160
|
WT-1 0x00000000004715f8 in __rec_split_write (session=0x251e400,
|
r=0x7fd71819eb40, bnd=0x7fd7180b6ce0, buf=0x7fd71819eb58, last_block=1)
|
at ../src/btree/rec_write.c:2786
|
WT-2 0x0000000000470ba9 in __rec_split_finish_std (session=0x251e400,
|
r=0x7fd71819eb40) at ../src/btree/rec_write.c:2501
|
WT-3 0x0000000000470c71 in __rec_split_finish (session=0x251e400,
|
r=0x7fd71819eb40) at ../src/btree/rec_write.c:2532
|
WT-4 0x000000000047527b in __rec_row_leaf (session=0x251e400, r=0x7fd71819eb40,
|
page=0x2554cd0, salvage=0x0) at ../src/btree/rec_write.c:4493
|
WT-5 0x000000000046d085 in __wt_rec_write (session=0x251e400, ref=0x2554c90,
|
salvage=0x0, flags=0) at ../src/btree/rec_write.c:411
|
WT-6 0x00000000004605b4 in __sync_file (session=0x251e400, syncop=8)
|
at ../src/btree/bt_sync.c:135
|
WT-7 0x0000000000460aa7 in __wt_cache_op (session=0x251e400,
|
ckptbase=0x7fd71804dd00, op=8) at ../src/btree/bt_sync.c:354
|
WT-8 0x000000000044b4e4 in __checkpoint_worker (session=0x251e400,
|
cfg=0x7fd757ffed70, is_checkpoint=1) at ../src/txn/txn_ckpt.c:841
|
WT-9 0x000000000044b72f in __wt_checkpoint (session=0x251e400,
|
cfg=0x7fd757ffed70) at ../src/txn/txn_ckpt.c:899
|
WT-10 0x000000000044a620 in __wt_txn_checkpoint (session=0x251e400,
|
cfg=0x7fd757ffed70) at ../src/txn/txn_ckpt.c:402
|
WT-11 0x0000000000440b1d in __session_checkpoint (wt_session=0x251e400,
|
config=0x0) at ../src/session/session_api.c:793
|
WT-12 0x0000000000406cc5 in ops (arg=0x2544600) at ../../../test/format/ops.c:289
|
WT-13 0x000000339e807c53 in start_thread (arg=0x7fd757fff700)
|
at pthread_create.c:308
|
WT-14 0x000000339e0f5dbd in clone ()
|
at ../sysdeps/unix/sysv/linux/x86_64/clone.S:113
|
(gdb) frame 0
|
#0 0x00000000004bc91d in __wt_bt_write (session=0x251e400,
|
buf=0x7fd71819eb58, addr=0x7fd757ffe6f0 "\030", addr_sizep=0x7fd757ffe7f8,
|
checkpoint=0, compressed=1) at ../src/btree/bt_io.c:160
|
160 WT_ERR(btree->compressor->decompress(
|
(gdb) p btree->compressor
|
$12 = (WT_COMPRESSOR *) 0x0
|
(gdb) p btree->dhandle->name
|
$13 = 0x2548bf0 "file:WiredTiger.wt"
|
(gdb) frame 1
|
WT-1 0x00000000004715f8 in __rec_split_write (session=0x251e400,
|
r=0x7fd71819eb40, bnd=0x7fd7180b6ce0, buf=0x7fd71819eb58, last_block=1)
|
at ../src/btree/rec_write.c:2786
|
2786 WT_ERR(__wt_bt_write(session,
|
(gdb) p *bnd
|
$14 = {start = 0x7fd71819ee28 "!file:wt", recno = 0, entries = 2, addr = {
|
addr = 0x0, size = 0 '\000', type = 3 '\003', reuse = 0 '\000'},
|
size = 1629, cksum = 0, dsk = 0x0, skip = 0x0, skip_next = 0,
|
skip_allocated = 0, key = {data = 0x0, size = 0, flags = 0, mem = 0x0,
|
memsize = 0}, already_compressed = 1}
|
This is diagnostic code that decompresses and verifies compressed buffers before writing them:
#ifdef HAVE_DIAGNOSTIC
|
/*
|
* We're passed a table's disk image. Decompress if necessary and
|
* verify the image. Always check the in-memory length for accuracy.
|
*/
|
dsk = buf->mem;
|
if (compressed) {
|
WT_ERR(__wt_scr_alloc(session, dsk->mem_size, &tmp));
|
|
memcpy(tmp->mem, buf->data, WT_BLOCK_COMPRESS_SKIP);
|
WT_ERR(btree->compressor->decompress(
|
What happened is we're writing the WiredTiger.wt file (which isn't compressed), but the WT_BOUNDARY we're using to write the block has the WT_BOUNDARY.already_compressed flag set, presumably from a previous use of the WT_BOUNDARY structure to write a compressed block. (It must be from a previous run: WT_BOUNDARY.already_compressed is only set in *rec_split_raw_worker(), and we're not going through the raw-compression code here, the call to *rec_split_finish_std() tells us this reconciliation isn't configured for raw-compression.
I can make this bug happen by explicitly not resetting WT_BOUNDARY.already_compressed inside __rec_bnd_cleanup(), but I don't yet see any other path where we might end up with it not reset.
Attachments
Issue Links
- related to
-
WT-1 placeholder WT-1
- Closed
-
WT-2 What does metadata look like?
- Closed
-
WT-3 What file formats are required?
- Closed
-
WT-4 Flexible cursor traversals
- Closed
-
WT-5 How does pget work: is it necessary?
- Closed
-
WT-6 Complex schema example
- Closed
-
WT-7 Do we need the handle->err/errx methods?
- Closed
-
WT-8 Do we need table load, bulk-load and/or dump methods?
- Closed
-
WT-9 Does adding schema need to be transactional?
- Closed
-
WT-10 Basic "getting started" tutorial
- Closed
-
WT-11 placeholder #11
- Closed
-
WT-12 Write more examples
- Closed
-
WT-13 Define supported platforms
- Closed
-
WT-14 Windows build
- Closed