From: Kirill Shcherbatov <kshcherbatov@tarantool.org>
To: tarantool-patches@freelists.org, vdavydov.dev@gmail.com
Cc: kostja@tarantool.org, Kirill Shcherbatov <kshcherbatov@tarantool.org>
Subject: [PATCH v3 3/4] box: introduce tuple_extra infrastructure
Date: Wed, 17 Jul 2019 04:20:44 +0300 [thread overview]
Message-ID: <3474f2b5e217e1dcd5ab405b72f574b283b132f0.1563326037.git.kshcherbatov@tarantool.org> (raw)
In-Reply-To: <cover.1563326037.git.kshcherbatov@tarantool.org>
Introduced a new object tuple_extra: a memory allocation is
associated with given tuple and chunk_id. Extended tuple_format's
vtab with few new methods to manage tuple_extras lifecycle.
Supported tuple_extra for memtx engine: a memory
chunks are allocated with memtx's smalloc allocator.
Needed for #1260
---
src/box/memtx_engine.c | 29 +++++++++++++++++++++++++++++
src/box/tuple.c | 8 ++++++++
src/box/tuple.h | 39 +++++++++++++++++++++++++++++++++++++++
src/box/tuple_format.h | 15 +++++++++++++++
src/box/vy_stmt.c | 2 ++
5 files changed, 93 insertions(+)
diff --git a/src/box/memtx_engine.c b/src/box/memtx_engine.c
index 428491c2d..49efcc192 100644
--- a/src/box/memtx_engine.c
+++ b/src/box/memtx_engine.c
@@ -1126,9 +1126,38 @@ memtx_tuple_delete(struct tuple_format *format, struct tuple *tuple)
smfree_delayed(&memtx->alloc, memtx_tuple, total);
}
+void
+metmx_tuple_extra_delete(struct tuple_format *format,
+ struct tuple_extra *tuple_extra)
+{
+ struct memtx_engine *memtx = (struct memtx_engine *)format->engine;
+ uint32_t sz = tuple_extra_sz(tuple_extra->data_sz);
+ smfree(&memtx->alloc, tuple_extra, sz);
+}
+
+struct tuple_extra *
+memtx_tuple_extra_new(struct tuple_format *format, struct tuple *tuple,
+ uint32_t chunk_id, uint32_t data_sz)
+{
+ struct memtx_engine *memtx = (struct memtx_engine *)format->engine;
+ uint32_t sz = tuple_extra_sz(data_sz);
+ struct tuple_extra *tuple_extra =
+ (struct tuple_extra *) smalloc(&memtx->alloc, sz);
+ if (tuple == NULL) {
+ diag_set(OutOfMemory, sz, "smalloc", "tuple");
+ return NULL;
+ }
+ tuple_extra->tuple = tuple;
+ tuple_extra->chunk_id = chunk_id;
+ tuple_extra->data_sz = data_sz;
+ return tuple_extra;
+}
+
struct tuple_format_vtab memtx_tuple_format_vtab = {
memtx_tuple_delete,
memtx_tuple_new,
+ metmx_tuple_extra_delete,
+ memtx_tuple_extra_new,
};
/**
diff --git a/src/box/tuple.c b/src/box/tuple.c
index c0e94d55b..ca0e5230a 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_extra_sz(uint32_t data_sz)
+{
+ return sizeof(struct tuple_extra) + data_sz;
+}
diff --git a/src/box/tuple.h b/src/box/tuple.h
index 99dfeb82d..70119292e 100644
--- a/src/box/tuple.h
+++ b/src/box/tuple.h
@@ -447,6 +447,45 @@ tuple_delete(struct tuple *tuple)
format->vtab.tuple_delete(format, tuple);
}
+/** Tuple metadata hashtable entry. */
+struct tuple_extra {
+ /** Tuple pointer is used as a hash key. */
+ struct tuple *tuple;
+ /** An extention identifier. */
+ uint32_t chunk_id;
+ /** The payload size. Needed to perform memory release.*/
+ uint32_t data_sz;
+ /** Metadata object payload. */
+ char data[0];
+};
+
+/** Calculate the size of tuple_extra object by given data_sz. */
+uint32_t
+tuple_extra_sz(uint32_t data_sz);
+
+/**
+ * Allocate a new extra allocation for given tuple and
+ * unique chunk_id identifier.
+ */
+static inline struct tuple_extra *
+tuple_extra_new(struct tuple *tuple, uint32_t chunk_id, uint32_t data_sz)
+{
+ struct tuple_format *format = tuple_format(tuple);
+ return format->vtab.tuple_extra_new(format, tuple, chunk_id, data_sz);
+}
+
+/**
+ * Free allocated tuple extra for given tuple and unique
+ * chunk_id identifier.
+ */
+static inline void
+tuple_extra_delete(struct tuple_extra *tuple_extra)
+{
+ struct tuple_format *format =
+ tuple_format(tuple_extra->tuple);
+ format->vtab.tuple_extra_delete(format, tuple_extra);
+}
+
/**
* 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..ac4f8a702 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_extra;
struct tuple_format;
struct coll;
@@ -82,6 +83,20 @@ struct tuple_format_vtab {
struct tuple*
(*tuple_new)(struct tuple_format *format, const char *data,
const char *end);
+ /**
+ * Free allocated tuple extra for given tuple and unique
+ * chunk_id identifier.
+ */
+ void
+ (*tuple_extra_delete)(struct tuple_format *format,
+ struct tuple_extra *tuple_extra);
+ /**
+ * Allocate a new extra allocation for given tuple and
+ * unique chunk_id identifier.
+ */
+ struct tuple_extra *
+ (*tuple_extra_new)(struct tuple_format *format, struct tuple *tuple,
+ uint32_t chunk_id, uint32_t data_sz);
};
/** Tuple field meta information for tuple_format. */
diff --git a/src/box/vy_stmt.c b/src/box/vy_stmt.c
index f936cd61f..6b09e5e53 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_extra_new = NULL;
+ env->tuple_format_vtab.tuple_extra_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
next prev parent reply other threads:[~2019-07-17 1:20 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-07-17 1:20 [PATCH v3 0/4] box: functional indexes Kirill Shcherbatov
2019-07-17 1:20 ` [PATCH v3 1/4] box: introduce key_def->is_multikey flag Kirill Shcherbatov
2019-07-17 14:34 ` Konstantin Osipov
2019-07-18 11:20 ` [tarantool-patches] " Kirill Yukhin
2019-07-17 1:20 ` [PATCH v3 2/4] box: refactor key_validate_parts to return key_end Kirill Shcherbatov
2019-07-18 9:41 ` Konstantin Osipov
2019-07-18 11:21 ` [tarantool-patches] " Kirill Yukhin
2019-07-17 1:20 ` Kirill Shcherbatov [this message]
2019-07-18 9:47 ` [PATCH v3 3/4] box: introduce tuple_extra infrastructure Konstantin Osipov
2019-07-17 1:20 ` [PATCH v3 4/4] box: introduce functional indexes in memtx Kirill Shcherbatov
2019-07-18 9:50 ` [tarantool-patches] " Konstantin Osipov
2019-07-18 9:54 ` Konstantin Osipov
2019-07-18 9:55 ` Konstantin Osipov
2019-07-18 10:02 ` Konstantin Osipov
2019-07-22 14:45 ` Vladimir Davydov
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=3474f2b5e217e1dcd5ab405b72f574b283b132f0.1563326037.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 v3 3/4] box: introduce tuple_extra 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