Tarantool development patches archive
 help / color / mirror / Atom feed
From: Kirill Shcherbatov <kshcherbatov@tarantool.org>
To: tarantool-patches@freelists.org, kostja@tarantool.org
Cc: vdavydov.dev@gmail.com, Kirill Shcherbatov <kshcherbatov@tarantool.org>
Subject: [PATCH v4 1/4] box: introduce tuple_chunk infrastructure
Date: Wed, 24 Jul 2019 10:36:07 +0300	[thread overview]
Message-ID: <6018ccf411d14cf95cbd0e06a8c1eaa06a5c281e.1563953154.git.kshcherbatov@tarantool.org> (raw)
In-Reply-To: <cover.1563953154.git.kshcherbatov@tarantool.org>

Introduced a new object tuple_chunk: a memory allocation is
associated with given tuple. tuple_format's vtab is extended
with few new methods to manage tuple_chunks lifecycle.
Implemented corresponding methid for memtx engine: a memory
chunks are allocated with memtx's smalloc allocator.

Needed for #1260
---
 src/box/tuple.h        | 28 ++++++++++++++++++++++++++++
 src/box/tuple_format.h |  9 +++++++++
 src/box/memtx_engine.c | 27 +++++++++++++++++++++++++++
 src/box/tuple.c        |  8 ++++++++
 src/box/vy_stmt.c      |  2 ++
 5 files changed, 74 insertions(+)

diff --git a/src/box/tuple.h b/src/box/tuple.h
index 99dfeb82d..60b6fb474 100644
--- a/src/box/tuple.h
+++ b/src/box/tuple.h
@@ -447,6 +447,34 @@ tuple_delete(struct tuple *tuple)
 	format->vtab.tuple_delete(format, tuple);
 }
 
+/** Tuple chunk memory object. */
+struct tuple_chunk {
+	/** The payload size. Needed to perform memory release.*/
+	uint32_t data_sz;
+	/** Metadata object payload. */
+	char data[0];
+};
+
+/** Calculate the size of tuple_chunk object by given data_sz. */
+uint32_t
+tuple_chunk_sz(uint32_t data_sz);
+
+/** Allocate a new tuple_chunk for given tuple. */
+static inline struct tuple_chunk *
+tuple_chunk_new(struct tuple *tuple, uint32_t data_sz)
+{
+	struct tuple_format *format = tuple_format(tuple);
+	return format->vtab.tuple_chunk_new(format, tuple, data_sz);
+}
+
+/** Free a tuple_chunk is allocated for given tuple. */
+static inline void
+tuple_chunk_delete(struct tuple *tuple, struct tuple_chunk *tuple_chunk)
+{
+	struct tuple_format *format = tuple_format(tuple);
+	format->vtab.tuple_chunk_delete(format, tuple_chunk);
+}
+
 /**
  * Check tuple data correspondence to space format.
  * Actually, checks everything that is checked by
diff --git a/src/box/tuple_format.h b/src/box/tuple_format.h
index e4f5f0018..63efbde04 100644
--- a/src/box/tuple_format.h
+++ b/src/box/tuple_format.h
@@ -64,6 +64,7 @@ enum { TUPLE_INDEX_BASE = 1 };
 enum { TUPLE_OFFSET_SLOT_NIL = INT32_MAX };
 
 struct tuple;
+struct tuple_chunk;
 struct tuple_format;
 struct coll;
 
@@ -82,6 +83,14 @@ struct tuple_format_vtab {
 	struct tuple*
 	(*tuple_new)(struct tuple_format *format, const char *data,
 	             const char *end);
+	/** Free a tuple_chunk allocated for given tuple. */
+	void
+	(*tuple_chunk_delete)(struct tuple_format *format,
+			      struct tuple_chunk *tuple_chunk);
+	/** Allocate a new tuple_chunk for given tuple. */
+	struct tuple_chunk *
+	(*tuple_chunk_new)(struct tuple_format *format, struct tuple *tuple,
+			   uint32_t data_sz);
 };
 
 /** Tuple field meta information for tuple_format. */
diff --git a/src/box/memtx_engine.c b/src/box/memtx_engine.c
index 428491c2d..fbb3151c9 100644
--- a/src/box/memtx_engine.c
+++ b/src/box/memtx_engine.c
@@ -1126,9 +1126,36 @@ memtx_tuple_delete(struct tuple_format *format, struct tuple *tuple)
 		smfree_delayed(&memtx->alloc, memtx_tuple, total);
 }
 
