From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-lj1-f196.google.com (mail-lj1-f196.google.com [209.85.208.196]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by dev.tarantool.org (Postfix) with ESMTPS id 42D39469719 for ; Thu, 5 Mar 2020 15:31:29 +0300 (MSK) Received: by mail-lj1-f196.google.com with SMTP id f10so5852700ljn.6 for ; Thu, 05 Mar 2020 04:31:29 -0800 (PST) From: Cyrill Gorcunov Date: Thu, 5 Mar 2020 15:29:41 +0300 Message-Id: <20200305122943.7324-9-gorcunov@gmail.com> In-Reply-To: <20200305122943.7324-1-gorcunov@gmail.com> References: <20200305122943.7324-1-gorcunov@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [Tarantool-patches] [PATCH 08/10] box/txn: move journal allocation into separate routine List-Id: Tarantool development patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: tml For now we assign callbacks unconditionally but it is done to minimize changes in each patch in the series. Signed-off-by: Cyrill Gorcunov --- src/box/txn.c | 55 ++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 39 insertions(+), 16 deletions(-) diff --git a/src/box/txn.c b/src/box/txn.c index c5f24ebdb..685f476e2 100644 --- a/src/box/txn.c +++ b/src/box/txn.c @@ -478,41 +478,49 @@ txn_entry_complete_cb(struct journal_entry *entry, void *data) fiber_set_txn(fiber(), NULL); } -static int64_t -txn_write_to_wal(struct txn *txn) +static struct journal_entry * +txn_journal_entry_new(struct txn *txn) { + struct journal_entry *req; + struct txn_stmt *stmt; + assert(txn->n_new_rows + txn->n_applier_rows > 0); - /* Prepare a journal entry. */ - struct journal_entry *req = journal_entry_new(txn->n_new_rows + - txn->n_applier_rows, - &txn->region, - txn_entry_complete_cb, - txn); - if (req == NULL) { - txn_rollback(txn); - return -1; - } + req = journal_entry_new(txn->n_new_rows + txn->n_applier_rows, + &txn->region, txn_entry_complete_cb, txn); + if (req == NULL) + return NULL; - struct txn_stmt *stmt; struct xrow_header **remote_row = req->rows; struct xrow_header **local_row = req->rows + txn->n_applier_rows; + stailq_foreach_entry(stmt, &txn->stmts, next) { if (stmt->has_triggers) { txn_init_triggers(txn); rlist_splice(&txn->on_commit, &stmt->on_commit); } + + /* A read (e.g. select) request */ if (stmt->row == NULL) - continue; /* A read (e.g. select) request */ + continue; + if (stmt->row->replica_id == 0) *local_row++ = stmt->row; else *remote_row++ = stmt->row; + req->approx_len += xrow_approx_len(stmt->row); } + assert(remote_row == req->rows + txn->n_applier_rows); assert(local_row == remote_row + txn->n_new_rows); + return req; +} + +static int64_t +txn_write_to_wal(struct journal_entry *req) +{ /* * Send the entry to the journal. * @@ -591,6 +599,8 @@ txn_commit_nop(struct txn *txn) int txn_commit_async(struct txn *txn) { + struct journal_entry *req; + if (txn_prepare(txn) != 0) { txn_rollback(txn); return -1; @@ -599,12 +609,19 @@ txn_commit_async(struct txn *txn) if (txn_commit_nop(txn)) return 0; - return txn_write_to_wal(txn); + req = txn_journal_entry_new(txn); + if (req == NULL) { + txn_rollback(txn); + return -1; + } + + return txn_write_to_wal(req); } int txn_commit(struct txn *txn) { + struct journal_entry *req; int res = -1; txn->fiber = fiber(); @@ -619,7 +636,13 @@ txn_commit(struct txn *txn) goto out; } - if (txn_write_to_wal(txn) != 0) + req = txn_journal_entry_new(txn); + if (req == NULL) { + txn_rollback(txn); + goto out; + } + + if (txn_write_to_wal(req) != 0) return -1; /* -- 2.20.1