From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from localhost (localhost [127.0.0.1]) by turing.freelists.org (Avenir Technologies Mail Multiplex) with ESMTP id 6F0F22AB1B for ; Fri, 22 Mar 2019 08:06:16 -0400 (EDT) Received: from turing.freelists.org ([127.0.0.1]) by localhost (turing.freelists.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id vKhaTPnohnqx for ; Fri, 22 Mar 2019 08:06:16 -0400 (EDT) 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 turing.freelists.org (Avenir Technologies Mail Multiplex) with ESMTPS id EB38D2AA2C for ; Fri, 22 Mar 2019 08:06:15 -0400 (EDT) From: Georgy Kirichenko Subject: [tarantool-patches] [PATCH v3 1/5] Abort vinyl index creation in case of truncation rollback Date: Fri, 22 Mar 2019 15:06:06 +0300 Message-Id: <6781097cb02acfa6b5cdc102fafa7045a1682e05.1553255718.git.georgy@tarantool.org> In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: tarantool-patches-bounce@freelists.org Errors-to: tarantool-patches-bounce@freelists.org Reply-To: tarantool-patches@freelists.org List-Help: List-Unsubscribe: List-software: Ecartis version 1.0.0 List-Id: tarantool-patches List-Subscribe: List-Owner: List-post: List-Archive: To: tarantool-patches@freelists.org Cc: Georgy Kirichenko Abort a new index creation if truncate couldn't be finished because of rollback or an error. Without this vinyl fails because of internal scheduler assertion. Needed for: 2798 --- src/box/alter.cc | 13 +++++++-- test/engine/errinj.result | 53 +++++++++++++++++++++++++++++++++++++ test/engine/errinj.test.lua | 15 +++++++++++ test/engine/suite.ini | 1 + 4 files changed, 80 insertions(+), 2 deletions(-) create mode 100644 test/engine/errinj.result create mode 100644 test/engine/errinj.test.lua diff --git a/src/box/alter.cc b/src/box/alter.cc index 080a72b9f..daaa9cd57 100644 --- a/src/box/alter.cc +++ b/src/box/alter.cc @@ -1310,13 +1310,16 @@ public: : AlterSpaceOp(alter), iid(iid) {} /** id of the index to truncate. */ uint32_t iid; + struct index *new_index; virtual void prepare(struct alter_space *alter); virtual void commit(struct alter_space *alter, int64_t signature); + virtual ~TruncateIndex(); }; void TruncateIndex::prepare(struct alter_space *alter) { + new_index = space_index(alter->new_space, iid); if (iid == 0) { /* * Notify the engine that the primary index @@ -1333,7 +1336,6 @@ TruncateIndex::prepare(struct alter_space *alter) * index was recreated. For example, Vinyl uses this * callback to load indexes during local recovery. */ - struct index *new_index = space_index(alter->new_space, iid); assert(new_index != NULL); space_build_index_xc(alter->new_space, new_index, alter->new_space->format); @@ -1343,10 +1345,17 @@ void TruncateIndex::commit(struct alter_space *alter, int64_t signature) { struct index *old_index = space_index(alter->old_space, iid); - struct index *new_index = space_index(alter->new_space, iid); index_commit_drop(old_index, signature); index_commit_create(new_index, signature); + new_index = NULL; +} + +TruncateIndex::~TruncateIndex() +{ + if (new_index == NULL) + return; + index_abort_create(new_index); } /** diff --git a/test/engine/errinj.result b/test/engine/errinj.result new file mode 100644 index 000000000..d244c334a --- /dev/null +++ b/test/engine/errinj.result @@ -0,0 +1,53 @@ +test_run = require('test_run') +--- +... +inspector = test_run.new() +--- +... +engine = inspector:get_cfg('engine') +--- +... +errinj = box.error.injection +--- +... +-- truncation rollback should not crash +s = box.schema.space.create('truncate_rollback', {engine = engine}) +--- +... +_ = s:create_index('pk') +--- +... +_ = s:create_index('sk', {parts = {1, 'int'}}) +--- +... +for i = 1, 10 do s:replace({i, i}) end +--- +... +errinj.set('ERRINJ_WAL_IO', true) +--- +- ok +... +s:truncate() +--- +- error: Failed to write to disk +... +errinj.set('ERRINJ_WAL_IO', false) +--- +- ok +... +s:select() +--- +- - [1, 1] + - [2, 2] + - [3, 3] + - [4, 4] + - [5, 5] + - [6, 6] + - [7, 7] + - [8, 8] + - [9, 9] + - [10, 10] +... +s:drop() +--- +... diff --git a/test/engine/errinj.test.lua b/test/engine/errinj.test.lua new file mode 100644 index 000000000..57f3a962c --- /dev/null +++ b/test/engine/errinj.test.lua @@ -0,0 +1,15 @@ +test_run = require('test_run') +inspector = test_run.new() +engine = inspector:get_cfg('engine') +errinj = box.error.injection + +-- truncation rollback should not crash +s = box.schema.space.create('truncate_rollback', {engine = engine}) +_ = s:create_index('pk') +_ = s:create_index('sk', {parts = {1, 'int'}}) +for i = 1, 10 do s:replace({i, i}) end +errinj.set('ERRINJ_WAL_IO', true) +s:truncate() +errinj.set('ERRINJ_WAL_IO', false) +s:select() +s:drop() diff --git a/test/engine/suite.ini b/test/engine/suite.ini index 3f82a1325..3db02ab6f 100644 --- a/test/engine/suite.ini +++ b/test/engine/suite.ini @@ -3,6 +3,7 @@ core = tarantool description = tarantool multiengine tests script = box.lua use_unix_sockets = True +release_disabled = errinj.test.lua config = engine.cfg #disabled = replica_join.test.lua lua_libs = conflict.lua ../box/lua/utils.lua ../box/lua/push.lua -- 2.21.0