From: Vladimir Davydov <vdavydov.dev@gmail.com> To: kostja@tarantool.org Cc: tarantool-patches@freelists.org Subject: [PATCH 19/25] vinyl: prepare write iterator heap comparator for deferred DELETEs Date: Fri, 27 Jul 2018 14:29:59 +0300 [thread overview] Message-ID: <42559d41fef6382a080e3a178fd70f6c18c34612.1532689066.git.vdavydov.dev@gmail.com> (raw) In-Reply-To: <cover.1532689065.git.vdavydov.dev@gmail.com> In-Reply-To: <cover.1532689065.git.vdavydov.dev@gmail.com> In the scope of #2129, we won't delete the overwritten tuple from secondary indexes immediately on REPLACE. Instead we will defer generation of the DELETE statement until the primary index compaction. However, it may happen that the overwritten tuple and the tuple that overwrote it have the same secondary key parts, in which case the deferred DELETE is not needed and should be discarded on secondary index compaction. This patch makes the write iterator heap comparator function discard such useless deferred DELETEs. Note, this patch also removes the code that prioritises terminal statements over UPSERTs in the write iterator, which, according to the comment, may happen only during forced recovery. I don't see why we should do that, even during forced recovery, neither have I managed to find the reason in the commit history, so I dropped this code in order not to overburden the write iterator logic with some esoteric cases. Needed for #2129 --- src/box/vy_write_iterator.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/box/vy_write_iterator.c b/src/box/vy_write_iterator.c index b76c2ccb..7a3537f6 100644 --- a/src/box/vy_write_iterator.c +++ b/src/box/vy_write_iterator.c @@ -244,12 +244,15 @@ heap_less(heap_t *heap, struct heap_node *node1, struct heap_node *node2) if (lsn1 != lsn2) return lsn1 > lsn2; - /** - * LSNs are equal. This may happen only during forced recovery. - * Prioritize terminal (non-UPSERT) statements + /* + * LSNs are equal. This may only happen if one of the statements + * is a deferred DELETE and the overwritten tuple which it is + * supposed to purge has the same key parts as the REPLACE that + * overwrote it. Discard the deferred DELETE as the overwritten + * tuple will be (or has already been) purged by the REPLACE. */ - return (vy_stmt_type(src1->tuple) == IPROTO_UPSERT ? 1 : 0) < - (vy_stmt_type(src2->tuple) == IPROTO_UPSERT ? 1 : 0); + return (vy_stmt_type(src1->tuple) == IPROTO_DELETE ? 1 : 0) < + (vy_stmt_type(src2->tuple) == IPROTO_DELETE ? 1 : 0); } -- 2.11.0
next prev parent reply other threads:[~2018-07-27 11:29 UTC|newest] Thread overview: 39+ messages / expand[flat|nested] mbox.gz Atom feed top 2018-07-27 11:29 [PATCH 00/25] vinyl: eliminate disk read on REPLACE/DELETE Vladimir Davydov 2018-07-27 11:29 ` [PATCH 01/25] vinyl: make point lookup always return the latest tuple version Vladimir Davydov 2018-07-27 11:29 ` [PATCH 02/25] vinyl: simplify vy_squash_process Vladimir Davydov 2018-07-27 11:29 ` [PATCH 03/25] vinyl: always get full tuple from pk after reading from secondary index Vladimir Davydov 2018-07-27 11:29 ` [PATCH 04/25] vinyl: fold vy_replace_one and vy_replace_impl Vladimir Davydov 2018-07-27 11:29 ` [PATCH 05/25] vinyl: fold vy_delete_impl Vladimir Davydov 2018-07-27 11:29 ` [PATCH 06/25] vinyl: refactor unique check Vladimir Davydov 2018-07-27 11:29 ` [PATCH 07/25] vinyl: check key uniqueness before modifying tx write set Vladimir Davydov 2018-07-27 11:29 ` [PATCH 08/25] vinyl: remove env argument of vy_check_is_unique_{primary,secondary} Vladimir Davydov 2018-07-31 20:45 ` [tarantool-patches] " Konstantin Osipov 2018-07-27 11:29 ` [PATCH 09/25] vinyl: store full tuples in secondary index cache Vladimir Davydov 2018-07-31 20:47 ` Konstantin Osipov 2018-07-27 11:29 ` [PATCH 10/25] vinyl: do not free pending tasks on shutdown Vladimir Davydov 2018-07-31 20:48 ` Konstantin Osipov 2018-07-27 11:29 ` [PATCH 11/25] vinyl: store pointer to scheduler in struct vy_task Vladimir Davydov 2018-07-31 20:49 ` Konstantin Osipov 2018-07-27 11:29 ` [PATCH 12/25] vinyl: rename some members of vy_scheduler and vy_task struct Vladimir Davydov 2018-07-27 11:29 ` [PATCH 13/25] vinyl: use cbus for communication between scheduler and worker threads Vladimir Davydov 2018-07-27 11:29 ` [PATCH 14/25] vinyl: zap vy_scheduler::is_worker_pool_running Vladimir Davydov 2018-07-27 11:29 ` [PATCH 15/25] vinyl: rename vy_task::status to is_failed Vladimir Davydov 2018-07-27 11:29 ` [PATCH 16/25] xrow: allow to store flags in DML requests Vladimir Davydov 2018-07-27 11:29 ` [PATCH 17/25] vinyl: pin last statement returned by write iterator explicitly Vladimir Davydov 2018-07-27 11:29 ` [PATCH 18/25] vinyl: teach write iterator to return overwritten tuples Vladimir Davydov 2018-07-27 11:29 ` Vladimir Davydov [this message] 2018-07-27 11:30 ` [PATCH 20/25] vinyl: allow to skip certain statements on read Vladimir Davydov 2018-07-27 11:30 ` [PATCH 21/25] vinyl: add function to create surrogate deletes from raw msgpack Vladimir Davydov 2018-07-27 11:30 ` [PATCH 22/25] vinyl: remove pointless assertion from vy_stmt_new_surrogate_delete Vladimir Davydov 2018-07-27 11:30 ` [PATCH 23/25] txn: add helper to detect transaction boundaries Vladimir Davydov 2018-07-31 20:52 ` [tarantool-patches] " Konstantin Osipov 2018-07-27 11:30 ` [PATCH 24/25] Introduce _vinyl_deferred_delete system space Vladimir Davydov 2018-07-31 20:54 ` Konstantin Osipov 2018-08-01 14:00 ` Vladimir Davydov 2018-08-01 20:25 ` [tarantool-patches] " Konstantin Osipov 2018-08-02 9:43 ` Vladimir Davydov 2018-08-06 8:42 ` Vladimir Davydov 2018-07-27 11:30 ` [PATCH 25/25] vinyl: eliminate disk read on REPLACE/DELETE Vladimir Davydov 2018-07-31 20:55 ` Konstantin Osipov 2018-08-01 16:03 ` Vladimir Davydov 2018-08-01 16:51 ` Vladimir Davydov
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=42559d41fef6382a080e3a178fd70f6c18c34612.1532689066.git.vdavydov.dev@gmail.com \ --to=vdavydov.dev@gmail.com \ --cc=kostja@tarantool.org \ --cc=tarantool-patches@freelists.org \ --subject='Re: [PATCH 19/25] vinyl: prepare write iterator heap comparator for deferred DELETEs' \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox