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