From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Date: Mon, 8 Jul 2019 16:48:54 +0300 From: Konstantin Osipov Subject: Re: [PATCH] vinyl: fix vy_range_update_compaction_priority hang Message-ID: <20190708134854.GA15305@atlas> References: <75dc3e64523c54640805f6d6bd798d961a75fb9e.1562592949.git.vdavydov.dev@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <75dc3e64523c54640805f6d6bd798d961a75fb9e.1562592949.git.vdavydov.dev@gmail.com> To: Vladimir Davydov Cc: tarantool-patches@freelists.org List-ID: * Vladimir Davydov [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