From f1e7a91dc40292efb98f3d3228639bcd1f1e3305 Mon Sep 17 00:00:00 2001
From: Vladimir Davydov <vdavydov@tarantool.org>
Date: Mon, 8 Aug 2022 11:18:06 +0300
Subject: [PATCH] sequence: get rid of sequence_data_iterator::tuple

Since commit f167c1afb38ef ("memtx: decompress tuples in snapshot
iterator") a snapshot iterator may allocate the result tuple on the
fiber region - the caller is supposed to clean the region after usage.
So we don't need to store the tuple in sequence_data_iterator anymore -
we can allocate it on the fiber region instead, which is simpler and
more straightforward.

NO_DOC=internal
NO_TEST=internal
NO_CHANGELOG=internal
---
 src/box/sequence.c | 24 ++++++++----------------
 1 file changed, 8 insertions(+), 16 deletions(-)

diff --git a/src/box/sequence.c b/src/box/sequence.c
index 36bd18aa5d..1cd68980dc 100644
--- a/src/box/sequence.c
+++ b/src/box/sequence.c
@@ -306,13 +306,8 @@ struct sequence_data_iterator {
 	struct light_sequence_view view;
 	/** Iterator over the data index. */
 	struct light_sequence_iterator iter;
-	/** Last tuple returned by the iterator. */
-	char tuple[0];
 };
 
-#define SEQUENCE_TUPLE_BUF_SIZE		(mp_sizeof_array(2) + \
-					 2 * mp_sizeof_uint(UINT64_MAX))
-
 static int
 sequence_data_iterator_next(struct snapshot_iterator *base,
 			    const char **data, uint32_t *size)
@@ -327,15 +322,18 @@ sequence_data_iterator_next(struct snapshot_iterator *base,
 		return 0;
 	}
 
-	char *buf_end = iter->tuple;
+	const size_t buf_size = mp_sizeof_array(2) +
+				2 * mp_sizeof_uint(UINT64_MAX);
+	char *buf = region_alloc(&fiber()->gc, buf_size);
+	char *buf_end = buf;
 	buf_end = mp_encode_array(buf_end, 2);
 	buf_end = mp_encode_uint(buf_end, sd->id);
 	buf_end = (sd->value >= 0 ?
 		   mp_encode_uint(buf_end, sd->value) :
 		   mp_encode_int(buf_end, sd->value));
-	assert(buf_end <= iter->tuple + SEQUENCE_TUPLE_BUF_SIZE);
-	*data = iter->tuple;
-	*size = buf_end - iter->tuple;
+	assert(buf_end <= buf + buf_size);
+	*data = buf;
+	*size = buf_end - buf;
 	return 0;
 }
 
@@ -352,13 +350,7 @@ sequence_data_iterator_free(struct snapshot_iterator *base)
 struct snapshot_iterator *
 sequence_data_iterator_create(void)
 {
-	struct sequence_data_iterator *iter = calloc(1, sizeof(*iter) +
-						     SEQUENCE_TUPLE_BUF_SIZE);
-	if (iter == NULL) {
-		diag_set(OutOfMemory, sizeof(*iter) + SEQUENCE_TUPLE_BUF_SIZE,
-			 "malloc", "sequence_data_iterator");
-		return NULL;
-	}
+	struct sequence_data_iterator *iter = xcalloc(1, sizeof(*iter));
 
 	iter->base.free = sequence_data_iterator_free;
 	iter->base.next = sequence_data_iterator_next;
-- 
GitLab