From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from smtp16.mail.ru (smtp16.mail.ru [94.100.176.153]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dev.tarantool.org (Postfix) with ESMTPS id 7D1A144643B for ; Wed, 14 Oct 2020 02:01:30 +0300 (MSK) From: Timur Safin Date: Wed, 14 Oct 2020 02:01:12 +0300 Message-Id: <23f2b9468c529a6276ac75c1cfe81e60e1fabfb2.1602629628.git.tsafin@tarantool.org> In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [Tarantool-patches] [PATCH 2.X v4 4/4] module api: box_ibuf_* wrappers List-Id: Tarantool development patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: v.shpilevoy@tarantool.org, alexander.turenko@tarantool.org Cc: tarantool-patches@dev.tarantool.org Introduced the bare minimum of ibuf accessors, which make external merger possible: - box_ibuf_reserve - box_ibuf_read_range - box_ibuf_write_range Part of #5384 --- src/CMakeLists.txt | 1 + src/box/CMakeLists.txt | 1 + src/box/ibuf.c | 65 +++++++++++++++++++++++++++++++ src/box/ibuf.h | 67 ++++++++++++++++++++++++++++++++ src/exports.h | 3 ++ test/app-tap/module_api.c | 44 +++++++++++++++++++++ test/app-tap/module_api.test.lua | 2 +- 7 files changed, 182 insertions(+), 1 deletion(-) create mode 100644 src/box/ibuf.c create mode 100644 src/box/ibuf.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 699536652..3817f5c62 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -152,6 +152,7 @@ set(api_headers ${CMAKE_SOURCE_DIR}/src/box/tuple_extract_key.h ${CMAKE_SOURCE_DIR}/src/box/schema_def.h ${CMAKE_SOURCE_DIR}/src/box/box.h + ${CMAKE_SOURCE_DIR}/src/box/ibuf.h ${CMAKE_SOURCE_DIR}/src/box/index.h ${CMAKE_SOURCE_DIR}/src/box/iterator_type.h ${CMAKE_SOURCE_DIR}/src/box/error.h diff --git a/src/box/CMakeLists.txt b/src/box/CMakeLists.txt index 8b2e704cf..690de5e83 100644 --- a/src/box/CMakeLists.txt +++ b/src/box/CMakeLists.txt @@ -191,6 +191,7 @@ add_library(box STATIC wal.c call.c merger.c + ibuf.c ${sql_sources} ${lua_sources} lua/init.c diff --git a/src/box/ibuf.c b/src/box/ibuf.c new file mode 100644 index 000000000..12b9f2781 --- /dev/null +++ b/src/box/ibuf.c @@ -0,0 +1,65 @@ +/* + * Copyright 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 ``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 + * 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 + +#include "ibuf.h" +#include + +void * +box_ibuf_reserve(box_ibuf_t *ibuf, size_t size) +{ + return ibuf_reserve(ibuf, size); +} + +void +box_ibuf_read_range(box_ibuf_t *ibuf, char ***rpos, char ***wpos) +{ + assert(ibuf != NULL); + if (ibuf == NULL) + return; + if (rpos != NULL) + *rpos = &ibuf->rpos; + if (wpos != NULL) + *wpos = &ibuf->wpos; +} + +void +box_ibuf_write_range(box_ibuf_t *ibuf, char ***wpos, char ***end) +{ + if (ibuf == NULL) + return; + if (wpos != NULL) + *wpos = &ibuf->wpos; + if (end != NULL) + *end = &ibuf->end; + +} diff --git a/src/box/ibuf.h b/src/box/ibuf.h new file mode 100644 index 000000000..d17f8f4b4 --- /dev/null +++ b/src/box/ibuf.h @@ -0,0 +1,67 @@ +#pragma once +/* + * Copyright 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 ``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 + * 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 + +#include + +#if defined(__cplusplus) +extern "C" { +#endif /* defined(__cplusplus) */ + +/** \cond public */ + +typedef struct ibuf box_ibuf_t; + +/** + * Reserve requested amount of bytes in ibuf buffer + */ +API_EXPORT void * +box_ibuf_reserve(box_ibuf_t *ibuf, size_t size); + +/** + * Return pointers to read range pointers used [rpos..wpos) + */ +API_EXPORT void +box_ibuf_read_range(box_ibuf_t *ibuf, char ***rpos, char ***wpos); + +/** + * Return pointers to write range pointers used [wpos..end) + */ +API_EXPORT void +box_ibuf_write_range(box_ibuf_t *ibuf, char ***wpos, char ***end); + +/** \endcond public */ + +#if defined(__cplusplus) +} /* extern "C" */ +#endif /* defined(__cplusplus) */ diff --git a/src/exports.h b/src/exports.h index 9c56686db..6d8138ff5 100644 --- a/src/exports.h +++ b/src/exports.h @@ -17,6 +17,9 @@ EXPORT(box_error_last) EXPORT(box_error_message) EXPORT(box_error_set) EXPORT(box_error_type) +EXPORT(box_ibuf_read_range) +EXPORT(box_ibuf_reserve) +EXPORT(box_ibuf_write_range) EXPORT(box_index_bsize) EXPORT(box_index_count) EXPORT(box_index_get) diff --git a/test/app-tap/module_api.c b/test/app-tap/module_api.c index a095416fe..e73ad6d72 100644 --- a/test/app-tap/module_api.c +++ b/test/app-tap/module_api.c @@ -164,6 +164,49 @@ test_checkibuf(lua_State *L) return 1; } +static int +test_box_ibuf(lua_State *L) +{ + struct slab_cache *slabc = cord_slab_cache(); + assert(slabc != NULL); + box_ibuf_t ibuf; + + ibuf_create(&ibuf, slabc, 16320); + assert(ibuf_used(&ibuf) == 0); + void *ptr = box_ibuf_reserve(&ibuf, 65536); + assert(ptr != NULL); + char **rpos; + char **wpos; + box_ibuf_read_range(&ibuf, &rpos, &wpos); + + ptr = ibuf_alloc(&ibuf, 10); + assert(ptr != NULL); + + assert(ibuf_used(&ibuf) == 10); + assert((*wpos - *rpos) == 10); + + /* let be a little bit paranoid and double check */ + box_ibuf_read_range(&ibuf, &rpos, &wpos); + assert((*wpos - *rpos) == 10); + + ptr = ibuf_alloc(&ibuf, 10000); + assert(ptr); + assert(ibuf_used(&ibuf) == 10010); + assert((*wpos - *rpos) == 10010); + + size_t unused = ibuf_unused(&ibuf); + char **end; + box_ibuf_write_range(&ibuf, &wpos, &end); + assert((*end - *wpos) == (ptrdiff_t)unused); + + ibuf_reset(&ibuf); + assert(ibuf_used(&ibuf) == 0); + assert(*rpos == *wpos); + + lua_pushboolean(L, 1); + return 1; +} + static int test_touint64(lua_State *L) { @@ -1277,6 +1320,7 @@ luaopen_module_api(lua_State *L) {"tuple_validate_def", test_tuple_validate_default}, {"tuple_validate_fmt", test_tuple_validate_formatted}, {"test_key_def_dup", test_key_def_dup}, + {"test_box_ibuf", test_box_ibuf}, {NULL, NULL} }; luaL_register(L, "module_api", lib); diff --git a/test/app-tap/module_api.test.lua b/test/app-tap/module_api.test.lua index ff251b338..33150d91e 100755 --- a/test/app-tap/module_api.test.lua +++ b/test/app-tap/module_api.test.lua @@ -218,7 +218,7 @@ local function test_iscdata(test, module) end local test = require('tap').test("module_api", function(test) - test:plan(34) + test:plan(35) local status, module = pcall(require, 'module_api') test:is(status, true, "module") test:ok(status, "module is loaded") -- 2.20.1