vinyl: fix compaction crash on disk read error
`vy_slice_stream_next()` clears the return value on failure. This isn't expected by `vy_write_iterator_merge_step()`, which doesn't update the source position in the `vy_wirte_iterator::src_heap` in this case. As a result, an attempt to remove `end_of_key_src` from the heap in `vy_write_iterator_build_history()` may crash as follows: ``` # 1 0x572a2ecc21a6 in crash_collect+256 # 2 0x572a2ecc2be2 in crash_signal_cb+100 # 3 0x7cfef6645320 in __sigaction+80 # 4 0x572a2eab16de in tuple_format+16 # 5 0x572a2eab1a25 in vy_stmt_is_key+24 # 6 0x572a2eab1be8 in vy_stmt_compare+89 # 7 0x572a2eab1e37 in vy_entry_compare+74 # 8 0x572a2eab2913 in heap_less+88 # 9 0x572a2eab21e3 in vy_source_heap_sift_up+255 # 10 0x572a2eab20b9 in vy_source_heap_update_node+54 # 11 0x572a2eab25c1 in vy_source_heap_delete+249 # 12 0x572a2eab4134 in vy_write_iterator_build_history+1497 # 13 0x572a2eab4995 in vy_write_iterator_build_read_views+193 # 14 0x572a2eab4ce6 in vy_write_iterator_next+380 # 15 0x572a2eadd20b in vy_task_write_run+1132 # 16 0x572a2eade6cf in vy_task_compaction_execute+124 # 17 0x572a2eadfa8d in vy_task_f+445 # 18 0x572a2e9ea143 in fiber_cxx_invoke(int (*)(__va_list_tag*), __va_list_tag*)+34 # 19 0x572a2eccee7c in fiber_loop+219 # 20 0x572a2f0aef18 in coro_init+120 ``` Normally, a function shouldn't update the return value on failure so let's fix `vy_slice_stream_next()`. Closes #10555 NO_DOC=bug fix (cherry picked from commit f1144c533b6c52c324ffe1cc4fcaeab1f2f6cd9f)
Showing
- changelogs/unreleased/gh-10555-fix-vinyl-compaction-crash-on-read-error.md 4 additions, 0 deletions...ased/gh-10555-fix-vinyl-compaction-crash-on-read-error.md
- src/box/vy_run.c 4 additions, 2 deletionssrc/box/vy_run.c
- src/box/vy_stmt.c 5 additions, 0 deletionssrc/box/vy_stmt.c
- src/lib/core/errinj.h 1 addition, 0 deletionssrc/lib/core/errinj.h
- test/vinyl-luatest/gh_10555_compaction_read_error_test.lua 55 additions, 0 deletionstest/vinyl-luatest/gh_10555_compaction_read_error_test.lua
Loading
Please register or sign in to comment