From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-lj1-f193.google.com (mail-lj1-f193.google.com [209.85.208.193]) (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 2B2AD445322 for ; Thu, 23 Jul 2020 15:30:56 +0300 (MSK) Received: by mail-lj1-f193.google.com with SMTP id s9so6102344ljm.11 for ; Thu, 23 Jul 2020 05:30:56 -0700 (PDT) From: Cyrill Gorcunov Date: Thu, 23 Jul 2020 15:29:40 +0300 Message-Id: <20200723122942.196011-6-gorcunov@gmail.com> In-Reply-To: <20200723122942.196011-1-gorcunov@gmail.com> References: <20200723122942.196011-1-gorcunov@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [Tarantool-patches] [PATCH v2 5/7] qsync: provide a way to encode preallocated CONFIRM/ROLLBACK entries List-Id: Tarantool development patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: tml Cc: Vladislav Shpilevoy Force the caller to allocate memory. Eventually we are planning to use preallocated memory without calling region_alloc at all. Signed-off-by: Cyrill Gorcunov --- src/box/xrow.c | 32 +++++++++++++++++++++----------- src/box/xrow.h | 15 +++++++++++++++ 2 files changed, 36 insertions(+), 11 deletions(-) diff --git a/src/box/xrow.c b/src/box/xrow.c index c2f4ba40a..bebad2dd0 100644 --- a/src/box/xrow.c +++ b/src/box/xrow.c @@ -893,17 +893,11 @@ xrow_encode_dml(const struct request *request, struct region *region, return iovcnt; } -static int -xrow_encode_confirm_rollback(struct xrow_header *row, struct region *region, +int +xrow_encode_confirm_rollback(struct xrow_header *row, + struct request_synchro_body *body, uint32_t replica_id, int64_t lsn, int type) { - struct request_synchro_body *body; - - body = region_alloc(region, sizeof(*body)); - if (body == NULL) { - diag_set(OutOfMemory, sizeof(*body), "region_alloc", "body"); - return -1; - } request_synchro_body_create(body, replica_id, lsn); memset(row, 0, sizeof(*row)); @@ -921,7 +915,15 @@ int xrow_encode_confirm(struct xrow_header *row, struct region *region, uint32_t replica_id, int64_t lsn) { - return xrow_encode_confirm_rollback(row, region, replica_id, lsn, + struct request_synchro_body *body; + + body = region_alloc(region, sizeof(*body)); + if (body == NULL) { + diag_set(OutOfMemory, sizeof(*body), "region_alloc", "body"); + return -1; + } + + return xrow_encode_confirm_rollback(row, body, replica_id, lsn, IPROTO_CONFIRM); } @@ -929,7 +931,15 @@ int xrow_encode_rollback(struct xrow_header *row, struct region *region, uint32_t replica_id, int64_t lsn) { - return xrow_encode_confirm_rollback(row, region, replica_id, lsn, + struct request_synchro_body *body; + + body = region_alloc(region, sizeof(*body)); + if (body == NULL) { + diag_set(OutOfMemory, sizeof(*body), "region_alloc", "body"); + return -1; + } + + return xrow_encode_confirm_rollback(row, body, replica_id, lsn, IPROTO_ROLLBACK); } diff --git a/src/box/xrow.h b/src/box/xrow.h index e21ede5a3..503140d1e 100644 --- a/src/box/xrow.h +++ b/src/box/xrow.h @@ -54,6 +54,7 @@ enum { IPROTO_SELECT_HEADER_LEN = IPROTO_HEADER_LEN + 7, }; +struct request_synchro_body; struct region; struct xrow_header { @@ -215,6 +216,20 @@ int xrow_encode_dml(const struct request *request, struct region *region, struct iovec *iov); + +/** + * Encode the CONFIRM or ROLLBACK to row body and set row type. + * @param row xrow header. + * @param body body to encode. + * @param replica_id master's instance id. + * @param lsn last confirmed lsn. + * @param type IPROTO_CONFIRM or IPROTO_ROLLBACK. + */ +int +xrow_encode_confirm_rollback(struct xrow_header *row, + struct request_synchro_body *body, + uint32_t replica_id, int64_t lsn, int type); + /** * Encode the CONFIRM to row body and set row type to * IPROTO_CONFIRM. -- 2.26.2