From: Alexander Turenko <alexander.turenko@tarantool.org> To: Vladislav Shpilevoy <v.shpilevoy@tarantool.org> Cc: tarantool-patches@dev.tarantool.org, Alexander Turenko <alexander.turenko@tarantool.org> Subject: [Tarantool-patches] [PATCH 1.10 10/16] WIP: refactoring: extract key_def module API functions Date: Wed, 23 Sep 2020 04:40:23 +0300 [thread overview] Message-ID: <95d059b302453c1b34fb7510c6dbad541258b6fd.1600824556.git.alexander.turenko@tarantool.org> (raw) In-Reply-To: <cover.1600824556.git.alexander.turenko@tarantool.org> I plan to expand module API for key_def in further commits and mix of public and private structures and functions becomes hard to read. So it looks meaningful to extract module API wrappers into its own compilation unit. Added libtuple.a to the so called reexport libraries list, because otherwise the functions from key_def_api compilation unit are not exported on 1.10 (in the backported patch). Part of #5273 (backported from commit cd326628673cc6f2cbd0262ace543e70ae11433e) --- src/CMakeLists.txt | 4 +- src/box/CMakeLists.txt | 1 + src/box/key_def.c | 53 +++-------------- src/box/key_def.h | 86 ++++++++++----------------- src/box/key_def_api.c | 75 ++++++++++++++++++++++++ src/box/key_def_api.h | 101 ++++++++++++++++++++++++++++++++ test/unit/vy_iterators_helper.c | 1 + test/unit/vy_mem.c | 1 + test/unit/vy_point_lookup.c | 1 + test/unit/vy_write_iterator.c | 1 + 10 files changed, 221 insertions(+), 103 deletions(-) create mode 100644 src/box/key_def_api.c create mode 100644 src/box/key_def_api.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 45a8f7733..18a0f5172 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -198,7 +198,7 @@ set(api_headers ${CMAKE_SOURCE_DIR}/src/lua/utils.h ${CMAKE_SOURCE_DIR}/src/box/txn.h ${CMAKE_SOURCE_DIR}/src/box/tuple.h - ${CMAKE_SOURCE_DIR}/src/box/key_def.h + ${CMAKE_SOURCE_DIR}/src/box/key_def_api.h ${CMAKE_SOURCE_DIR}/src/box/field_def.h ${CMAKE_SOURCE_DIR}/src/box/tuple_format.h ${CMAKE_SOURCE_DIR}/src/box/tuple_extract_key.h @@ -230,7 +230,7 @@ target_link_libraries(server core bit uri uuid ${ICU_LIBRARIES}) # Rule of thumb: if exporting a symbol from a static library, list the # library here. set (reexport_libraries server core misc bitset csv - ${LUAJIT_LIBRARIES} ${MSGPUCK_LIBRARIES} ${ICU_LIBRARIES}) + tuple ${LUAJIT_LIBRARIES} ${MSGPUCK_LIBRARIES} ${ICU_LIBRARIES}) set (common_libraries ${reexport_libraries} diff --git a/src/box/CMakeLists.txt b/src/box/CMakeLists.txt index 52413d3cf..e1af1d9e4 100644 --- a/src/box/CMakeLists.txt +++ b/src/box/CMakeLists.txt @@ -41,6 +41,7 @@ add_library(tuple STATIC tuple_bloom.c tuple_dictionary.c key_def.c + key_def_api.c coll_id_def.c coll_id.c coll_id_cache.c diff --git a/src/box/key_def.c b/src/box/key_def.c index 545b5dad2..1fdb681a2 100644 --- a/src/box/key_def.c +++ b/src/box/key_def.c @@ -121,7 +121,7 @@ key_def_delete(struct key_def *def) free(def); } -static void +void key_def_set_cmp(struct key_def *def) { def->tuple_compare = tuple_compare_create(def); @@ -192,50 +192,6 @@ key_def_dump_parts(const struct key_def *def, struct key_part_def *parts) } } -box_key_def_t * -box_key_def_new(uint32_t *fields, uint32_t *types, uint32_t part_count) -{ - size_t sz = key_def_sizeof(part_count); - struct key_def *key_def = calloc(1, sz); - if (key_def == NULL) { - diag_set(OutOfMemory, sz, "malloc", "struct key_def"); - return NULL; - } - - key_def->part_count = part_count; - key_def->unique_part_count = part_count; - - for (uint32_t item = 0; item < part_count; ++item) { - key_def_set_part(key_def, item, fields[item], - (enum field_type)types[item], - false, NULL, COLL_NONE); - } - key_def_set_cmp(key_def); - return key_def; -} - -void -box_key_def_delete(box_key_def_t *key_def) -{ - key_def_delete(key_def); -} - -int -box_tuple_compare(const box_tuple_t *tuple_a, const box_tuple_t *tuple_b, - box_key_def_t *key_def) -{ - return tuple_compare(tuple_a, tuple_b, key_def); -} - -int -box_tuple_compare_with_key(const box_tuple_t *tuple_a, const char *key_b, - box_key_def_t *key_def) -{ - uint32_t part_count = mp_decode_array(&key_b); - return tuple_compare_with_key(tuple_a, key_b, part_count, key_def); - -} - int key_part_cmp(const struct key_part *parts1, uint32_t part_count1, const struct key_part *parts2, uint32_t part_count2) @@ -572,3 +528,10 @@ key_validate_parts(const struct key_def *key_def, const char *key, } return 0; } + +void +key_def_set_part_175(struct key_def *def, uint32_t part_no, uint32_t fieldno, + enum field_type type) +{ + key_def_set_part(def, part_no, fieldno, type, false, NULL, COLL_NONE); +} diff --git a/src/box/key_def.h b/src/box/key_def.h index 7623f650d..96993c0a4 100644 --- a/src/box/key_def.h +++ b/src/box/key_def.h @@ -167,62 +167,6 @@ key_def_swap(struct key_def *old_def, struct key_def *new_def); void key_def_delete(struct key_def *def); -typedef struct tuple box_tuple_t; - -/** \cond public */ - -typedef struct key_def box_key_def_t; - -/** - * Create key definition with key fields with passed typed on passed positions. - * May be used for tuple format creation and/or tuple comparison. - * - * \param fields array with key field identifiers - * \param types array with key field types (see enum field_type) - * \param part_count the number of key fields - * \returns a new key definition object - */ -API_EXPORT box_key_def_t * -box_key_def_new(uint32_t *fields, uint32_t *types, uint32_t part_count); - -/** - * Delete key definition - * - * \param key_def key definition to delete - */ -API_EXPORT void -box_key_def_delete(box_key_def_t *key_def); - -/** - * Compare tuples using the key definition. - * @param tuple_a first tuple - * @param tuple_b second tuple - * @param key_def key definition - * @retval 0 if key_fields(tuple_a) == key_fields(tuple_b) - * @retval <0 if key_fields(tuple_a) < key_fields(tuple_b) - * @retval >0 if key_fields(tuple_a) > key_fields(tuple_b) - */ -API_EXPORT int -box_tuple_compare(const box_tuple_t *tuple_a, const box_tuple_t *tuple_b, - box_key_def_t *key_def); - -/** - * @brief Compare tuple with key using the key definition. - * @param tuple tuple - * @param key key with MessagePack array header - * @param key_def key definition - * - * @retval 0 if key_fields(tuple) == parts(key) - * @retval <0 if key_fields(tuple) < parts(key) - * @retval >0 if key_fields(tuple) > parts(key) - */ - -API_EXPORT int -box_tuple_compare_with_key(const box_tuple_t *tuple_a, const char *key_b, - box_key_def_t *key_def); - -/** \endcond public */ - static inline size_t key_def_sizeof(uint32_t part_count) { @@ -507,6 +451,36 @@ tuple_compare_with_key(const struct tuple *tuple, const char *key, return key_def->tuple_compare_with_key(tuple, key, part_count, key_def); } +/* {{{ <box_key_def_new>() helpers */ + +/** + * Set key part within @a key_def. + * + * The same as module private <key_def_set_part>(), but with less + * parameters. It is helper for <box_key_def_new>(). + * + * 1.7.5 does not support collation, nullability and further + * key_def features. + */ +void +key_def_set_part_175(struct key_def *def, uint32_t part_no, uint32_t fieldno, + enum field_type type); + +/** + * Update compare, hash and extract functions. + * + * This function should be called after modification of + * @a key_def parts, because different compare, hash and extract + * functions should work depending of whether key parts are + * sequential, are nullable, whether a tuple may omit several + * fields at the end, whether a collation is used and so on. + * It is helper for <box_key_def_new>(). + */ +void +key_def_set_cmp(struct key_def *def); + +/* }}} <box_key_def_new>() helpers */ + #if defined(__cplusplus) } /* extern "C" */ #endif /* defined(__cplusplus) */ diff --git a/src/box/key_def_api.c b/src/box/key_def_api.c new file mode 100644 index 000000000..104ec5d5c --- /dev/null +++ b/src/box/key_def_api.c @@ -0,0 +1,75 @@ +/* + * Copyright 2010-2020, Tarantool AUTHORS, please see AUTHORS file. + * + * Redistribution and use in source and binary forms, with or + * without modification, are permitted provided that the following + * conditions are met: + * + * 1. Redistributions of source code must retain the above + * copyright notice, this list of conditions and the + * following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY <COPYRIGHT HOLDER> ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL + * <COPYRIGHT HOLDER> OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF + * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +#include "key_def_api.h" +#include "key_def.h" + +box_key_def_t * +box_key_def_new(uint32_t *fields, uint32_t *types, uint32_t part_count) +{ + size_t sz = key_def_sizeof(part_count); + struct key_def *key_def = calloc(1, sz); + if (key_def == NULL) { + diag_set(OutOfMemory, sz, "malloc", "struct key_def"); + return NULL; + } + + key_def->part_count = part_count; + key_def->unique_part_count = part_count; + + for (uint32_t item = 0; item < part_count; ++item) { + key_def_set_part_175(key_def, item, fields[item], + (enum field_type)types[item]); + } + key_def_set_cmp(key_def); + return key_def; +} + +void +box_key_def_delete(box_key_def_t *key_def) +{ + key_def_delete(key_def); +} + +int +box_tuple_compare(const box_tuple_t *tuple_a, const box_tuple_t *tuple_b, + box_key_def_t *key_def) +{ + return tuple_compare(tuple_a, tuple_b, key_def); +} + +int +box_tuple_compare_with_key(const box_tuple_t *tuple_a, const char *key_b, + box_key_def_t *key_def) +{ + uint32_t part_count = mp_decode_array(&key_b); + return tuple_compare_with_key(tuple_a, key_b, part_count, key_def); + +} diff --git a/src/box/key_def_api.h b/src/box/key_def_api.h new file mode 100644 index 000000000..82899eed6 --- /dev/null +++ b/src/box/key_def_api.h @@ -0,0 +1,101 @@ +#ifndef TARANTOOL_BOX_KEY_DEF_API_H_INCLUDED +#define TARANTOOL_BOX_KEY_DEF_API_H_INCLUDED +/* + * Copyright 2010-2020, Tarantool AUTHORS, please see AUTHORS file. + * + * Redistribution and use in source and binary forms, with or + * without modification, are permitted provided that the following + * conditions are met: + * + * 1. Redistributions of source code must retain the above + * copyright notice, this list of conditions and the + * following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY <COPYRIGHT HOLDER> ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL + * <COPYRIGHT HOLDER> OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF + * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if defined(__cplusplus) +extern "C" { +#endif /* defined(__cplusplus) */ + +#include <stdint.h> +#include "trivia/util.h" + +typedef struct tuple box_tuple_t; + +/** \cond public */ + +typedef struct key_def box_key_def_t; + +/** + * Create key definition with given field numbers and field types. + * + * May be used for tuple format creation and/or tuple comparison. + * + * \param fields array with key field identifiers + * \param types array with key field types (see enum field_type) + * \param part_count the number of key fields + * \returns a new key definition object + */ +API_EXPORT box_key_def_t * +box_key_def_new(uint32_t *fields, uint32_t *types, uint32_t part_count); + +/** + * Delete key definition + * + * \param key_def key definition to delete + */ +API_EXPORT void +box_key_def_delete(box_key_def_t *key_def); + +/** + * Compare tuples using the key definition. + * @param tuple_a first tuple + * @param tuple_b second tuple + * @param key_def key definition + * @retval 0 if key_fields(tuple_a) == key_fields(tuple_b) + * @retval <0 if key_fields(tuple_a) < key_fields(tuple_b) + * @retval >0 if key_fields(tuple_a) > key_fields(tuple_b) + */ +API_EXPORT int +box_tuple_compare(const box_tuple_t *tuple_a, const box_tuple_t *tuple_b, + box_key_def_t *key_def); + +/** + * @brief Compare tuple with key using the key definition. + * @param tuple tuple + * @param key key with MessagePack array header + * @param key_def key definition + * + * @retval 0 if key_fields(tuple) == parts(key) + * @retval <0 if key_fields(tuple) < parts(key) + * @retval >0 if key_fields(tuple) > parts(key) + */ +API_EXPORT int +box_tuple_compare_with_key(const box_tuple_t *tuple_a, const char *key_b, + box_key_def_t *key_def); + +/** \endcond public */ + +#if defined(__cplusplus) +} /* extern "C" */ +#endif /* defined(__cplusplus) */ + +#endif /* TARANTOOL_BOX_KEY_API_DEF_H_INCLUDED */ diff --git a/test/unit/vy_iterators_helper.c b/test/unit/vy_iterators_helper.c index 7fad5600c..063cf1e6d 100644 --- a/test/unit/vy_iterators_helper.c +++ b/test/unit/vy_iterators_helper.c @@ -1,3 +1,4 @@ +#include "key_def_api.h" #include "vy_iterators_helper.h" #include "memory.h" #include "fiber.h" diff --git a/test/unit/vy_mem.c b/test/unit/vy_mem.c index ebf3fbc77..e82991bfd 100644 --- a/test/unit/vy_mem.c +++ b/test/unit/vy_mem.c @@ -1,6 +1,7 @@ #include <trivia/config.h> #include "memory.h" #include "fiber.h" +#include "key_def_api.h" #include "vy_history.h" #include "vy_iterators_helper.h" diff --git a/test/unit/vy_point_lookup.c b/test/unit/vy_point_lookup.c index bec85fa02..546411dc5 100644 --- a/test/unit/vy_point_lookup.c +++ b/test/unit/vy_point_lookup.c @@ -1,5 +1,6 @@ #include "trivia/util.h" #include "unit.h" +#include "key_def_api.h" #include "vy_lsm.h" #include "vy_cache.h" #include "vy_run.h" diff --git a/test/unit/vy_write_iterator.c b/test/unit/vy_write_iterator.c index bb0eb8d39..1fe220e32 100644 --- a/test/unit/vy_write_iterator.c +++ b/test/unit/vy_write_iterator.c @@ -1,5 +1,6 @@ #include "memory.h" #include "fiber.h" +#include "key_def_api.h" #include "vy_write_iterator.h" #include "vy_iterators_helper.h" -- 2.25.0
next prev parent reply other threads:[~2020-09-23 1:40 UTC|newest] Thread overview: 55+ messages / expand[flat|nested] mbox.gz Atom feed top 2020-09-23 1:14 [Tarantool-patches] [PATCH 00/14] RFC: module api: extend for external key_def Lua module Alexander Turenko 2020-09-23 1:14 ` [Tarantool-patches] [PATCH 01/14] module api: get rid of typedef redefinitions Alexander Turenko 2020-09-23 1:14 ` [Tarantool-patches] [PATCH 02/14] WIP: module api: expose box region Alexander Turenko 2020-09-24 22:31 ` Vladislav Shpilevoy 2020-10-08 19:21 ` Alexander Turenko 2020-09-23 1:14 ` [Tarantool-patches] [PATCH 03/14] WIP: module api/lua: add luaL_iscdata() function Alexander Turenko 2020-09-24 22:32 ` Vladislav Shpilevoy 2020-10-08 21:46 ` Alexander Turenko 2020-09-23 1:14 ` [Tarantool-patches] [PATCH 04/14] WIP: module api/lua: expose luaT_tuple_new() Alexander Turenko 2020-09-23 1:14 ` [Tarantool-patches] [PATCH 05/14] WIP: module api/lua: add luaT_tuple_encode() Alexander Turenko 2020-09-24 22:32 ` Vladislav Shpilevoy 2020-10-12 19:06 ` Alexander Turenko 2020-09-23 1:14 ` [Tarantool-patches] [PATCH 06/14] WIP: refactoring: add API_EXPORT to lua/tuple functions Alexander Turenko 2020-09-23 1:14 ` [Tarantool-patches] [PATCH 07/14] WIP: refactoring: add API_EXPORT to key_def functions Alexander Turenko 2020-09-23 1:14 ` [Tarantool-patches] [PATCH 08/14] WIP: refactoring: extract key_def module API functions Alexander Turenko 2020-09-25 22:58 ` Vladislav Shpilevoy 2020-10-07 11:30 ` Alexander Turenko 2020-10-07 22:12 ` Vladislav Shpilevoy 2020-09-23 1:14 ` [Tarantool-patches] [PATCH 09/14] WIP: module api: add box_key_def_new_ex() Alexander Turenko 2020-09-25 22:58 ` Vladislav Shpilevoy 2020-10-09 21:54 ` Alexander Turenko 2020-09-23 1:14 ` [Tarantool-patches] [PATCH 10/14] WIP: module api: add box_key_def_dump_parts() Alexander Turenko 2020-09-25 22:58 ` Vladislav Shpilevoy 2020-10-09 9:33 ` Alexander Turenko 2020-09-23 1:14 ` [Tarantool-patches] [PATCH 11/14] WIP: module api: expose box_tuple_validate_key_parts() Alexander Turenko 2020-09-23 1:14 ` [Tarantool-patches] [PATCH 12/14] WIP: module api: expose box_key_def_merge() Alexander Turenko 2020-09-25 22:58 ` Vladislav Shpilevoy 2020-10-09 1:46 ` Alexander Turenko 2020-09-23 1:14 ` [Tarantool-patches] [PATCH 13/14] WIP: module api: expose box_tuple_extract_key_ex() Alexander Turenko 2020-09-25 22:58 ` Vladislav Shpilevoy 2020-10-09 1:14 ` Alexander Turenko 2020-10-10 1:21 ` Alexander Turenko 2020-09-23 1:14 ` [Tarantool-patches] [PATCH 14/14] WIP: module api: add box_key_def_validate_key() Alexander Turenko 2020-09-25 22:59 ` Vladislav Shpilevoy 2020-10-09 1:22 ` Alexander Turenko 2020-09-23 1:40 ` [Tarantool-patches] [PATCH 1.10 00/16] RFC: module api: extend for external key_def Lua module Alexander Turenko 2020-09-23 1:40 ` [Tarantool-patches] [PATCH 1.10 01/16] collation: allow to find a collation by a name Alexander Turenko 2020-09-23 1:40 ` [Tarantool-patches] [PATCH 1.10 02/16] refactoring: adjust contract of luaT_tuple_new() Alexander Turenko 2020-09-28 21:26 ` Vladislav Shpilevoy 2020-10-05 11:58 ` Alexander Turenko 2020-09-23 1:40 ` [Tarantool-patches] [PATCH 1.10 03/16] module api: get rid of typedef redefinitions Alexander Turenko 2020-09-23 1:40 ` [Tarantool-patches] [PATCH 1.10 04/16] WIP: module api: expose box region Alexander Turenko 2020-09-23 1:40 ` [Tarantool-patches] [PATCH 1.10 05/16] WIP: module api/lua: add luaL_iscdata() function Alexander Turenko 2020-09-23 1:40 ` [Tarantool-patches] [PATCH 1.10 06/16] WIP: module api/lua: expose luaT_tuple_new() Alexander Turenko 2020-09-23 1:40 ` [Tarantool-patches] [PATCH 1.10 07/16] WIP: module api/lua: add luaT_tuple_encode() Alexander Turenko 2020-09-23 1:40 ` [Tarantool-patches] [PATCH 1.10 08/16] WIP: refactoring: add API_EXPORT to lua/tuple functions Alexander Turenko 2020-09-23 1:40 ` [Tarantool-patches] [PATCH 1.10 09/16] WIP: refactoring: add API_EXPORT to key_def functions Alexander Turenko 2020-09-23 1:40 ` Alexander Turenko [this message] 2020-09-23 1:40 ` [Tarantool-patches] [PATCH 1.10 11/16] WIP: module api: add box_key_def_new_ex() Alexander Turenko 2020-09-23 1:40 ` [Tarantool-patches] [PATCH 1.10 12/16] WIP: module api: add box_key_def_dump_parts() Alexander Turenko 2020-09-23 1:40 ` [Tarantool-patches] [PATCH 1.10 13/16] WIP: module api: expose box_tuple_validate_key_parts() Alexander Turenko 2020-09-23 1:40 ` [Tarantool-patches] [PATCH 1.10 14/16] WIP: module api: expose box_key_def_merge() Alexander Turenko 2020-09-23 1:40 ` [Tarantool-patches] [PATCH 1.10 15/16] WIP: module api: expose box_tuple_extract_key_ex() Alexander Turenko 2020-09-23 1:40 ` [Tarantool-patches] [PATCH 1.10 16/16] WIP: module api: add box_key_def_validate_key() Alexander Turenko 2020-10-05 7:26 ` [Tarantool-patches] [PATCH 00/14] RFC: module api: extend for external key_def Lua module Alexander Turenko
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=95d059b302453c1b34fb7510c6dbad541258b6fd.1600824556.git.alexander.turenko@tarantool.org \ --to=alexander.turenko@tarantool.org \ --cc=tarantool-patches@dev.tarantool.org \ --cc=v.shpilevoy@tarantool.org \ --subject='Re: [Tarantool-patches] [PATCH 1.10 10/16] WIP: refactoring: extract key_def module API functions' \ /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