+void
+metmx_tuple_chunk_delete(struct tuple_format *format,
+			 struct tuple_chunk *tuple_chunk)
+{
+	struct memtx_engine *memtx = (struct memtx_engine *)format->engine;
+	uint32_t sz = tuple_chunk_sz(tuple_chunk->data_sz);
+	smfree(&memtx->alloc, tuple_chunk, sz);
+}
+
+struct tuple_chunk *
+memtx_tuple_chunk_new(struct tuple_format *format, struct tuple *tuple,
+		      uint32_t data_sz)
+{
+	struct memtx_engine *memtx = (struct memtx_engine *)format->engine;
+	uint32_t sz = tuple_chunk_sz(data_sz);
+	struct tuple_chunk *tuple_chunk =
+		(struct tuple_chunk *) smalloc(&memtx->alloc, sz);
+	if (tuple == NULL) {
+		diag_set(OutOfMemory, sz, "smalloc", "tuple");
+		return NULL;
+	}
+	tuple_chunk->data_sz = data_sz;
+	return tuple_chunk;
+}
+
 struct tuple_format_vtab memtx_tuple_format_vtab = {
 	memtx_tuple_delete,
 	memtx_tuple_new,
+	metmx_tuple_chunk_delete,
+	memtx_tuple_chunk_new,
 };
 
 /**
diff --git a/src/box/tuple.c b/src/box/tuple.c
index c0e94d55b..25f85f732 100644
--- a/src/box/tuple.c
+++ b/src/box/tuple.c
@@ -67,6 +67,8 @@ runtime_tuple_new(struct tuple_format *format, const char *data, const char *end
 static struct tuple_format_vtab tuple_format_runtime_vtab = {
 	runtime_tuple_delete,
 	runtime_tuple_new,
+	NULL,
+	NULL,
 };
 
 static struct tuple *
@@ -785,3 +787,9 @@ mp_str(const char *data)
 		return "<failed to format message pack>";
 	return buf;
 }
+
+uint32_t
+tuple_chunk_sz(uint32_t data_sz)
+{
+	return sizeof(struct tuple_chunk) + data_sz;
+}
diff --git a/src/box/vy_stmt.c b/src/box/vy_stmt.c
index f936cd61f..518a24f43 100644
--- a/src/box/vy_stmt.c
+++ b/src/box/vy_stmt.c
@@ -118,6 +118,8 @@ vy_stmt_env_create(struct vy_stmt_env *env)
 {
 	env->tuple_format_vtab.tuple_new = vy_tuple_new;
 	env->tuple_format_vtab.tuple_delete = vy_tuple_delete;
+	env->tuple_format_vtab.tuple_chunk_new = NULL;
+	env->tuple_format_vtab.tuple_chunk_delete = NULL;
 	env->max_tuple_size = 1024 * 1024;
 	env->key_format = vy_stmt_format_new(env, NULL, 0, NULL, 0, 0, NULL);
 	if (env->key_format == NULL)
-- 
2.22.0

  reply	other threads:[~2019-07-24  7:36 UTC|newest]

Thread overview: 22+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-07-24  7:36 [PATCH v4 0/4] box: functional indexes Kirill Shcherbatov
2019-07-24  7:36 ` Kirill Shcherbatov [this message]
2019-07-24  7:36 ` [PATCH v4 2/4] box: generalize memtx_multikey_tree methods Kirill Shcherbatov
2019-07-24 19:24   ` Konstantin Osipov
2019-07-24  7:36 ` [PATCH v4 3/4] box: refactor memtx_tree_delete_identical Kirill Shcherbatov
2019-07-24 19:24   ` Konstantin Osipov
2019-07-24  7:36 ` [PATCH v4 4/4] box: introduce functional indexes Kirill Shcherbatov
2019-07-24 12:24   ` [tarantool-patches] " Kirill Shcherbatov
2019-07-24 19:41   ` Konstantin Osipov
2019-07-24 20:04   ` Konstantin Osipov
2019-07-24 20:22   ` Konstantin Osipov
2019-07-25 11:20     ` [tarantool-patches] " Kirill Shcherbatov
2019-07-24 20:44   ` Konstantin Osipov
2019-07-25 11:22     ` [tarantool-patches] " Kirill Shcherbatov
2019-07-24 21:07   ` Konstantin Osipov
2019-07-25  8:27     ` [tarantool-patches] " Kirill Shcherbatov
2019-07-25  8:40       ` Konstantin Osipov
2019-07-25 11:18         ` Kirill Shcherbatov
2019-07-24 21:17   ` Konstantin Osipov
2019-07-24 21:56   ` Konstantin Osipov
2019-07-25  8:33     ` [tarantool-patches] " Kirill Shcherbatov
2019-07-24 12:25 ` [tarantool-patches] [PATCH v4 4/5] box: fix memtx_tree_index_build_array_deduplicate Kirill Shcherbatov

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=6018ccf411d14cf95cbd0e06a8c1eaa06a5c281e.1563953154.git.kshcherbatov@tarantool.org \
    --to=kshcherbatov@tarantool.org \
    --cc=kostja@tarantool.org \
    --cc=tarantool-patches@freelists.org \
    --cc=vdavydov.dev@gmail.com \
    --subject='Re: [PATCH v4 1/4] box: introduce tuple_chunk infrastructure' \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox