Skip to content
Snippets Groups Projects
Commit f1e7a91d authored by Vladimir Davydov's avatar Vladimir Davydov Committed by Vladimir Davydov
Browse files

sequence: get rid of sequence_data_iterator::tuple

Since commit f167c1af ("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
parent 4e277eb5
No related branches found
No related tags found
No related merge requests found
......@@ -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;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment