From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: From: Vladimir Davydov Subject: [PATCH] vinyl: fix vy_range_update_compaction_priority hang Date: Mon, 8 Jul 2019 16:36:27 +0300 Message-Id: <75dc3e64523c54640805f6d6bd798d961a75fb9e.1562592949.git.vdavydov.dev@gmail.com> To: kostja@tarantool.org Cc: tarantool-patches@freelists.org List-ID: Under certain circumstances vy_slice_new() may create an empty slice, e.g. on range split: |------------------ Slice ---------------| |---- Run -----| + split key |---- Slice 1 ----||------ Slice 2 ------| ^^^^^^^ Empty vy_range_update_compaction_priority() uses the size of the last slice in a range as a base for LSM tree level sizing. If the slice size happens to be 0, it will simply hang in an infinite loop. Fix this potential hang by using 1 if the last slice size is 0. --- https://github.com/tarantool/tarantool/commits/dv/vy-fix-compaction-prio-calc-hang src/box/vy_range.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/box/vy_range.c b/src/box/vy_range.c index 395639dc..4ff85211 100644 --- a/src/box/vy_range.c +++ b/src/box/vy_range.c @@ -343,7 +343,7 @@ vy_range_update_compaction_priority(struct vy_range *range, uint64_t size; struct vy_slice *slice; slice = rlist_last_entry(&range->slices, struct vy_slice, in_range); - size = slice->count.bytes; + size = MAX(slice->count.bytes, 1); slice = rlist_first_entry(&range->slices, struct vy_slice, in_range); do { target_run_size = size; -- 2.11.0