[Tarantool-patches] [PATCH 0/2] Validate result of upserts squash & skip invalid upserts which can't be applied

Aleksandr Lyapunov alyapunov at tarantool.org
Mon Jun 22 17:13:31 MSK 2020


HI, thanks for the patch! see one comment below

On 5/22/20 5:42 AM, Nikita Pettik wrote:
>
> diff --git a/src/box/vinyl.c b/src/box/vinyl.c
> index 55a4c8fb7..b39e3b9d8 100644
> --- a/src/box/vinyl.c
> +++ b/src/box/vinyl.c
> @@ -3539,10 +3539,21 @@ vy_squash_process(struct vy_squash *squash)
>                  if (vy_tuple_compare(result, mem_stmt, lsm->cmp_def) != 0 ||
>                      vy_stmt_type(mem_stmt) != IPROTO_UPSERT)
>                          break;
> -               assert(vy_stmt_lsn(mem_stmt) >= MAX_LSN);
> -               vy_stmt_set_n_upserts((struct tuple *)mem_stmt, n_upserts);
> -               if (n_upserts <= VY_UPSERT_THRESHOLD)
> -                       ++n_upserts;
> +               /*
> +                * Upsert was not applied in vy_history_apply(),
> +                * but it still resides in tree memory. Ignore
> +                * such statements and do not account them while
> +                * counting upserts. Otherwise invalid upserts will
> +                * get stack and won't allow other upserts to squash.
> +                */
> +               if (vy_stmt_lsn(mem_stmt) >= MAX_LSN) {
> +                       vy_stmt_set_n_upserts((struct tuple *) mem_stmt,
> +                                             n_upserts);
> +                       if (n_upserts <= VY_UPSERT_THRESHOLD)
> +                               ++n_upserts;
> +               } else {
> +                       vy_stmt_set_n_upserts((struct tuple *) mem_stmt, 0);
> +               }
I bet we should just remove assert here. If mem_stmt have
a valid LSN now - it is a valid statement. The first of them must
have n_upserts=0, the second - 1 etc, and n_upsert of following
prepared statements must continue the sequence.


More information about the Tarantool-patches mailing list