[PATCH] vinyl: fix vy_range_update_compaction_priority hang

Konstantin Osipov kostja at tarantool.org
Mon Jul 8 16:48:54 MSK 2019


* Vladimir Davydov <vdavydov.dev at gmail.com> [19/07/08 16:38]:

Please push this asap since there is a customer waiting for  fix.

Please also fix VY_ROUND_UP type safety - let's make it static
inline instead.

This needs a test case as a follow up and a proper fix should drop
all such slices.

> 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
> 

-- 
Konstantin Osipov, Moscow, Russia



More information about the Tarantool-patches mailing list