From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from smtp5.mail.ru (smtp5.mail.ru [94.100.179.24]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dev.tarantool.org (Postfix) with ESMTPS id 25F8642EF5C for ; Fri, 19 Jun 2020 21:45:03 +0300 (MSK) References: <46ed0cc08e6ecf7ee7c9250d9cdfc3d68aa5c764.1592589312.git.sergepetrenko@tarantool.org> From: Serge Petrenko Message-ID: <30f75001-3ecc-9d7f-9cba-88c824087f4e@tarantool.org> Date: Fri, 19 Jun 2020 21:45:01 +0300 MIME-Version: 1.0 In-Reply-To: <46ed0cc08e6ecf7ee7c9250d9cdfc3d68aa5c764.1592589312.git.sergepetrenko@tarantool.org> Content-Type: text/plain; charset="utf-8"; format="flowed" Content-Transfer-Encoding: 8bit Content-Language: ru Subject: Re: [Tarantool-patches] [PATCH 1/2] box: rework local_recovery to use async txn_commit List-Id: Tarantool development patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: v.shpilevoy@tarantool.org, sergos@tarantool.org, gorcunov@tarantool.org, lvasiliev@tarantool.org Cc: tarantool-patches@dev.tarantool.org 19.06.2020 21:00, Serge Petrenko пишет: > Local recovery should use asynchronous txn commit procedure in order to > get to CONFIRM and ROLLBACK statements for a transaction that needs > confirmation before confirmation timeout happens. > Using async txn commit doesn't harm other transactions, since the > journal used during local recovery fakes writes and its write_async() > method may reuse plain write(). Added a new commit. I didn't squash it, because its debatable. commit 83760f8b0d1a59e17ab6adeeda60efc1bc6e94ad Author: Serge Petrenko Date:   Fri Jun 19 21:42:35 2020 +0300     box: fix for 'box: rework local_recovery to use async txn_commit'     [TO BE SQUASHED INTO THE PREVIOUS COMMIT] diff --git a/src/box/box.cc b/src/box/box.cc index f80d6f8e6..0fe7625fb 100644 --- a/src/box/box.cc +++ b/src/box/box.cc @@ -222,6 +222,12 @@ box_process_rw(struct request *request, struct space *space,                  */                 if (is_local_recovery) {                         res = txn_commit_async(txn); +                       /* +                        * Hack: remove the unnecessary trigger. +                        * I don't know of a better place to do +                        * it. +                        */ + trigger_clear(&txn->on_write_failure);                 } else {                         res = txn_commit(txn);                 } diff --git a/src/box/txn.c b/src/box/txn.c index 2360ecae3..d36c11dda 100644 --- a/src/box/txn.c +++ b/src/box/txn.c @@ -688,9 +688,9 @@ txn_commit_async(struct txn *txn)          * Set a trigger to abort waiting for confirm on WAL write          * failure.          */ -       trigger_create(&txn->on_write_failure, txn_limbo_on_rollback, -                      limbo_entry, NULL);         if (is_sync) { + trigger_create(&txn->on_write_failure, txn_limbo_on_rollback, +                              limbo_entry, NULL);                 txn_on_rollback(txn, &txn->on_write_failure);         }         return 0; -- Serge Petrenko