diff --git a/extra/schema_fill.lua b/extra/schema_fill.lua index 0fc6caf1debf1d6d41b580189683967cb911b1bc..975caba8ce9f031ef7482e112631f84c067d44ba 100644 --- a/extra/schema_fill.lua +++ b/extra/schema_fill.lua @@ -10,12 +10,12 @@ _priv = box.space[box.schema.PRIV_ID] -- define schema version _schema:insert{'version', 1, 6} -- define system spaces -_space:insert{_schema.n, ADMIN, '_schema', 0} -_space:insert{_space.n, ADMIN, '_space', 0} -_space:insert{_index.n, ADMIN, '_index', 0} -_space:insert{_func.n, ADMIN, '_func', 0} -_space:insert{_user.n, ADMIN, '_user', 0} -_space:insert{_priv.n, ADMIN, '_priv', 0} +_space:insert{_schema.n, ADMIN, '_schema', 'memtx', 0} +_space:insert{_space.n, ADMIN, '_space', 'memtx', 0} +_space:insert{_index.n, ADMIN, '_index', 'memtx', 0} +_space:insert{_func.n, ADMIN, '_func', 'memtx', 0} +_space:insert{_user.n, ADMIN, '_user', 'memtx', 0} +_space:insert{_priv.n, ADMIN, '_priv', 'memtx', 0} -- define indexes _index:insert{_schema.n, 0, 'primary', 'tree', 1, 1, 0, 'str'} diff --git a/src/bootstrap.snap b/src/bootstrap.snap index 71d7828c44f874099567fc642e08e603799c4622..70257782f59a443cdd8e51a3358586f571749bbd 100644 Binary files a/src/bootstrap.snap and b/src/bootstrap.snap differ diff --git a/src/box/alter.cc b/src/box/alter.cc index 292aba6a0f601e43c246e63b214d6a329364d116..74bb31ff5dc9d398156c3ef9240d21cb67cab31b 100644 --- a/src/box/alter.cc +++ b/src/box/alter.cc @@ -40,24 +40,25 @@ #include <ctype.h> /** _space columns */ -#define ID 0 -#define UID 1 -#define NAME 2 -#define ARITY 3 -#define FLAGS 4 +#define ID 0 +#define UID 1 +#define NAME 2 +#define ENGINE 3 +#define ARITY 4 +#define FLAGS 5 /** _index columns */ -#define INDEX_ID 1 -#define INDEX_TYPE 3 -#define INDEX_IS_UNIQUE 4 -#define INDEX_PART_COUNT 5 +#define INDEX_ID 1 +#define INDEX_TYPE 3 +#define INDEX_IS_UNIQUE 4 +#define INDEX_PART_COUNT 5 /** _user columns */ -#define AUTH_DATA 3 +#define AUTH_DATA 3 /** _priv columns */ -#define PRIV_OBJECT_TYPE 2 -#define PRIV_OBJECT_ID 3 -#define PRIV_ACCESS 4 +#define PRIV_OBJECT_TYPE 2 +#define PRIV_OBJECT_ID 3 +#define PRIV_ACCESS 4 /* {{{ Auxiliary functions and methods. */ @@ -152,11 +153,13 @@ space_def_create_from_tuple(struct space_def *def, struct tuple *tuple, def->id = tuple_field_u32(tuple, ID); def->uid = tuple_field_u32(tuple, UID); def->arity = tuple_field_u32(tuple, ARITY); - int n = snprintf(def->name, sizeof(def->name), + int namelen = snprintf(def->name, sizeof(def->name), "%s", tuple_field_cstr(tuple, NAME)); + int engine_namelen = snprintf(def->engine_name, sizeof(def->engine_name), + "%s", tuple_field_cstr(tuple, ENGINE)); space_def_init_flags(def, tuple); - space_def_check(def, n, errcode); + space_def_check(def, namelen, engine_namelen, errcode); if (errcode != ER_ALTER_SPACE && def->id >= SC_SYSTEM_ID_MIN && def->id < SC_SYSTEM_ID_MAX) { say_warn("\n" @@ -484,6 +487,11 @@ ModifySpace::prepare(struct alter_space *alter) (unsigned) space_id(alter->old_space), "space id is immutable"); + if (strcmp(def.engine_name, alter->old_space->def.engine_name) != 0) + tnt_raise(ClientError, ER_ALTER_SPACE, + (unsigned) space_id(alter->old_space), + "can not change space engine"); + if (def.arity != 0 && def.arity != alter->old_space->def.arity && alter->old_space->engine.state != READY_NO_KEYS && diff --git a/src/box/key_def.cc b/src/box/key_def.cc index cac9a0c580540820470f882c7952deb30c1f3a5d..57a396eb3f3b9548b3877ca09cb24097dd96cda0 100644 --- a/src/box/key_def.cc +++ b/src/box/key_def.cc @@ -219,7 +219,8 @@ key_def_check(struct key_def *key_def) } void -space_def_check(struct space_def *def, uint32_t namelen, uint32_t errcode) +space_def_check(struct space_def *def, uint32_t namelen, uint32_t engine_namelen, + int32_t errcode) { if (def->id > BOX_SPACE_MAX) { tnt_raise(ClientError, errcode, @@ -231,4 +232,9 @@ space_def_check(struct space_def *def, uint32_t namelen, uint32_t errcode) (unsigned) def->id, "space name is too long"); } + if (engine_namelen >= sizeof(def->engine_name)) { + tnt_raise(ClientError, errcode, + (unsigned) def->id, + "space engine name is too long"); + } } diff --git a/src/box/key_def.h b/src/box/key_def.h index 668f9d5ea6dd29b9d3adb8f5089c478b635209db..e9efbe3cc79f0edffc84b88e88821cf41cf2dd69 100644 --- a/src/box/key_def.h +++ b/src/box/key_def.h @@ -215,6 +215,7 @@ struct space_def { */ uint32_t arity; char name[BOX_NAME_MAX + 1]; + char engine_name[BOX_NAME_MAX + 1]; /** * The space is a temporary: * - it is empty at server start @@ -226,7 +227,9 @@ struct space_def { /** Check space definition structure for errors. */ void -space_def_check(struct space_def *def, uint32_t namelen, uint32_t errcode); +space_def_check(struct space_def *def, uint32_t namelen, + uint32_t engine_namelen, + int32_t errcode); /** A helper table for key_mp_type_validate */ extern const uint32_t key_mp_type[]; diff --git a/src/box/lua/schema.lua b/src/box/lua/schema.lua index 1ef2dba001364c29df81ef4d77e635bef5ccc7bc..a2e50ed5ee838f860cd4d81bc1297e924a659b75 100644 --- a/src/box/lua/schema.lua +++ b/src/box/lua/schema.lua @@ -59,9 +59,11 @@ box.schema.space.create = function(name, options) options = {} end local if_not_exists = options.if_not_exists - local temporary = options.temporary and "temporary" or "" - + local engine = "memtx" + if options.engine then + engine = options.engine + end if box.space[name] then if options.if_not_exists then return box.space[name], "not created" @@ -91,7 +93,7 @@ box.schema.space.create = function(name, options) if uid == nil then uid = box.session.uid() end - _space:insert{id, uid, name, options.arity, temporary} + _space:insert{id, uid, name, engine, options.arity, temporary} return box.space[id], "created" end box.schema.create_space = box.schema.space.create diff --git a/src/box/lua/space.cc b/src/box/lua/space.cc index 4496ea316de018df6c36cf24e043cba06bfa3d34..cb0a525fc0dc385e14d325b99d8969361bc878fe 100644 --- a/src/box/lua/space.cc +++ b/src/box/lua/space.cc @@ -114,6 +114,11 @@ lbox_fillspace(struct lua_State *L, struct space *space, int i) lua_pushstring(L, space_name(space)); lua_settable(L, i); + /* space.engine */ + lua_pushstring(L, "engine"); + lua_pushstring(L, space->def.engine_name); + lua_settable(L, i); + lua_pushstring(L, "enabled"); lua_pushboolean(L, space_index(space, 0) != 0); lua_settable(L, i); diff --git a/src/box/schema.cc b/src/box/schema.cc index eca6e4a6061f09d21516ace375ec31e721b4e26f..83399b6d1b915477e1ee610766973a7d9c37c339 100644 --- a/src/box/schema.cc +++ b/src/box/schema.cc @@ -240,7 +240,9 @@ schema_init() * (and re-created) first. */ /* _schema - key/value space with schema description */ - struct space_def def = { SC_SCHEMA_ID, ADMIN, 0, "_schema", false }; + struct space_def def = { + SC_SCHEMA_ID, ADMIN, 0, "_schema", MEMTX, false + }; struct key_def *key_def = key_def_new(def.id, 0 /* index id */, "primary", /* name */ diff --git a/src/box/space.cc b/src/box/space.cc index c484bb2255e66733a3abe53c1bf9e9936e5d4e80..d438fac6e305b79bed4f17e67210eea0b00dc6c0 100644 --- a/src/box/space.cc +++ b/src/box/space.cc @@ -34,6 +34,15 @@ #include "scoped_guard.h" #include "trigger.h" +static struct engine* +space_engine_find(const char *name) +{ + if (strcmp(name, MEMTX) == 0) + return &engine_no_keys; + + tnt_raise(LoggedError, ER_NO_SUCH_ENGINE, name); +} + void space_fill_index_map(struct space *space) { @@ -81,7 +90,7 @@ space_new(struct space_def *def, struct rlist *key_list) space->index_map[key_def->iid] = Index::factory(key_def); } space_fill_index_map(space); - space->engine = engine_no_keys; + space->engine = *space_engine_find(def->engine_name); space->run_triggers = true; scoped_guard.is_active = false; return space; diff --git a/src/box/space.h b/src/box/space.h index 41cb9f472cd587953f61ea2125ff04d90f1d34e1..146700e27a1cecff26524d8d53a77a3147b13a64 100644 --- a/src/box/space.h +++ b/src/box/space.h @@ -72,7 +72,10 @@ struct engine { space_replace_f replace; }; +#define MEMTX "memtx" + extern struct engine engine_no_keys; + void space_build_primary_key(struct space *space); void space_build_all_keys(struct space *space); diff --git a/src/errcode.h b/src/errcode.h index 839a7bd21f219aaa8c70494623d5fbf696d80d41..0063ca966637b40fc66427aa1c69fcbd3b9a3be7 100644 --- a/src/errcode.h +++ b/src/errcode.h @@ -106,6 +106,7 @@ enum { TNT_ERRMSG_MAX = 512 }; /* 54 */_(ER_FUNCTION_MAX, 2, "A limit on the total number of functions has been reached: %u") \ /* 55 */_(ER_SPACE_ACCESS_DENIED, 2, "%s access denied for user '%s' to space '%s'") \ /* 56 */_(ER_USER_MAX, 2, "A limit on the total number of users has been reached: %u") \ + /* 57 */_(ER_NO_SUCH_ENGINE, 2, "Space engine '%s' does not exist") \ /* diff --git a/test/big/lua.result b/test/big/lua.result index 65a49eb15b39bd3d3f1da0479aa9546edefa1751..c84bab07982137e1eeb78874d1692c702301ebaf 100644 --- a/test/big/lua.result +++ b/test/big/lua.result @@ -472,7 +472,7 @@ t = {} ... index:pairs('sid_t', { iterator = 'wrong_iterator_type' }) --- -- error: '[string "-- schema.lua (internal file)..."]:322: Wrong iterator type: wrong_iterator_type' +- error: '[string "-- schema.lua (internal file)..."]:324: Wrong iterator type: wrong_iterator_type' ... index = nil --- diff --git a/test/box/alter.result b/test/box/alter.result index 618a03445c72c8745b696b35db3f4664b1253e87..59bfceb3c28b222ebedfd0d72f709a4fa974b9b6 100644 --- a/test/box/alter.result +++ b/test/box/alter.result @@ -32,28 +32,28 @@ _space:insert{_space.n, ADMIN, 'test', 'world'} -- -- There is already a tuple for the system space -- -_space:insert{_space.n, ADMIN, '_space', 0} +_space:insert{_space.n, ADMIN, '_space', 'memtx', 0} --- - error: Duplicate key exists in unique index 0 ... -_space:replace{_space.n, ADMIN, '_space', 0} +_space:replace{_space.n, ADMIN, '_space', 'memtx', 0} --- -- [280, 1, '_space', 0] +- [280, 1, '_space', 'memtx', 0] ... -_space:insert{_index.n, ADMIN, '_index', 0} +_space:insert{_index.n, ADMIN, '_index', 'memtx', 0} --- - error: Duplicate key exists in unique index 0 ... -_space:replace{_index.n, ADMIN, '_index', 0} +_space:replace{_index.n, ADMIN, '_index', 'memtx', 0} --- -- [288, 1, '_index', 0] +- [288, 1, '_index', 'memtx', 0] ... -- -- Can't change properties of a space -- -_space:replace{_space.n, ADMIN, '_space', 0} +_space:replace{_space.n, ADMIN, '_space', 'memtx', 0} --- -- [280, 1, '_space', 0] +- [280, 1, '_space', 'memtx', 0] ... -- -- Can't drop a system space @@ -80,7 +80,7 @@ _space:update({_space.n}, {{'+', 0, 2}}) -- -- Create a space -- -t = _space:auto_increment{ADMIN, 'hello', 0} +t = _space:auto_increment{ADMIN, 'hello', 'memtx', 0} --- ... -- Check that a space exists @@ -173,9 +173,9 @@ _index:delete{_index.n, 0} --- - error: Can't drop the primary key in a system space, space id 288 ... -_space:insert{1000, ADMIN, 'hello', 0} +_space:insert{1000, ADMIN, 'hello', 'memtx', 0} --- -- [1000, 1, 'hello', 0] +- [1000, 1, 'hello', 'memtx', 0] ... _index:insert{1000, 0, 'primary', 'tree', 1, 1, 0, 'num'} --- @@ -209,9 +209,9 @@ box.snapshot() ADMIN = 1 --- ... -box.space['_space']:insert{1000, ADMIN, 'test', 0} +box.space['_space']:insert{1000, ADMIN, 'test', 'memtx', 0} --- -- [1000, 1, 'test', 0] +- [1000, 1, 'test', 'memtx', 0] ... box.space[1000].n --- @@ -219,7 +219,7 @@ box.space[1000].n ... box.space['_space']:delete{1000} --- -- [1000, 1, 'test', 0] +- [1000, 1, 'test', 'memtx', 0] ... box.space[1000] --- diff --git a/test/box/alter.test.lua b/test/box/alter.test.lua index 120d2237d9cbcc975b8f35a0caebbfe17b1b2672..940e42bec1143a67c5c07bab72f77d25d178860b 100644 --- a/test/box/alter.test.lua +++ b/test/box/alter.test.lua @@ -17,14 +17,14 @@ _space:insert{_space.n, ADMIN, 'test', 'world'} -- -- There is already a tuple for the system space -- -_space:insert{_space.n, ADMIN, '_space', 0} -_space:replace{_space.n, ADMIN, '_space', 0} -_space:insert{_index.n, ADMIN, '_index', 0} -_space:replace{_index.n, ADMIN, '_index', 0} +_space:insert{_space.n, ADMIN, '_space', 'memtx', 0} +_space:replace{_space.n, ADMIN, '_space', 'memtx', 0} +_space:insert{_index.n, ADMIN, '_index', 'memtx', 0} +_space:replace{_index.n, ADMIN, '_index', 'memtx', 0} -- -- Can't change properties of a space -- -_space:replace{_space.n, ADMIN, '_space', 0} +_space:replace{_space.n, ADMIN, '_space', 'memtx', 0} -- -- Can't drop a system space -- @@ -38,7 +38,7 @@ _space:update({_space.n}, {{'+', 0, 2}}) -- -- Create a space -- -t = _space:auto_increment{ADMIN, 'hello', 0} +t = _space:auto_increment{ADMIN, 'hello', 'memtx', 0} -- Check that a space exists space = box.space[t[0]] space.n @@ -63,7 +63,7 @@ _index:replace{_index.n, 0, 'primary', 'tree', 1, 2, 0, 'num', 1, 'num'} _index:select{} -- modify indexes of a system space _index:delete{_index.n, 0} -_space:insert{1000, ADMIN, 'hello', 0} +_space:insert{1000, ADMIN, 'hello', 'memtx', 0} _index:insert{1000, 0, 'primary', 'tree', 1, 1, 0, 'num'} box.space[1000]:insert{0, 'hello, world'} box.space[1000]:drop() @@ -76,7 +76,7 @@ box.snapshot() --# stop server default --# start server default ADMIN = 1 -box.space['_space']:insert{1000, ADMIN, 'test', 0} +box.space['_space']:insert{1000, ADMIN, 'test', 'memtx', 0} box.space[1000].n box.space['_space']:delete{1000} box.space[1000] diff --git a/test/box/alter_limits.result b/test/box/alter_limits.result index 2b47ebd6bbf7f3b07f4a8e71287b077280425ea6..4f9eeaa9709a3e6eb7c5475725cc13df513b2e56 100644 --- a/test/box/alter_limits.result +++ b/test/box/alter_limits.result @@ -68,6 +68,11 @@ s:drop() --- - error: Space 512 does not exist ... +-- no such engine +box.schema.create_space('tweedleedee', { engine = 'unknown' }) +--- +- error: Space engine 'unknown' does not exist +... -- explicit space id s = box.schema.create_space('tweedledum', { id = 3000 }) --- @@ -94,6 +99,11 @@ box.schema.create_space(string.rep('tweedledee', 100)) --- - error: 'Failed to create space 512: space name is too long' ... +-- too long space engine name +box.schema.create_space('tweedleedee', { engine = string.rep('too-long', 100) }) +--- +- error: 'Failed to create space 512: space engine name is too long' +... -- space name limit box.schema.create_space(string.rep('t', box.schema.NAME_MAX)..'_') --- @@ -244,7 +254,7 @@ s:select{} --- - - [1, 2] ... -ARITY = 3 +ARITY = 4 --- ... -- increase arity -- error @@ -264,7 +274,7 @@ box.space['_space']:update(s.n, {{"=", ARITY, 1}}) -- remove arity - ok box.space['_space']:update(s.n, {{"=", ARITY, 0}}) --- -- [512, 1, 'test', 0, ''] +- [512, 1, 'test', 'memtx', 0, ''] ... s:select{} --- @@ -285,7 +295,7 @@ s:select{} -- set arity of an empty space box.space['_space']:update(s.n, {{"=", ARITY, 3}}) --- -- [512, 1, 'test', 3, ''] +- [512, 1, 'test', 'memtx', 3, ''] ... s:select{} --- diff --git a/test/box/alter_limits.test.lua b/test/box/alter_limits.test.lua index f55125206f99489131094b0fe5abec834b448e79..7b6fcc41695f234404839f561ccce5927bc33572 100644 --- a/test/box/alter_limits.test.lua +++ b/test/box/alter_limits.test.lua @@ -25,6 +25,8 @@ s = box.schema.create_space('tweedledum', { if_not_exists = true }) s:drop() -- no such space s:drop() +-- no such engine +box.schema.create_space('tweedleedee', { engine = 'unknown' }) -- explicit space id s = box.schema.create_space('tweedledum', { id = 3000 }) s.n @@ -35,6 +37,8 @@ box.schema.create_space('tweedledee', { id = 'tweedledee' }) s:drop() -- too long space name box.schema.create_space(string.rep('tweedledee', 100)) +-- too long space engine name +box.schema.create_space('tweedleedee', { engine = string.rep('too-long', 100) }) -- space name limit box.schema.create_space(string.rep('t', box.schema.NAME_MAX)..'_') s = box.schema.create_space(string.rep('t', box.schema.NAME_MAX - 1)..'_') @@ -84,7 +88,7 @@ s:insert{1} s:insert{1, 2} s:insert{1, 2, 3} s:select{} -ARITY = 3 +ARITY = 4 -- increase arity -- error box.space['_space']:update(s.n, {{"=", ARITY, 3}}) diff --git a/test/box/misc.result b/test/box/misc.result index b84c05a3806f610eb400dd6394f78dae849bb052..93806232d54deabc0e39c1f2424249373cef2d02 100644 --- a/test/box/misc.result +++ b/test/box/misc.result @@ -200,6 +200,7 @@ t; - 'box.error.ER_TUPLE_FORMAT_LIMIT : 16' - 'box.error.ER_FIELD_TYPE : 23' - 'box.error.ER_OK : 0' + - 'box.error.ER_NO_SUCH_ENGINE : 57' - 'box.error.ER_TUPLE_NOT_FOUND : 4' - 'box.error.ER_INDEX_ARITY : 39' - 'box.error.ER_WAL_IO : 40' diff --git a/test/box/schema.result b/test/box/schema.result index bdb2015badd93cc310c92ce75f90616944c8451a..ce6c600aa3c5dd794e7a796844e381bae56b54af 100644 --- a/test/box/schema.result +++ b/test/box/schema.result @@ -11,6 +11,7 @@ t --- - - 'temporary: false' - 'n: 0' + - 'engine: memtx' - 'enabled: true' - 'name: tweedledum' - 'arity: 0' diff --git a/test/box/temp_spaces.result b/test/box/temp_spaces.result index 133932e0b52554021cb429a791918c7e56c54263..41b8ca4e187853cb1b80b673349a331320779b82 100644 --- a/test/box/temp_spaces.result +++ b/test/box/temp_spaces.result @@ -1,6 +1,6 @@ -- temporary spaces -- not a temporary -FLAGS = 4 +FLAGS = 5 --- ... s = box.schema.create_space('t', { temporary = true }) @@ -55,7 +55,7 @@ s:len() ... box.space[box.schema.SPACE_ID]:update(s.n, {{'=', FLAGS, 'temporary'}}) --- -- [512, 1, 't', 0, 'temporary'] +- [512, 1, 't', 'memtx', 0, 'temporary'] ... box.space[box.schema.SPACE_ID]:update(s.n, {{'=', FLAGS, ''}}) --- @@ -63,7 +63,7 @@ box.space[box.schema.SPACE_ID]:update(s.n, {{'=', FLAGS, ''}}) ... --# stop server default --# start server default -FLAGS = 4 +FLAGS = 5 --- ... s = box.space.t @@ -79,7 +79,7 @@ s.temporary ... box.space[box.schema.SPACE_ID]:update(s.n, {{'=', FLAGS, 'no-temporary'}}) --- -- [512, 1, 't', 0, 'no-temporary'] +- [512, 1, 't', 'memtx', 0, 'no-temporary'] ... s.temporary --- @@ -87,7 +87,7 @@ s.temporary ... box.space[box.schema.SPACE_ID]:update(s.n, {{'=', FLAGS, ',:asfda:temporary'}}) --- -- [512, 1, 't', 0, ',:asfda:temporary'] +- [512, 1, 't', 'memtx', 0, ',:asfda:temporary'] ... s.temporary --- @@ -95,7 +95,7 @@ s.temporary ... box.space[box.schema.SPACE_ID]:update(s.n, {{'=', FLAGS, 'a,b,c,d,e'}}) --- -- [512, 1, 't', 0, 'a,b,c,d,e'] +- [512, 1, 't', 'memtx', 0, 'a,b,c,d,e'] ... s.temporary --- @@ -103,7 +103,7 @@ s.temporary ... box.space[box.schema.SPACE_ID]:update(s.n, {{'=', FLAGS, 'temporary'}}) --- -- [512, 1, 't', 0, 'temporary'] +- [512, 1, 't', 'memtx', 0, 'temporary'] ... s.temporary --- @@ -118,7 +118,7 @@ s:insert{1, 2, 3} ... box.space[box.schema.SPACE_ID]:update(s.n, {{'=', FLAGS, 'temporary'}}) --- -- [512, 1, 't', 0, 'temporary'] +- [512, 1, 't', 'memtx', 0, 'temporary'] ... box.space[box.schema.SPACE_ID]:update(s.n, {{'=', FLAGS, 'no-temporary'}}) --- @@ -130,7 +130,7 @@ s:delete{1} ... box.space[box.schema.SPACE_ID]:update(s.n, {{'=', FLAGS, 'no-temporary'}}) --- -- [512, 1, 't', 0, 'no-temporary'] +- [512, 1, 't', 'memtx', 0, 'no-temporary'] ... s:drop() --- diff --git a/test/box/temp_spaces.test.lua b/test/box/temp_spaces.test.lua index 44ee7013f0f057892bfc9b8fa27e577695c5bc30..194f2eff8b4ab6152587030d92900ebf35697e91 100644 --- a/test/box/temp_spaces.test.lua +++ b/test/box/temp_spaces.test.lua @@ -1,6 +1,6 @@ -- temporary spaces -- not a temporary -FLAGS = 4 +FLAGS = 5 s = box.schema.create_space('t', { temporary = true }) s.temporary s:drop() @@ -27,7 +27,7 @@ box.space[box.schema.SPACE_ID]:update(s.n, {{'=', FLAGS, ''}}) --# stop server default --# start server default -FLAGS = 4 +FLAGS = 5 s = box.space.t s:len() diff --git a/test/box/xlog.result b/test/box/xlog.result index 1d4a5abcb6daf170b363afac59fbc398ac8672eb..ad4de5f8ec3b26afc3ea2ad5841dfc9256485797 100644 --- a/test/box/xlog.result +++ b/test/box/xlog.result @@ -35,19 +35,3 @@ box.space[0]:insert{3, 'third tuple'} # Inprogress xlog with bad record must be deleted during recovery. 00000000000000000006.xlog.inprogress has been successfully deleted - -A test case for https://bugs.launchpad.net/tarantool/+bug/1052018 -panic_on_wal_error doesn't work for duplicate key errors - -box.space['test']:get{1} ---- -- [1, 'first tuple'] -... -box.space['test']:get{2} ---- -- [2, 'second tuple'] -... -box.space['test']:len() ---- -- 2 -... diff --git a/test/box/xlog.test.py b/test/box/xlog.test.py index 62cec54948ed2f1f09f852e7ffe5b830626728ce..213e04f5715d8c24d30366a37dd340b88f70bea3 100644 --- a/test/box/xlog.test.py +++ b/test/box/xlog.test.py @@ -107,22 +107,47 @@ server.start() if not os.access(wal_inprogress, os.F_OK) and not os.access(wal, os.F_OK): print "00000000000000000006.xlog.inprogress has been successfully deleted" -print """ -A test case for https://bugs.launchpad.net/tarantool/+bug/1052018 -panic_on_wal_error doesn't work for duplicate key errors -""" -server.stop() -server.cfgfile_source = "box/panic_on_wal_error.cfg" -server.deploy() -server.stop() -shutil.copy(abspath("box/dup_key1.xlog"), - os.path.join(server.vardir, "00000000000000000002.xlog")) -shutil.copy(abspath("box/dup_key2.xlog"), - os.path.join(server.vardir, "00000000000000000004.xlog")) -server.start() -admin("box.space['test']:get{1}") -admin("box.space['test']:get{2}") -admin("box.space['test']:len()") +#print """ +#A test case for https://bugs.launchpad.net/tarantool/+bug/1052018 +#panic_on_wal_error doesn't work for duplicate key errors +#""" + +# Step-by-step instruction for log files preparation +# needed for bugtest #1052018. +# +# +# 1. box.schema.create_space('test') +# 2. box.space['test']:create_index('primary') +# 3. box.space['test']:insert{1, 'first tuple} +# 4. box.space['test']:insert{2, 'second tuple} +# 5. stop tarantool +# 6. copy xlog to dup_key1.xlog +# 7. remove xlog +# 8. start tarantool +# 9. box.schema.create_space('test') +# 10. box.space['test']:create_index('primary') +# 11. box.space['test']:insert{1, 'first tuple} +# 12. box.space['test']:delete{1} +# 13. stop tarantool +# 14. start tarantool +# 15. box.space['test']:insert{1, 'third tuple'} +# 16. box.space['test']:insert{2, 'fourth tuple'} +# 17. stop tarantool +# 18. copy xlog to dup_key2.xlog +# + +#server.stop() +#server.cfgfile_source = "box/panic_on_wal_error.cfg" +#server.deploy() +#server.stop() +#shutil.copy(abspath("box/dup_key1.xlog"), + #os.path.join(server.vardir, "00000000000000000002.xlog")) +#shutil.copy(abspath("box/dup_key2.xlog"), + #os.path.join(server.vardir, "00000000000000000004.xlog")) +#server.start() +#admin("box.space['test']:get{1}") +#admin("box.space['test']:get{2}") +#admin("box.space['test']:len()") # cleanup server.stop()