[tarantool-patches] [PATCH v1 1/1] box: option to start tarantool with no format checks.
imeevma at tarantool.org
imeevma at tarantool.org
Mon Aug 13 19:30:20 MSK 2018
Special option allows Tarantool create spaces with no
format checks. This is useful to fix malformed formats
after an upgrade from version < 1.7.5 to >= 1.7.5.
Closes #3605.
---
Branch: https://github.com/tarantool/tarantool/tree/imeevma/gh-3605-ignore-space-formats-option
Issue: https://github.com/tarantool/tarantool/issues/3605
src/box/alter.cc | 14 ++++++-
src/box/box.h | 1 +
src/box/lua/cfg.cc | 13 +++++++
src/box/lua/load_cfg.lua | 3 ++
src/main.cc | 1 +
test/app-tap/init_script.result | 71 ++++++++++++++++++------------------
test/box-tap/ignore_formats.test.lua | 34 +++++++++++++++++
test/box/admin.result | 2 +
test/box/cfg.result | 4 ++
9 files changed, 107 insertions(+), 36 deletions(-)
create mode 100755 test/box-tap/ignore_formats.test.lua
diff --git a/src/box/alter.cc b/src/box/alter.cc
index ec3b91b..b379dad 100644
--- a/src/box/alter.cc
+++ b/src/box/alter.cc
@@ -54,6 +54,18 @@
#include "sequence.h"
/**
+ * A flag to ignore space formats and do not validate tuples by
+ * them.
+ */
+static bool ignore_space_formats = false;
+
+void
+box_set_ignore_space_formats(bool value)
+{
+ ignore_space_formats = value;
+}
+
+/**
* chap-sha1 of empty string, i.e.
* base64_encode(sha1(sha1(""), 0)
*/
@@ -533,7 +545,7 @@ space_def_new_from_tuple(struct tuple *tuple, uint32_t errcode,
const char *space_opts;
struct field_def *fields;
uint32_t field_count;
- if (dd_version_id >= version_id(1, 7, 6)) {
+ if (dd_version_id >= version_id(1, 7, 6) && !ignore_space_formats) {
/* Check space opts. */
space_opts =
tuple_field_with_type_xc(tuple, BOX_SPACE_FIELD_OPTS,
diff --git a/src/box/box.h b/src/box/box.h
index 9dfb3fd..d4043db 100644
--- a/src/box/box.h
+++ b/src/box/box.h
@@ -176,6 +176,7 @@ void box_set_vinyl_timeout(void);
void box_set_replication_timeout(void);
void box_set_replication_connect_timeout(void);
void box_set_replication_connect_quorum(void);
+void box_set_ignore_space_formats(bool value);
extern "C" {
#endif /* defined(__cplusplus) */
diff --git a/src/box/lua/cfg.cc b/src/box/lua/cfg.cc
index 0ca1508..c4237ba 100644
--- a/src/box/lua/cfg.cc
+++ b/src/box/lua/cfg.cc
@@ -177,6 +177,18 @@ lbox_cfg_set_read_only(struct lua_State *L)
}
static int
+lbox_cfg_set_ignore_space_formats(struct lua_State *L)
+{
+ try {
+ box_set_ignore_space_formats(cfg_geti("ignore_space_"\
+ "formats") != 0);
+ } catch (Exception *) {
+ luaT_error(L);
+ }
+ return 0;
+}
+
+static int
lbox_cfg_set_memtx_max_tuple_size(struct lua_State *L)
{
try {
@@ -279,6 +291,7 @@ box_lua_cfg_init(struct lua_State *L)
{"cfg_set_snap_io_rate_limit", lbox_cfg_set_snap_io_rate_limit},
{"cfg_set_checkpoint_count", lbox_cfg_set_checkpoint_count},
{"cfg_set_read_only", lbox_cfg_set_read_only},
+ {"cfg_set_ignore_space_formats", lbox_cfg_set_ignore_space_formats},
{"cfg_set_memtx_max_tuple_size", lbox_cfg_set_memtx_max_tuple_size},
{"cfg_set_vinyl_max_tuple_size", lbox_cfg_set_vinyl_max_tuple_size},
{"cfg_set_vinyl_cache", lbox_cfg_set_vinyl_cache},
diff --git a/src/box/lua/load_cfg.lua b/src/box/lua/load_cfg.lua
index 2a7142d..8dfcbf0 100644
--- a/src/box/lua/load_cfg.lua
+++ b/src/box/lua/load_cfg.lua
@@ -66,6 +66,7 @@ local default_cfg = {
username = nil,
coredump = false,
read_only = false,
+ ignore_space_formats= false,
hot_standby = false,
checkpoint_interval = 3600,
checkpoint_count = 2,
@@ -124,6 +125,7 @@ local template_cfg = {
checkpoint_interval = 'number',
checkpoint_count = 'number',
read_only = 'boolean',
+ ignore_space_formats= 'boolean',
hot_standby = 'boolean',
worker_pool_threads = 'number',
replication_timeout = 'number',
@@ -183,6 +185,7 @@ local dynamic_cfg = {
too_long_threshold = private.cfg_set_too_long_threshold,
snap_io_rate_limit = private.cfg_set_snap_io_rate_limit,
read_only = private.cfg_set_read_only,
+ ignore_space_formats = private.cfg_set_ignore_space_formats,
memtx_max_tuple_size = private.cfg_set_memtx_max_tuple_size,
vinyl_max_tuple_size = private.cfg_set_vinyl_max_tuple_size,
vinyl_cache = private.cfg_set_vinyl_cache,
diff --git a/src/main.cc b/src/main.cc
index 1682bae..30cc78d 100644
--- a/src/main.cc
+++ b/src/main.cc
@@ -521,6 +521,7 @@ load_cfg()
title_set_custom(cfg_gets("custom_proc_title"));
title_update();
+ box_set_ignore_space_formats(cfg_geti("ignore_space_formats") != 0);
box_cfg();
}
diff --git a/test/app-tap/init_script.result b/test/app-tap/init_script.result
index eea9f5b..f8b8994 100644
--- a/test/app-tap/init_script.result
+++ b/test/app-tap/init_script.result
@@ -9,41 +9,42 @@ box.cfg
4 coredump:false
5 force_recovery:false
6 hot_standby:false
-7 listen:port
-8 log:tarantool.log
-9 log_format:plain
-10 log_level:5
-11 log_nonblock:true
-12 memtx_dir:.
-13 memtx_max_tuple_size:1048576
-14 memtx_memory:107374182
-15 memtx_min_tuple_size:16
-16 pid_file:box.pid
-17 read_only:false
-18 readahead:16320
-19 replication_connect_timeout:30
-20 replication_sync_lag:10
-21 replication_timeout:1
-22 rows_per_wal:500000
-23 slab_alloc_factor:1.05
-24 too_long_threshold:0.5
-25 vinyl_bloom_fpr:0.05
-26 vinyl_cache:134217728
-27 vinyl_dir:.
-28 vinyl_max_tuple_size:1048576
-29 vinyl_memory:134217728
-30 vinyl_page_size:8192
-31 vinyl_range_size:1073741824
-32 vinyl_read_threads:1
-33 vinyl_run_count_per_level:2
-34 vinyl_run_size_ratio:3.5
-35 vinyl_timeout:60
-36 vinyl_write_threads:2
-37 wal_dir:.
-38 wal_dir_rescan_delay:2
-39 wal_max_size:268435456
-40 wal_mode:write
-41 worker_pool_threads:4
+7 ignore_space_formats:false
+8 listen:port
+9 log:tarantool.log
+10 log_format:plain
+11 log_level:5
+12 log_nonblock:true
+13 memtx_dir:.
+14 memtx_max_tuple_size:1048576
+15 memtx_memory:107374182
+16 memtx_min_tuple_size:16
+17 pid_file:box.pid
+18 read_only:false
+19 readahead:16320
+20 replication_connect_timeout:30
+21 replication_sync_lag:10
+22 replication_timeout:1
+23 rows_per_wal:500000
+24 slab_alloc_factor:1.05
+25 too_long_threshold:0.5
+26 vinyl_bloom_fpr:0.05
+27 vinyl_cache:134217728
+28 vinyl_dir:.
+29 vinyl_max_tuple_size:1048576
+30 vinyl_memory:134217728
+31 vinyl_page_size:8192
+32 vinyl_range_size:1073741824
+33 vinyl_read_threads:1
+34 vinyl_run_count_per_level:2
+35 vinyl_run_size_ratio:3.5
+36 vinyl_timeout:60
+37 vinyl_write_threads:2
+38 wal_dir:.
+39 wal_dir_rescan_delay:2
+40 wal_max_size:268435456
+41 wal_mode:write
+42 worker_pool_threads:4
--
-- Test insert from detached fiber
--
diff --git a/test/box-tap/ignore_formats.test.lua b/test/box-tap/ignore_formats.test.lua
new file mode 100755
index 0000000..84818ed
--- /dev/null
+++ b/test/box-tap/ignore_formats.test.lua
@@ -0,0 +1,34 @@
+#!/usr/bin/env tarantool
+--
+-- gh-3605: allow to ignore space formats via box.cfg option.
+--
+local tap = require('tap')
+local test = tap.test("ignore_formats")
+test:plan(3)
+
+local format = {}
+format[1] = {'field1', 'unsigned'}
+format[2] = {'field2', 'unsigned'}
+
+-- Default value for ignore_space_formats is 'false'
+box.cfg{}
+local s1 = box.schema.create_space('test1', {format = format})
+local pk1 = s1:create_index('pk')
+test:ok(not pcall(s1.replace, s1, {1, 'string'}), 'cannot violate format')
+
+-- Set ignore_space_formats = true.
+box.cfg{ignore_space_formats=true}
+local s2 = box.schema.create_space('test2', {format = format})
+local pk2 = s2:create_index('pk')
+test:ok(pcall(s2.replace, s2, {1, 'string'}), 'can violate format')
+
+-- Set ignore_space_formats = false.
+box.cfg{ignore_space_formats=false}
+local s3 = box.schema.create_space('test3', {format = format})
+local pk3 = s3:create_index('pk')
+test:ok(not pcall(s3.replace, s3, {1, 'string'}), 'cannot violate format')
+
+s1:drop()
+s2:drop()
+s3:drop()
+os.exit(test:check() == true and 0 or 1)
diff --git a/test/box/admin.result b/test/box/admin.result
index c3e318a..9200ed8 100644
--- a/test/box/admin.result
+++ b/test/box/admin.result
@@ -30,6 +30,8 @@ cfg_filter(box.cfg)
- false
- - hot_standby
- false
+ - - ignore_space_formats
+ - false
- - listen
- <hidden>
- - log
diff --git a/test/box/cfg.result b/test/box/cfg.result
index cda7aa0..fad4b87 100644
--- a/test/box/cfg.result
+++ b/test/box/cfg.result
@@ -26,6 +26,8 @@ cfg_filter(box.cfg)
- false
- - hot_standby
- false
+ - - ignore_space_formats
+ - false
- - listen
- <hidden>
- - log
@@ -115,6 +117,8 @@ cfg_filter(box.cfg)
- false
- - hot_standby
- false
+ - - ignore_space_formats
+ - false
- - listen
- <hidden>
- - log
--
2.7.4
More information about the Tarantool-patches
mailing list