From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from smtp50.i.mail.ru (smtp50.i.mail.ru [94.100.177.110]) (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 1E3FC42EF5C for ; Tue, 23 Jun 2020 11:37:45 +0300 (MSK) References: <16c9d1ffb9d09bb2b2f206a23973e2734616c345.1592482315.git.sergepetrenko@tarantool.org> From: Serge Petrenko Message-ID: Date: Tue, 23 Jun 2020 11:37:43 +0300 MIME-Version: 1.0 In-Reply-To: <16c9d1ffb9d09bb2b2f206a23973e2734616c345.1592482315.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 4/4] txn_limbo: add ROLLBACK processing List-Id: Tarantool development patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: v.shpilevoy@tarantool.org, gorcunov@gmail.com Cc: tarantool-patches@dev.tarantool.org 18.06.2020 15:14, Serge Petrenko пишет: > Now txn_limbo writes a ROLLBACK entry to WAL when one of the limbo > entries fails to gather quorum during a txn_limbo_confirm_timeout. > All the limbo entries, starting with the failed one, are rolled back in > reverse order. > > Closes #4848 New commit: commit 2ee0c4380f17658b0fd1a507d565cd79b6910e3d Author: Serge Petrenko Date:   Mon Jun 22 21:08:49 2020 +0300     fix for 'txn_limbo: add ROLLBACK processing'     Fix parameter use inside applier_on_rollback_written().     Make applier_txn_rollback_cb() respect rollback reason in     txn->signature.     Make limbo set rollback reason after timeout or read ROLLBACK message.     [TO BE SQUASHED INTO THE PREVIOUS COMMIT] diff --git a/src/box/applier.cc b/src/box/applier.cc index 98a140a57..774af0149 100644 --- a/src/box/applier.cc +++ b/src/box/applier.cc @@ -273,10 +273,10 @@ applier_on_confirm_written(struct trigger *trig, void *event)   * Rolls back part of the txs waiting in limbo.   */  static int -applier_on_rollback_written(struct trigger *trig, void *data) +applier_on_rollback_written(struct trigger *trig, void *event)  { -    (void) trig; -    int64_t lsn = *(int64_t *)data; +    (void) event; +    int64_t lsn = *(int64_t *)trig->data;      txn_limbo_read_rollback(&txn_limbo, lsn);      return 0;  } @@ -801,6 +801,14 @@ static int  applier_txn_rollback_cb(struct trigger *trigger, void *event)  {      (void) trigger; +    struct txn *txn = (struct txn *) event; +    /* +     * Synchronous transaction rollback due to receiving a +     * ROLLBACK entry is a normal event and requires no +     * special handling. +     */ +    if (txn->signature == TXN_SIGNATURE_SYNC_ROLLBACK) +        return 0;      /*       * Setup shared applier diagnostic area. diff --git a/src/box/txn_limbo.c b/src/box/txn_limbo.c index 03badf9fc..931f5c3d4 100644 --- a/src/box/txn_limbo.c +++ b/src/box/txn_limbo.c @@ -150,7 +150,7 @@ txn_limbo_wait_complete(struct txn_limbo *limbo, struct txn_limbo_entry *entry)          rlist_foreach_entry_safe_reverse(e, &limbo->queue,                           in_queue, tmp) {              e->is_rollback = true; -            e->txn->signature = -1; +            e->txn->signature = TXN_SIGNATURE_QUORUM_TIMEOUT;              txn_limbo_pop(limbo, e);              txn_clear_flag(e->txn, TXN_WAIT_ACK);              txn_complete(e->txn); @@ -274,7 +274,7 @@ txn_limbo_read_rollback(struct txn_limbo *limbo, int64_t lsn)          txn_clear_flag(e->txn, TXN_WAIT_ACK);          /* Rollback the transaction. */ -        e->txn->signature = -1; +        e->txn->signature = TXN_SIGNATURE_SYNC_ROLLBACK;          txn_complete(e->txn);      }  } -- Serge Petrenko