From: imeevma@tarantool.org To: korablev@tarantool.org Cc: tarantool-patches@dev.tarantool.org Subject: [Tarantool-patches] [PATCH v5 1/3] box: introduce 'service' engine Date: Sun, 29 Dec 2019 18:39:48 +0300 [thread overview] Message-ID: <4509e2f9451b4a46c45f2fae8098d55e0028dcd3.1577633885.git.imeevma@gmail.com> (raw) In-Reply-To: <cover.1577633885.git.imeevma@gmail.com> This patch introduces a new engine called "service" that will be used to create a new system space. The main idea of this engine is that it will not have a predefined space_vtab. With this engine, we can create unusual spaces with their own vtab and behavior. Due to the nature of this engine, it can only be used to create system spaces. Part of #4511 --- src/box/CMakeLists.txt | 1 + src/box/box.cc | 4 + src/box/service_engine.c | 95 ++++++++++++++++++++++ src/box/service_engine.h | 53 ++++++++++++ ...h-4511-access-settings-from-any-frontend.result | 10 +++ ...4511-access-settings-from-any-frontend.test.lua | 4 + 6 files changed, 167 insertions(+) create mode 100644 src/box/service_engine.c create mode 100644 src/box/service_engine.h create mode 100644 test/box/gh-4511-access-settings-from-any-frontend.result create mode 100644 test/box/gh-4511-access-settings-from-any-frontend.test.lua diff --git a/src/box/CMakeLists.txt b/src/box/CMakeLists.txt index fc9d1a3..e0b5c55 100644 --- a/src/box/CMakeLists.txt +++ b/src/box/CMakeLists.txt @@ -79,6 +79,7 @@ add_library(box STATIC memtx_space.c sysview.c blackhole.c + service_engine.c vinyl.c vy_stmt.c vy_mem.c diff --git a/src/box/box.cc b/src/box/box.cc index b119c92..11ffead 100644 --- a/src/box/box.cc +++ b/src/box/box.cc @@ -53,6 +53,7 @@ #include "memtx_engine.h" #include "sysview.h" #include "blackhole.h" +#include "service_engine.h" #include "vinyl.h" #include "space.h" #include "index.h" @@ -1693,6 +1694,9 @@ engine_init() struct sysview_engine *sysview = sysview_engine_new_xc(); engine_register((struct engine *)sysview); + struct engine *service_engine = service_engine_new_xc(); + engine_register(service_engine); + struct engine *blackhole = blackhole_engine_new_xc(); engine_register(blackhole); diff --git a/src/box/service_engine.c b/src/box/service_engine.c new file mode 100644 index 0000000..67f8422 --- /dev/null +++ b/src/box/service_engine.c @@ -0,0 +1,95 @@ +/* + * Copyright 2010-2019, 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 "service_engine.h" +#include "schema.h" + +static void +service_engine_shutdown(struct engine *engine) +{ + free(engine); +} + +static struct space * +service_engine_create_space(struct engine *engine, struct space_def *def, + struct rlist *key_list) +{ + (void)engine; + (void)def; + (void)key_list; + /* There are currently no spaces with this engine. */ + diag_set(ClientError, ER_UNSUPPORTED, "Tarantool", + "spaces with 'service' engine."); + return NULL; +} + +static const struct engine_vtab service_engine_vtab = { + /* .shutdown = */ service_engine_shutdown, + /* .create_space = */ service_engine_create_space, + /* .prepare_join = */ generic_engine_prepare_join, + /* .join = */ generic_engine_join, + /* .complete_join = */ generic_engine_complete_join, + /* .begin = */ generic_engine_begin, + /* .begin_statement = */ generic_engine_begin_statement, + /* .prepare = */ generic_engine_prepare, + /* .commit = */ generic_engine_commit, + /* .rollback_statement = */ generic_engine_rollback_statement, + /* .rollback = */ generic_engine_rollback, + /* .switch_to_ro = */ generic_engine_switch_to_ro, + /* .bootstrap = */ generic_engine_bootstrap, + /* .begin_initial_recovery = */ generic_engine_begin_initial_recovery, + /* .begin_final_recovery = */ generic_engine_begin_final_recovery, + /* .end_recovery = */ generic_engine_end_recovery, + /* .begin_checkpoint = */ generic_engine_begin_checkpoint, + /* .wait_checkpoint = */ generic_engine_wait_checkpoint, + /* .commit_checkpoint = */ generic_engine_commit_checkpoint, + /* .abort_checkpoint = */ generic_engine_abort_checkpoint, + /* .collect_garbage = */ generic_engine_collect_garbage, + /* .backup = */ generic_engine_backup, + /* .memory_stat = */ generic_engine_memory_stat, + /* .reset_stat = */ generic_engine_reset_stat, + /* .check_space_def = */ generic_engine_check_space_def, +}; + +struct engine * +service_engine_new(void) +{ + struct engine *service_engine = calloc(1, sizeof(*service_engine)); + if (service_engine == NULL) { + diag_set(OutOfMemory, sizeof(*service_engine), "calloc", + "service_engine"); + return NULL; + } + + service_engine->vtab = &service_engine_vtab; + service_engine->name = "service"; + service_engine->flags = ENGINE_BYPASS_TX; + return service_engine; +} diff --git a/src/box/service_engine.h b/src/box/service_engine.h new file mode 100644 index 0000000..48e2518 --- /dev/null +++ b/src/box/service_engine.h @@ -0,0 +1,53 @@ +#pragma once +/* + * Copyright 2010-2019, 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) */ + +struct engine * +service_engine_new(void); + +#if defined(__cplusplus) +} /* extern "C" */ + +#include "diag.h" + +static inline struct engine * +service_engine_new_xc(void) +{ + struct engine *service_engine = service_engine_new(); + if (service_engine == NULL) + diag_raise(); + return service_engine; +} + +#endif /* defined(__plusplus) */ diff --git a/test/box/gh-4511-access-settings-from-any-frontend.result b/test/box/gh-4511-access-settings-from-any-frontend.result new file mode 100644 index 0000000..de8bcb7 --- /dev/null +++ b/test/box/gh-4511-access-settings-from-any-frontend.result @@ -0,0 +1,10 @@ +-- test-run result file version 2 +test_run = require('test_run').new() + | --- + | ... + +-- User cannot create spaces with this engine. +s = box.schema.space.create('test', {engine = 'service'}) + | --- + | - error: Tarantool does not support spaces with 'service' engine. + | ... diff --git a/test/box/gh-4511-access-settings-from-any-frontend.test.lua b/test/box/gh-4511-access-settings-from-any-frontend.test.lua new file mode 100644 index 0000000..e2d212d --- /dev/null +++ b/test/box/gh-4511-access-settings-from-any-frontend.test.lua @@ -0,0 +1,4 @@ +test_run = require('test_run').new() + +-- User cannot create spaces with this engine. +s = box.schema.space.create('test', {engine = 'service'}) -- 2.7.4
next prev parent reply other threads:[~2019-12-29 15:39 UTC|newest] Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top 2019-12-29 15:39 [Tarantool-patches] [PATCH v5 0/3] Introduce _session_setting system space imeevma 2019-12-29 15:39 ` imeevma [this message] 2019-12-29 15:39 ` [Tarantool-patches] [PATCH v5 2/3] box: introduce _session_settings " imeevma 2019-12-29 15:39 ` [Tarantool-patches] [PATCH v5 3/3] box: add SQL settings to _session_settings imeevma
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=4509e2f9451b4a46c45f2fae8098d55e0028dcd3.1577633885.git.imeevma@gmail.com \ --to=imeevma@tarantool.org \ --cc=korablev@tarantool.org \ --cc=tarantool-patches@dev.tarantool.org \ --subject='Re: [Tarantool-patches] [PATCH v5 1/3] box: introduce '\''service'\'' engine' \ /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