[tarantool-patches] Re: [PATCH] vinyl: fix assertion failure in vy_tx_handle_deferred_delete

Kirill Yukhin kyukhin at tarantool.org
Tue Jun 18 16:45:34 MSK 2019


Hello,

On 17 Jun 18:30, Vladimir Davydov wrote:
> vy_tx_handle_deferred_delete() expects (righteously) that in case a
> deferred DELETE overwrites a statement in a secondary index write set
> and the overwritten statement wasn't skipped on commit (i.e. doesn't
> have txv->is_overwritten flag set), both the old and the new statement
> must be REPLACEs (see the comment to the corresponding assertions for
> more details).
> 
> The problem is we don't set is_overwritten flag in case a statement
> doesn't have any effect (txv->is_nop is set), even if it was, in fact,
> overwritten in the primary index write set (see vy_tx_prepare). As
> a result, we get an assertion failure when we delete such statement
> in the same transaction, e.g.
> 
>   s = box.schema.space.create('test', {engine = 'vinyl'})
>   s:create_index('pk', {parts = {1, 'unsigned'}})
>   s:create_index('sk', {parts = {2, 'unsigned'}})
>   s:replace{1, 1, 1}
>   box.begin()
>   s:update(1, {{'+', 3, 1}}) -- adds no-op REPLACE to sk write set
>   s:delete(1)                -- produces deferred DELETE for sk
>   box.commit()
> 
> results in
> 
>   vy_tx_handle_deferred_delete: Assertion `vy_stmt_type(stmt) == IPROTO_REPLACE' failed.
> 
> Fix this by making sure we set is_overwritten for all overwritten
> statements in a secondary index write set.
> 
> Closes #4294
> ---
> https://github.com/tarantool/tarantool/issues/4294
> https://github.com/tarantool/tarantool/commits/dv/gh-4294-vy-assert-failure-fix

I've checked yout patch into 1.10, 2.1 and master branches.

--
Regards, Kirill Yukhin




More information about the Tarantool-patches mailing list